Docker-compose

郑翰海
2023-12-01

目录

如何安装Docker-compose

启动命令

本文案例

如果设置延迟启动控制执行顺序?depends_on

参数说明:

心跳检测、心跳检测模板

如何设置时区?

如何实现相互通信?

如何设置自定义网段?

如何设置静态IP?

如何设置连接外部依赖?

1、使用已经存在的网段

2、将MySQL容器加入到 lting-scrm-net网段中

3、在Nacos容器中连接Mysql容器

external_links使用方法


如何安装Docker-compose

#1、创建docker-compose安装目录
    mkdir /apps/compose
    cd /apps/compose

#2、下载Linux版本 
    sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /apps/compose/docker-compose

# 3、赋权:
    sudo chmod +x /apps/compose/docker-compose

# 4、创建软连接:
    ln -sf /apps/compose/docker-compose /usr/bin/docker-compose

#5、查看版本:
    docker-compose -v

启动命令

# 启动全部
    docker-compose up

# 启动外部独立yml?
    docker-compose -f xxx.yml up
        ### 如果我们要启动的文件名字不是docker-compose.yml,而是比如“standalone-mysql.yaml”、“standalone-nacos.yaml”之类文件,可以使用此命令启动

# 启动部分容器
    docker-compose up SERVICE_NAME
      ### 一个yml文件中有多个容器时,可以使用此命令启动,比如:
      ### docker-compose up nacos   ### nacos依赖db,所以db也会启动;
      ### docker-compose up db      ### 单独启动db;

# 以依赖关系顺序停止服务
     docker-compose stop       
        ### docker-compose up nacos ### nacos依赖db,所以db会在nacos前面停止

### 后台启动:添加“-d”即可
    docker-compose up -d
    

# 卸载
    直接删除docker-compose安装目录即可

本文案例

MySQL+Nacos+Seata,依赖关系如下:

  • 其中mysql独立,不要依赖;
  • Nacos依赖MySQL;
  • Seata依赖MySQL、Nacos

三者都是放在docker-compose.yml文件中。各个版本如下:

[root@iZbp222227zw5Z ~]# docker-compose --version
Docker Compose version v2.6.1

[root@iZb2222222zw5Z ~]# docker --version
Docker version 20.10.17, build 100c701

docker-compose.yml文件版本:version '3.9'

如果设置延迟启动控制执行顺序?depends_on

depends_on:指定依赖的执行顺序

# depends_on:在version '3.9'版本中新增condition心跳检测,可以控制以来服务是否启动成功
### 写法一:无法判断该服务是否成功启动 

######缺点:--- 比如nacos和mysql,mysql启动时会初始化数据,如果我们使用此种方法时,在nacos启动时mysql的初始化数据可能未执行完毕,导致nacos会报错:Caused by: java.lang.IllegalStateException: No DataSource set....


version: "3.9"
services:
  db:
    image: mysql:8.0.21
  nacos:
    depends_on:
      - db


### 写法二:
version: "3"
services:
  db:
    image: mysql:8.0.21
    healthcheck:
        ......
  nacos:
    depends_on:
      db:
        condition: service_healthy

参数说明:

condition:有三个值。分别是:

  • service_sarted:该服务无论初始化完成没都会启动本服务, 能使用“docker ps” 查看---与“写法一”作用类似;
  • service_healthy:心跳检测,如果该服务启动成功后----可能还没有初始化完成,本服务不会成功启动---即只创建不启动。不能使用“docker ps”查看,但是可以使用“docker ps -a”查看 -----等待时间久;
    • 报错:container for service xxx has no healthcheck configured ---必须在 xxx中配置“healthcheck”,具体配置见:心跳检测、心跳检测模板

  • service_completed_successfully:该服务启动成功并且初始化完成后,才会启动本服务-----等待时间超级久;

心跳检测、心跳检测模板:service_healthy

        比如:nacos依赖mysql,在nacos的 depends_on中配置了db.condition: “service_healthy”;如果我们不配置心跳检测“healthcheck”,系统会报错:container for service xxx has no healthcheck configured

        模板如下:

version: '3.9'
services:
  #mysql数据库脚本
  db:
    image: mysql:8.0.21
    ......
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
      interval: 5s      ### 间隔时间 --- 时间为了方便调试,设置较短。可以设置:1m30s....
      timeout: 5s       ### 超时时间
      retries: 2        ### 重试次数
      start_period: 5s  ### 启动后,多少s开始检测程序
  nacos:
    image: nacos/nacos-server:v2.1.0
    depends_on:
      db:
        condition: service_healthy

如何设置时区?

#第一种方式(推荐):
environment:
  TZ: Asia/Shanghai
  
#第二种方式:
environment:
  SET_CONTAINER_TIMEZONE=true
  CONTAINER_TIMEZONE=Asia/Shanghai

#第三种方式:
volumes:
  - /etc/timezone:/etc/timezone:ro
  - /etc/localtime:/etc/localtime:ro

使用方法三时可能会报如下错误:

[root@iZbp167fcodo22222gk7zw5Z czg-compose]# docker-compose up -d 
Creating mysql ... error

ERROR: for mysql  Cannot start service mysql: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/etc/timezone" to rootfs at "/etc/timezone": mount /etc/timezone:/etc/timezone (via /proc/self/fd/6), flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

ERROR: for mysql  Cannot start service mysql: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/etc/timezone" to rootfs at "/etc/timezone": mount /etc/timezone:/etc/timezone (via /proc/self/fd/6), flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.

 原因:centos7.6中/etc/timezone是一个文件夹,而不是一个文件,执行如下命令:

echo 'Asia/Shanghai' > /etc/timezone/timezone

最终命令变为:

volumes:
  - /etc/timezone/timezone:/etc/timezone:ro

如何实现相互通信?

互相通信,应用场景:  A容器要去访问B容器----A环境依赖于B环境;

此时A、B容器有三种类型,分别是:

  • A、B容器在同一个docker-compose.yml文件中
  • A、B容器不在同一个docker-compose.yml中
  • A(B)容器使用docker-compose启动,但是B(A)容器使用另外方式启动
  • A、B容器不在同一网段/不在同一服务器...

本文只讲1、2两种。主要涉及到的知识有:

  • 设置网段---本文采用静态IP;
  • 设置外部依赖

如何设置自定义网段?

使用networks。

version: '3.9'
services:
  #mysql数据库脚本
  mysql:
    image: mysql:8.0.21
    ......  
    networks:
      - my_network
  #nacos服务脚本
  nacos:
    image: nacos/nacos-server:2.0.0
    ......
    networks:
      - my_network

# docker容器内网地址
networks:
  my_network:        ### 网段名称
    driver: bridge   ### bridge可以随意取

完成上述操作后,我们就可以在nacos容器中ping mysql即可。

docker exec -it nacos /bin/bash

ping mysql

如何设置静态IP?

version: '3.9'
services:
  #mysql数据库脚本
  mysql:
    image: mysql:8.0.21
    ...... 
    networks:
      extnetwork:
        ipv4_address: 172.21.0.1
  #nacos服务脚本
  nacos:
    ......
    networks:
      extnetwork:
        ipv4_address: 172.21.0.2
networks:
  extnetwork:
    name: extnetwork
    ipam:
      config:
        - subnet: 172.21.0.0/16

 与上述设置网段效果一致,都可以在nacos使用ping mysql...

如何设置连接外部依赖?

        ------ 下面红体方法,为通测通过配置

        用于链接到外部容器。所有容器需要在同一个网络中。---- 不在同一个docker-compose.yml文件中

1、使用已经存在的网段

        如果没有存在/之前启动的依赖没有设置networks,可以使用docker network创建网段。

docker network create lting-scrm-net --driver bridge

        注意:此处相当于注册到已经存在的网段中

2、将MySQL容器加入到 lting-scrm-net网段中

方法一:在容器A的docker-compose.yml中配置网段

version: '3'
services:
  mysql8.0:
    # 镜像名
    image: mysql:8.0.21
    ......


### docker容器内网地址
networks:
  default: 
    external:
      name: lting-scrm-net

方法二:使用docker run启动

docker run --name  mysql8.0 -e MYSQL_ROOT_PASSWORD=2sIsS5 --net lting-scrm-net -d mysql:8.0.21
### 注意:使用此种方法启动mysql时,1、需要手动加入nacos配置;2、需要修改mysql的编码等等....

 启动结果查询

        docker network inspect my-net

[
    {
        "Name": "lting-scrm-net",
        "Id": "d9218b9779d3f09de156eecefb4a671f2ca1f3f8d1922c3314a3f8996f4128b2",
        "Created": "2022-07-03T11:25:14.750477854+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "6ae916819bb48e8411f0f0c980b416c4a138e9feca168866f3fde19a457e7298": {
                "Name": "mysql8.0",
                "EndpointID": "95e15064188793c1eeb37a04a6332b66f791ca821f26fe39f90df10d4fb65712",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.1/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

3、在Nacos容器中连接Mysql容器

方法一:使用docker-compose.yml配置

version: "3.9"
services:
  nacos:
    image: nacos/nacos-server:v2.1.0
    ...... 
    environment:

      MYSQL_SERVICE_HOST: mysql8.0   ### 容器A的名称
    ......

    external_links:
      - mysql8.0      ### 容器A的名称

networks:
  default: 
    external:
      name: lting-scrm-net

方法二:使用docker run方式连接

# 开启一个实例nacos并与my-net建立链接
docker run --rm --name nacos --link lting-scrm-net -d nacos/nacos-server:v2.1.0 

external_links使用方法

使用方法,见:3、在Nacos容器中连接Mysql容器>>方法一:使用docker-compose.yml配置即可。

-------------------------------------------------------------------------------------------------------------------------------

docker-compose编排Mysql+nacos+seata完整配置见下文

 类似资料: