由前文知,运行容器的命令比较简单,但是,当有复杂的应用时,比如设置环境变量、挂载目录、映射端口,命令就变得比较长了。如果有多个docker镜像同时配置使用的话,单独执行docker run
会显示比较麻烦。因此,本文就介绍多容器编排的一个简单工具:docker-compose。
安装 安装方法如下:
1 sudo apt-get install -y docker-compose
本文安装的版本如下:
1 2 $ docker-compose --version docker-compose version 1.21.2, build a133471
指定安装方式:
1 2 sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
注:最新版本不一定适合,在 CentOS 7 系统上安装较新版本(2021年初发布),提示GLIBC_2.28
找不到。回退版本解决。
docker-compose.yml内容 docker-compose默认使用的配置文件为docker-compose.yml,其内容示例如下,大多数英文名称,是固定内容,中文说明是根据实际情况变化的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: '2' # 固定,表示其版本为2 services: # 固定,表示容器服务 gitlab: # 容器名称,根据实际修改 image: latelee/gitlab # 镜像名,如果不存在,则从网络下载 container_name: gitlab # 容器名,在运行名称是唯一的 shm_size: 2gb # 指定共享内容为 2GB,可进入容器用 df -h 查看 /dev/shm 大小,好像默认是64MB,经测,oracle需指定 env_file: .env.production # 环境变量文件,和实际容器功能相关 restart: always # 开启此选项,在机器重启后,会自动启动这些容器,否则,就要手动启动容器 command: xxx # 运行的命令,如果有默认的,此项不需要 volumes: # 挂载数据卷,对应docker run命令的-v选项。 - /mnt/gitlab_data/config:/etc/gitlab environment: # 环境变量,依次写即可,根据容器设置而变化 - TZ=Asia/Shanghai ports: # 端口映射 - "80:80" networks: # 指定的网络,也可以不指定,必须与networks名称一致 - mygitlab-jenkins-net depends_on: # 多个容器间可能有依赖关系,可设置之,如无则不用 - foo jenkins:# 容器名称,根据实际修改,格式与前述一样 ... networks: # 固定,对网络配置,如无则不需要 mygitlab-jenkins-net: # 自定义的网络名称 driver: bridge # 桥接方式
根据笔者经验,yml文件对格式检查十分严格,必须要对齐,如上面的image、container_name等,必须对齐,不能多一空格或少一空格,至于空格多少,笔者经验可为2,可为4,只要对齐即可。否则会提示莫名其妙的错误。
针对环境变量environment
,有两种语法格式。一是有前缀-
,表示其后是列表形式,如- KEY=value
;二是不带前缀-
,表示是 Map 形式,如KEY:value
。两者不能混合,否则会提示错误services.gitlab.environment contains XXX which is an invalid type, it should be a string
。
其它的字段是否也有类似的要求,暂未查到。
运行、停止 在docker-compose.yml同级目录,执行如下命令运行:
如果配置文件不是docker-compose.yml,则需要使用-f来指定,如下:
1 docker-compose -f foobar.yml up -d
以上命令,使用-d表示在后台运行docker容器,执行后,终端只打启动信息,不会打印容器内的日志。如果要显示日志,则要将-d去掉。
停止命令:
重启命令:
1 2 3 docker-compose restart 或 docker-compose restart <docker-compose.yml指定的服务名称,非容器名称>
注意,如果同时要运行多个容器,修改其中部分容器时,可以使用restart来重启,这样仅启动有修改的容器,但是根据经验,有时会有意想不到的情况出现,因此,最好还是先停止再启动。 如果要查看运行状态,执行:
当然,也可以使用docker ps
来查看,本质上没区别。
实际例子 下面以一个经典的CICD组件为例进行说明,docker-compose.yml内容如下:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 # gitlab & jenkins # Powered by Late Lee <li@latelee.org> # # yml版本为2 version: '2' services: # 第一个容器gitlab gitlab: # 镜像名,如果不存在,则从网络下载,本文假设使用本地的镜像 image: latelee/gitlab # 容器名,在运行名称是唯一的 container_name: gitlab restart: always # 挂载数据卷 volumes: - /mnt/gitlab_data/config:/etc/gitlab - /mnt/gitlab_data/logs:/var/log/gitlab - /mnt/gitlab_data/data:/var/opt/gitlab # 端口映射 ports: - "80:80" - "9443:443" - "2222:22" # 主机名 这个IP改为自己的主机IP hostname: "172.18.18.18" # 启动时执行的命令 #command: /assets/wrapper # 自定义的网络(见下[网络配置]) networks: - mygitlab-jenkins-net # 第二个容器jenkins jenkins: image: latelee/jenkins:maven container_name: jenkins restart: always volumes: # 使用主机的docker服务(因为要在jenkins容器中运行docker) - /var/run/docker.sock:/var/run/docker.sock # 使用数据盘的目录作为jenkins的工作目录 - /mnt/jenkins_home:/var/jenkins_home ports: # 端口映射 - "9080:8080" - "50000:50000" networks: - mygitlab-jenkins-net # 网络配置 networks: mygitlab-jenkins-net: # 自定义的网络名称 driver: bridge # 桥接方式
执行docker-compose up -d
启动gitlab和jenkins容器。成功后,可以在浏览器上输入主机IP访问gitlab的页面。注意,gitlab和jenkins比较吃内存,最好在4GB以上内存的机器上运行,否则会很卡。
使用经验 在docker-compose.yml中构建镜像。 在docker-compose.yml文件,在image前面加上build字段,指定Dockerfile所在目录,那么在运行docker-compose up
时,就会自动构建。示例文件如下:
1 2 3 4 5 6 7 8 9 10 11 version: "2" services: apache: build: httpd image: httpd:alpine container_name: httpd volumes: # - /home:/home - ./apache2/htdocs:/usr/local/apache2/htdocs ports: - 80:80
运行后,最后提示信息如下:
1 2 Successfully httpd:alpine WARNING: Image for service singula-oh-accessserver was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
从提示信息知道,如果镜像不存在则自动创建,否则需要调用docker-compose build
或docker-compose up --build
小结 笔者在工作中几乎都使用docker-compose启动容器。这种方式加上自建docker镜像(后文将讲述),将大大提高效率。如部署禅道系统。使用笔者构建好的配置文件,直接下载https://github.com/latelee/docker-compose/tree/master/zentao ,进入该目录,运行docker-compose up -d
,即可在9070端口访问禅道页面。其过程十分方便,因为所有的一切环境,已经在docker中完成了。笔者的docker-compose仓库地址:https://github.com/latelee/docker-compose 。
参考 https://stackoverflow.com/questions/66853440/docker-compose-error-invalid-type-it-should-be-a-string
附 一些容器的启动命令:
1 2 3 4 5 6 mysql: command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--explicit_defaults_for_timestamp=false'] redis: #command: redis-server command: redis-server --requirepass 123456
李迟 2018.7.3