Bootstrap

【docker 总结】第六篇 - DockerCompose

一,compose 简介

compose 译为:组合,它可以将多个容器组合到一起;

比如:制做一个网站,会包含若干服务,数据库 mysql,MongoDB,redis,nginx,java 等;

这些服务虽然也可以装到一个容器中,但是一般并不会这样做;

因为,如果两个服务都用到了 jdk,但版本不一致,放到一起就会引发冲突,导致问题;

所以,需要每个服务对应一个镜像,每个服务都是一个独立的容器;这样就至少需要 3 个容器;

但是,这些服务应该是一个整体:

先启动数据库,再启动 web 容器,再启动 nginx,

在客户端机型访问,他们是相互协作,启动时是有顺序的,

所以,希望能够将他们作为一个整体,一起按照顺序进行启动和关闭操作;

如何能够实现这种编排?这就需要使用到 docker-compose;

二,编排

编排是什么,为什么需要编排?

一个复杂的系统,是需要进行规划的,比如:

1,考虑选择哪些镜像和容器;

2,按照合适的顺序启动这些容器;

3,管理容器中的服务器;

4,如果服务器宕机了,需要复杂重启;

5,如果服务器负载太大,需要动态扩容;

6,如果程序更新了,还要动态升级镜像和容器和服务;

这样,可以将代码打包到镜像中,然后再启动;

如果源代码发生改变,比如添加了新的功能,那么就需要重新打包镜像;

所以,这种操作最好需要工具辅助完成,比如:docker-compose、K8S;

三,compose

  • Compose 通过一个配置文件来管理多个Docker容器

  • 在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动、停止和重启应用和应用中的服务以及所有依赖服务的容器

  • 步骤:

  • 最后,运行docker-compose up,Compose 将启动并运行整个应用程序 配置文件组成

  • services 可以定义需要的服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷所属的网络和依赖的其它服务

  • networks 是应用的网络,在它下面可以定义使用的网络名称,类性

  • volumes 是数据卷,可以在此定义数据卷,然后挂载到不同的服务上面使用

安装 compose

mac 安装包中已经自带,无需安装

centos 需要安装:

yum -y install epel-release
yum -y install python-pip
yum clean all
pip install docker-compose

编写 docker-compose.yml

  • 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行

  • 空格缩进表示层次

  • 冒号空格后面有空格

version: '2'					
services:
  nginx1:
    image: nginx
    ports:
      - "8080:80"
  nginx2:
    image: nginx
    ports:
      - "8081:80"

version 必须是字符串

BravedeMacBook-Pro:~ brave$ mkdir docker_nginx
BravedeMacBook-Pro:~ brave$ cd docker_nginx/
BravedeMacBook-Pro:docker_nginx brave$ vi docker-compose.yml
BravedeMacBook-Pro:docker_nginx brave$ docker-compose up
[+] Running 3/3
 ⠿ Network docker_nginx_default     Created                                    0.1s
 ⠿ Container docker_nginx_nginx1_1  Creat...                                   0.2s
 ⠿ Container docker_nginx_nginx2_1  Creat...                                   0.2s
Attaching to nginx1_1, nginx2_1

访问 nginx 服务

问题:控制台会卡住,一旦退出服务就会停止,不能继续访问

^CGracefully stopping... (press Ctrl+C again to force)
[+] Running 2/2
 ⠿ Container docker_nginx_nginx1_1  Stopped                                         0.3s
 ⠿ Container docker_nginx_nginx2_1  Stopped                                         6.4s
canceled

可以在后台启动服务:

BravedeMacBook-Pro:docker_nginx brave$ docker-compose up -d
[+] Running 2/2
 ⠿ Container docker_nginx_nginx2_1  Started                                         0.8s
 ⠿ Container docker_nginx_nginx1_1  Started

打印当前容器

BravedeMacBook-Pro:docker_nginx brave$ docker-compose ps
NAME                    COMMAND                  SERVICE             STATUS              PORTS
docker_nginx_nginx1_1   "/docker-entrypoint.…"   nginx1              running             0.0.0.0:8081->80/tcp
docker_nginx_nginx2_1   "/docker-entrypoint.…"   nginx2              running             0.0.0.0:8082->80/tcp

停止服务

BravedeMacBook-Pro:docker_nginx brave$ docker-compose stop
[+] Running 2/2
 ⠿ Container docker_nginx_nginx2_1  Stopped                                         0.2s
 ⠿ Container docker_nginx_nginx1_1  Stopped                                         0.3s

 BravedeMacBook-Pro:docker_nginx brave$ docker-compose ps
NAME                    COMMAND                  SERVICE             STATUS              PORTS
docker_nginx_nginx1_1   "/docker-entrypoint.…"   nginx1              exited (0)          
docker_nginx_nginx2_1   "/docker-entrypoint.…"   nginx2              exited (0)          

启动服务

BravedeMacBook-Pro:docker_nginx brave$ docker-compose start
[+] Running 2/2
 ⠿ Container docker_nginx_nginx2_1  Started                                         0.6s
 ⠿ Container docker_nginx_nginx1_1  Started                                         0.6s
 
 BravedeMacBook-Pro:docker_nginx brave$ docker-compose ps
NAME                    COMMAND                  SERVICE             STATUS              PORTS
docker_nginx_nginx1_1   "/docker-entrypoint.…"   nginx1              running             0.0.0.0:8081->80/tcp
docker_nginx_nginx2_1   "/docker-entrypoint.…"   nginx2              running             0.0.0.0:8082->80/tcp

看日志:

docker-compose logs -f

logs 查看日志

-f 跟踪日志变化 访问服务时,日志动态刷新

BravedeMacBook-Pro:docker_nginx brave$ docker-compose logs -f
nginx2_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx2_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx2_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx2_1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx2_1  | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx2_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx2_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx2_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: using the "epoll" event method
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: nginx/1.21.4
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: OS: Linux 5.10.76-linuxkit
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker processes
nginx1_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 31
nginx1_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx1_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx2_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 32
nginx1_1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx1_1  | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx1_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx1_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx1_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: using the "epoll" event method
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: nginx/1.21.4
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: OS: Linux 5.10.76-linuxkit
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker processes
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 32
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 33
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 34
nginx1_1  | 2021/12/14 06:32:55 [notice] 1#1: start worker process 35
nginx1_1  | 172.20.0.1 - - [14/Dec/2021:06:35:30 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" "-"
nginx1_1  | 2021/12/14 06:35:30 [error] 32#32: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8081", referrer: "http://localhost:8081/"
nginx1_1  | 172.20.0.1 - - [14/Dec/2021:06:35:30 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost:8081/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" "-"

进入服务

BravedeMacBook-Pro:docker_nginx brave$ docker exec -it docker_nginx_nginx1_1 bash
root@d482a80a53a6:/# 

排除干扰:

1,停掉并删除所有容器

docker-compose down 停掉并删除所有容器和compose所创建的网络

BravedeMacBook-Pro:docker_nginx brave$ docker-compose down
[+] Running 3/2
 ⠿ Container docker_nginx_nginx2_1  Removed                                                                                                           0.3s
 ⠿ Container docker_nginx_nginx1_1  Removed                                                                                                           0.3s
 ⠿ Network docker_nginx_default     Removed    

每当通过compose启动一堆服务时,默认会创建一个网络

docker container stop `docker container ps -a -q`

stop 停掉容器

BravedeMacBook-Pro:docker_nginx brave$ docker container stop `docker container ps -a -q`
3fdb2c773583
05a69d0bbfa1
44aa617a6054
0ebe1b6be49b
706198092f9b
980e9f285e93
6c9ac8a83da8
553463de14b7
dccd4593629f
2934844233f7
c6cb1d0358ff
180a56dc2015
BravedeMacBook-Pro:docker_nginx brave$ docker container rm `docker container ps -a -q`
3fdb2c773583
05a69d0bbfa1
44aa617a6054
0ebe1b6be49b
706198092f9b
980e9f285e93
6c9ac8a83da8
553463de14b7
dccd4593629f
2934844233f7
c6cb1d0358ff
180a56dc2015

这时,容器就都没了

BravedeMacBook-Pro:docker_nginx brave$ docker container ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

重新启动

BravedeMacBook-Pro:docker_nginx brave$ docker-compose up -d
[+] Running 3/3
 ⠿ Network docker_nginx_default     Created                                                                                                           0.1s
 ⠿ Container docker_nginx_nginx2_1  Started                                                                                                           0.7s
 ⠿ Container docker_nginx_nginx1_1  Started                                                                                                           0.7s

进入容器 docker_nginx_nginx1_1

因为 yaml 文件中没有指定容器的 name,所以默认生成了一个

BravedeMacBook-Pro:docker_nginx brave$ docker exec -it docker_nginx_nginx1_1 bash
root@310f6901b9bd:/# 

查看 network:

发现多了一个bridge 类型的网络: docker_nginx_default

BravedeMacBook-Pro:docker_nginx brave$ docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
0f0889985450   bridge                 bridge    local
a02b571b9ecb   dev_web                bridge    local
3abec53303cd   docker_nginx_default   bridge    local
04a72bf29d13   finance_web            bridge    local
1b1664b7d542   host                   host      local
c57ec20004cf   none                   null      local

compose 中的容器都会加入到这个网络中,和其他网络是隔离的

写一个更复杂的,先把这个 down 掉(stop 并 rm 掉)

BravedeMacBook-Pro:docker_nginx brave$ docker-compose down
[+] Running 3/2
 ⠿ Container docker_nginx_nginx2_1  Removed                                       0.6s
 ⠿ Container docker_nginx_nginx1_1  Removed                                       0.6s
 ⠿ Network docker_nginx_default     Removed                                       0.1s

直接配置数据卷

两个静态网站,一个前台用,一个后台用

BravedeMacBook-Pro:docker_nginx brave$ mkdir front
BravedeMacBook-Pro:docker_nginx brave$ mkdir backend

BravedeMacBook-Pro:docker_nginx brave$ cd front/
BravedeMacBook-Pro:front brave$ echo front > index.html

BravedeMacBook-Pro:front brave$ cd ../backend/
BravedeMacBook-Pro:backend brave$ echo backend > index.html

BravedeMacBook-Pro:backend brave$ cd ..
BravedeMacBook-Pro:docker_nginx brave$ ls
backend			docker-compose.yml	front

添加 tree 命令

Ubuntu下可执行下列命令安装

sudo apt-get install tree

MacOS 下:

首先,进入家目录

cd $home

使用 vim 命令创建一个.bashrc 文件

vim .bashrc

在里面添加如下一行代码:

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

保存退出后,使用 source .bashrc 命令更新一下脚本资源

source .bashrc

在终端下试一下 tree 命令

BravedeMacBook-Pro:~ brave$ cd docker_nginx/
BravedeMacBook-Pro:docker_nginx brave$ tree
.
|____.DS_Store
|____backend
| |____index.html
|____docker-compose.yml
|____front
| |____index.html

通过 docker 启动两个 nginx,一个映射到 front 目录,一个映射到 backend 目录;

当访问第一个容器时,8081,访问的是 front 目录下的 index.html 文件,

当访问第二个容器时,8082,访问的是 backend 目录下的 index.html 文件,

所以,这就需要将宿主机上的一个目录映射给容器中的目录

这样,修改只要在本地改就可以了,容器会到这里来读

拷贝一份目录出来

BravedeMacBook-Pro:~ brave$ cp -r docker_nginx webserver
BravedeMacBook-Pro:~ brave$ cd webserver/
BravedeMacBook-Pro:webserver brave$ ls
backend			docker-compose.yml	front

修改 docker-compose.yml

vi docker-compose.yml

添加数据卷的映射

version: '2'
services:
  nginx1:
    image: nginx
    volumes:
     - "./front:/usr/share/nginx/html"
    ports:
      - "8081:80"
  nginx2:
    image: nginx
    volumes:
     - "./backend:/usr/share/nginx/html"
    ports:
      - "8082:80"

启动 compose

BravedeMacBook-Pro:webserver brave$ docker-compose up
[+] Running 3/3
 ⠿ Network webserver_default     Created                                   0.1s
 ⠿ Container webserver_nginx1_1  Created                                   0.2s
 ⠿ Container webserver_nginx2_1  Created                                   0.2s
Attaching to nginx1_1, nginx2_1

当修改本地文件内容后,页面内容就会变化

创建并配置数据卷

先停掉 compose:

^CGracefully stopping... (press Ctrl+C again to force)
[+] Running 2/2
 ⠿ Container webserver_nginx1_1  Stopped                                   0.2s
 ⠿ Container webserver_nginx2_1  Stopped                                   8.6s
canceled

修改 docker-compose.yml 文件,添加数据卷:

BravedeMacBook-Pro:webserver brave$ vi docker-compose.yml

创建本地数据卷

version: '2'
services:
  nginx1:
    image: nginx
    volumes:
     - "data:/data"
     - "./front:/usr/share/nginx/html"
    ports:
      - "8081:80"
  nginx2:
    image: nginx
    volumes:
     - "data:/data"     // 冒号左侧不是相对路径,data 代表数据卷
     - "./backend:/usr/share/nginx/html"    // 冒号左侧可以是相对路径
    ports:
      - "8082:80"
volumes:       // 创建数据卷 data
  data:
    driver: local

后台启动 compose

BravedeMacBook-Pro:webserver brave$ docker-compose up -d
[+] Running 3/3
 ⠿ Network webserver_default     Created                                   0.1s
 ⠿ Container webserver_nginx2_1  Started                                   0.7s
 ⠿ Container webserver_nginx1_1  Started                                   0.8s

进入容器webserver_nginx2_1,在 data 目录下创建一个文件:

BravedeMacBook-Pro:webserver brave$ docker exec -it webserver_nginx2_1 bash
root@a7629261b3a5:/# cd /data/
root@a7629261b3a5:/data# ls
root@a7629261b3a5:/data# touch test.txt
root@a7629261b3a5:/data# exit
exit

再进入容器 webserver_nginx1_1,可以看到刚刚创建的文件,再创建一个文件

BravedeMacBook-Pro:webserver brave$ docker exec -it webserver_nginx1_1 bash
root@b34bfd670a93:/# cd /data/
root@b34bfd670a93:/data# ls
test.txt
root@b34bfd670a93:/data# touch test2.txt
root@b34bfd670a93:/data# exit
exit

查看宿主机的 data 目录

BravedeMacBook-Pro:webserver brave$ docker inspect webserver_nginx1_1
[
    {
        "Id": "b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624",
        "Created": "2021-12-15T03:57:33.8890169Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 18514,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-12-15T03:57:34.6195702Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:f652ca386ed135a4cbe356333e08ef0816f81b2ac8d0619af01e2b256837ed3e",
        "ResolvConfPath": "/var/lib/docker/containers/b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624/hostname",
        "HostsPath": "/var/lib/docker/containers/b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624/hosts",
        "LogPath": "/var/lib/docker/containers/b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624/b34bfd670a93ac29569afe9367485ef381ea9f8aa727af0491a87c0c19f3b624-json.log",
        "Name": "/webserver_nginx1_1",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/Users/brave/webserver/front:/usr/share/nginx/html:rw"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "webserver_default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8081"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "Dns": null,
            "DnsOptions": null,
            "DnsSearch": null,
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": null,
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "Mounts": [
                {
                    "Type": "volume",
                    "Source": "webserver_data",
                    "Target": "/data",
                    "VolumeOptions": {}
                }
            ],
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/bdcd67dc5ebc710bb8c4080f04d36ae53992bb08fa8e61c1e72a38b47d302eb4-init/diff:/var/lib/docker/overlay2/98ddd77c17fd0fd4fc6707553e32b49f8e2eba2bc9e70da3d5fca8b29b91d8ec/diff:/var/lib/docker/overlay2/3be50bc643a4970bcfa30f7e96866f443053bd785888275e1e7e3523e09b4360/diff:/var/lib/docker/overlay2/5012d011eb7dbcacff0b847f7e9c0ed198b3449bd343e7fa684896ff85aa9354/diff:/var/lib/docker/overlay2/51f10304ec3ccb9e9a87e92d04b7cd9cd1a7b4cf5ffaf44066d2efe5ab13bde1/diff:/var/lib/docker/overlay2/0cf4f1c2e2da09449d986dae65c19969eb2443a8bdedfd00a21e1a62f60fbed4/diff:/var/lib/docker/overlay2/43f4bcbd57da70e0ba27546bf82a9f3ff49be426b612d7c3a6c07753eebce40f/diff",
                "MergedDir": "/var/lib/docker/overlay2/bdcd67dc5ebc710bb8c4080f04d36ae53992bb08fa8e61c1e72a38b47d302eb4/merged",
                "UpperDir": "/var/lib/docker/overlay2/bdcd67dc5ebc710bb8c4080f04d36ae53992bb08fa8e61c1e72a38b47d302eb4/diff",
                "WorkDir": "/var/lib/docker/overlay2/bdcd67dc5ebc710bb8c4080f04d36ae53992bb08fa8e61c1e72a38b47d302eb4/work"
            },
            "Name": "overlay2"
        },
      // 数据卷 Mounts  "Source": "/var/lib/docker/volumes/webserver_data/_data"
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/brave/webserver/front",
                "Destination": "/usr/share/nginx/html",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "webserver_data",
                "Source": "/var/lib/docker/volumes/webserver_data/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "b34bfd670a93",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.4",
                "NJS_VERSION=0.7.0",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx",
            "Volumes": {
                "/data": {},
                "/usr/share/nginx/html": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "com.docker.compose.config-hash": "f512730eadababb6d69e9935a86eceed5960e0d3e11f0800b00ab834f34fe9cd",
                "com.docker.compose.container-number": "1",
                "com.docker.compose.depends_on": "",
                "com.docker.compose.image": "sha256:f652ca386ed135a4cbe356333e08ef0816f81b2ac8d0619af01e2b256837ed3e",
                "com.docker.compose.oneoff": "False",
                "com.docker.compose.project": "webserver",
                "com.docker.compose.project.config_files": "/Users/brave/webserver/docker-compose.yml",
                "com.docker.compose.project.working_dir": "/Users/brave/webserver",
                "com.docker.compose.service": "nginx1",
                "com.docker.compose.version": "2.2.1",
                "maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
            },
            "StopSignal": "SIGQUIT"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "f9f9647096145a373ac3b609c379685c0b1ba8abe185b5df65fe7d9cddfe7d19",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8081"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/f9f964709614",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "webserver_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "webserver_nginx1_1",
                        "nginx1",
                        "b34bfd670a93"
                    ],
                    "NetworkID": "051b68777c6dfe07fcae9b75645a2c0ce921757ecf6c47781125d4275a805359",
                    "EndpointID": "b45e60702647701e7858d65ff60ae365564a029f539d8b75ef508a98b261cf41",
                    "Gateway": "172.23.0.1",
                    "IPAddress": "172.23.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:17:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

数据卷 Mounts "Source": "/var/lib/docker/volumes/webserver_data/_data"

MAC 独有方式。。。

可以进入 "/var/lib/docker/volumes/webserver_data/_data"查看到这两个文件

创建并配置网络

BravedeMacBook-Pro:webserver brave$ docker-compose down
[+] Running 3/3
 ⠿ Container webserver_nginx1_1  Removed                                   0.3s
 ⠿ Container webserver_nginx2_1  Removed                                   0.3s
 ⠿ Network webserver_default     Removed                                   0.1s
 
 vi docker-compose.yml

:set nu 查看行号

  3   nginx1:
  4     image: nginx
  5     networks:
  6      - "myweb"   // myweb 网络
  7      - "default" // 默认网络  可写可不写
  8     volumes:
  9      - "data:/data"
 10      - "./front:/usr/share/nginx/html"
 11     ports:
 12       - "8081:80"
 13   nginx2:
 14     image: nginx
 15     volumes:
 16      - "data:/data"
 17      - "./backend:/usr/share/nginx/html"
 18     ports:
 19       - "8082:80"
 20 volumes:
 21   data:
 22     driver: local
 23 networks:    // 创建网络 myweb
 24   myweb:
 25     driver: bridge

启动 compose

BravedeMacBook-Pro:webserver brave$ docker compose up -d
[+] Running 4/4
 ⠿ Network webserver_myweb       Created                                   0.1s
 ⠿ Network webserver_default     Created                                   0.1s
 ⠿ Container webserver-nginx1-1  Started                                   0.9s
 ⠿ Container webserver-nginx2-1  Started                                   0.8s

查看网络,创建了webserver_default、webserver_myweb 两个网络:

BravedeMacBook-Pro:webserver brave$ docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
0f0889985450   bridge              bridge    local
a02b571b9ecb   dev_web             bridge    local
04a72bf29d13   finance_web         bridge    local
1b1664b7d542   host                host      local
c57ec20004cf   none                null      local
82fddc470497   webserver_default   bridge    local   // 新创建
bb13d861b20a   webserver_myweb     bridge    local	 // 新创建