docker
auggie

docker 安装以及 opengauss 安装

docker 安装

  1. docker 依赖环境安装

    1
    2
    3
    4
    sudo yum install -y yum-utils
    sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  2. docker 引擎安装

    1
    2
    sudo yum install docker-ce docker-ce-cli containerd.io
    yum list docker-ce --showduplicates | sort -r
  3. 启动 docker

    1
    sudo systemctl start docker
  4. docker 换源 阿里云

    1
    2
    3
    4
    5
    6
    7
    8
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://2e1o9u0t.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

opengauss 安装

  1. 安装 opengauss 镜像

    1
    docker pull enmotech/opengauss
  2. 启动镜像

    1
    docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Secretpassword@123 -p 8181:5432 enmotech/opengauss
  3. 查看是否启动

    1
    docker ps
  4. 开放安全组

    在华为云安全组将 8181 端口开放,外部即可连接。

  5. 连接,选择 postgre 数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker exec -it opengauss sh

    # 切换到 omm 用户
    su - omm

    # 登陆数据库
    gsql

    # 创建用户,然后就可以用连接了,密码好像有强度要求。
    CREATE USER auggie CREATEROLE PASSWORD '3263265Rjc';

    # 查看所有用户
    SELECT * FROM pg_user;

Docker 常用命令

帮助信息

1
docker 命令 --help

镜像命令

1
2
3
4
5
6
7
docker images # 查看镜像

docker search [] # 搜索镜像

docker pull repo:[tag] # 下载镜像

docker rmi -f [image ID | image name]

容器命令

有了镜像才可以创建容器

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
docker run [option] image

--name="Name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行
-p 指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 随机指定端口
-e 配置环境
1
2
[root@auggie ~]# docker run -it centos
[root@7eb2206cb300 /]# exit

列出运行的容器

1
2
3
4
5
docker ps [option]

-a 列出所有
-q 只列出编号
-n=? 查看最近运行

退出容器

1
2
exit			关闭退出
ctrl + p + q 不关闭退出

删除容器

1
2
3
4
5
docker rm [-f] 容器ID

# 删除全部
docker rm -f $(docker ps -q)
docker ps -q | xargs docker rm

启动和停止容器

1
2
3
4
docker start id		启动
docker restart id 重启
docker stop id 停止容器
docker kill id 强制停止

其他命令

后台启动 docker

通过 -d 后台启动

1
2
3
4
5
[root@auggie ~]# docker run -d centos /bin/sh -c "while true;do echo hello;sleep 1;done"
9819e426f325dac27c1180ea6239a637e059a3d9fe549d072e8be66a5d30d389
[root@auggie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9819e426f325 centos "/bin/sh -c 'while t…" About a minute ago Up About a minute objective_zhukovsky

查看日志

1
2
3
4
5
docker logs -ft --tail n ID

-f 持续
-t 显示时间戳
--tail tail

查看 docker 内部的进程信息

1
docker top ID

查看容器元信息

1
docker inspect ID

进入当前正在进行的容器

1
2
3
4
5
6
7
# 进入后台方式运行的容器

# 新建终端
docker exec -it ID /bin/bash

# 进入当前终端
docker attach ID

从容器内拷贝文件到主机

1
2
3
docker cp ID:src dest

# 也可以通过卷来实现

可视化

portainer 是一个图形化界面管理工具

1
2
docker run -d -p 8181:9000\
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Docker 镜像

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件

如何获得镜像:

  • 远程仓库下载
  • 自己制作

镜像加载原理

UnionFS(联合文件系统)

docker 下载时分层

Docker 镜像加载原理

  • bootfs(boot file system)
  • rootfs(root file system)

为什么 docker 中的 centos 很小?

对于一个精简的 OS,rootfs 可以很小。对于不同的 linux 发行版本,bootfs 基本一致,rootfs 会有差别。

commit 镜像

用于生成新镜像,相当于快照。

1
2
3
4
5
docker commit 

docker commit -m="msg" -a="author" ID dest:[tag]

[root@iZuf694tmueqwc1qv0nwwdZ ~]# docker commit -m="add webapps" -a="auggie" bd01ec9750b6 tomcat01:1.0

简单总结 docker 的一些命令:

  • 镜像
    • docker images
    • docker search
    • docker pull
    • docker rmi
  • 容器
    • docker run
    • docker ps
    • docker inspect ID
    • docker top ID
    • docker logs -ft –tial n ID
    • exit && ctrl + p + q
    • docker stop / kill / start / restart
  • 容器 -> 镜像
    • docker commit -m=”” -a=”” ID img:[tag]

容器数据卷(数据持久化,双向绑定

问题:如果容器删除,数据就会丢失!

需求:数据持久化

使用数据卷

  1. 使用命令挂载
1
2
3
docker run -it -v 主机目录:容器内目录 

[root@iZuf694tmueqwc1qv0nwwdZ ~]# docker run -it -v /home/test:/home centos
1
2
3
4
5
6
7
8
9
10
11
# docker inspect ID
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

挂载 mysql

1
docker run -v dest:src --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql

具名和匿名挂载

通过 docker volume ls 可以查看挂载,使用 docker volume inspect Name 可以查看挂载位置

  1. 匿名挂载

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@iZuf694tmueqwc1qv0nwwdZ test]# docker run -d --name nginx03 -v /etc/nginx nginx
    00faee8254a84238b2f464e84b1501198276420cac82ffc2c62fbfd32a103b08

    "Mounts": [
    {
    "Type": "volume",
    "Name": "675fde039bc4823c18c279a40099e656cda5f351d18ae1410df561ee07bd591e",
    "Source": "/var/lib/docker/volumes/675fde039bc4823c18c279a40099e656cda5f351d18ae1410df561ee07bd591e/_data",
    "Destination": "/etc/nginx",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
    }
    ],
  2. 具名挂载

    含有名字的挂载

  1. DockerFile

Dockerfile 用来构建 docker 镜像的构建文件

  1. 编写 dockerfile

    1
    2
    3
    4
    5
    6
    7
    FROM centos

    # 匿名挂载
    VOLUME ["volume01", "volume02"]

    CMD echo "---end---"
    CMD /bin/bash
  2. 生成镜像

    1
    2
    docker build -f ./dockerfile1 -t auggie/centos .

创建的两个容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"Mounts": [
{
"Type": "volume",
"Name": "e77305721d3246561557da99c7adcfbfdbe25591746ce688bc38c60df2840a8d",
"Source": "/var/lib/docker/volumes/e77305721d3246561557da99c7adcfbfdbe25591746ce688bc38c60df2840a8d/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "97203bca5396ef84cc8ed6ae0cce96d019dc2deb5dceae54c2e16fc167f8ea02",
"Source": "/var/lib/docker/volumes/97203bca5396ef84cc8ed6ae0cce96d019dc2deb5dceae54c2e16fc167f8ea02/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

Dockerfile

dockerfile 用于构建一个 docker 镜像

构建过程:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 将镜像生成容器

dockerfile 的构建过程

基础知识:

  1. 每一个 keyword 都是大写字母
  2. 从上到下构建
  3. 每一个指令都会创建提交一个新的镜像层,并提交

dockerfile :用于构建 docker images

docker images 是通过 dockerfile 构建生成的镜像,最终发布和运行的产品

docker container 是通过 docker image 构建的容器

dockerfile 的指令

  • FROM

    • 这个镜像的妈妈是谁
    • 指定基础镜像
  • WORKDIR [dir]

    • 工作的根目录
  • MAINTAINER

    • 指定维护者的信息
  • RUN

    • 构建镜像的时候,需要运行的命令
  • ADD

    • 添加文件,例如部署 tomcat,则要添加 tomcat 的压缩包
  • COPY

    • 类似 ADD,将文件拷贝到镜像中
  • WORKDIR

    • 镜像的工作目录
  • VOLUME

    • 挂在卷
  • EXPOSE

    • 暴露端口
  • CMD

    • 指定这个容器启动的时候,需要运行的命令;只有最后一条会生效
  • ENTRYPOINT

    • 指定这个容器启动的时候,需要运行的命令;可以追加
  • ENV

    • 设置环境变量,用于设置 mysql 的密码

发布镜像

  1. 登陆 docker login -u$user -p$pass
1
2
3
4
5
6
7
8
9
docker login -u

[root@iZuf694tmueqwc1qv0nwwdZ docker_programs]# docker login -uaugg1e
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 发布 dcoker push username/name:[tag]
    1. 镜像需要以 username/repo 的格式命名

发布 springboot 项目

  1. 向 springboot 项目打包 .jar

  2. 编写 Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 在 jdk11 上面构建
    FROM openjdk:11

    # 指定工作目录
    WORKDIR /auggie

    # 将 .jar 文件拷贝到容器中
    COPY docker-0.0.1-SNAPSHOT.jar app.jar

    # 指定环境变量
    ENV JAVA_HOME /usr/local/java

    # 暴露容器端口,但是需要在 run 的时候,使用 -p 绑定主机端口
    EXPOSE 8080

    # 在 build 容器的时候执行
    # Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
    RUN echo "hello world" \
    $$ find .

    # 执行命令,在 docker 容器 run 的时候 运行
    CMD ["echo", "hello docker"]

    # 执行命令,类似于 CMD,但是启动容器的时候,可以指定 --entrypoint 覆盖
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  3. 将 jar 包和 Dockerfile 发送到服务器

  4. docker build -t "name" . 构建镜像

  5. docker run name -p 8080:8080 生成容器

Docker 网络