[Docker Compose定义运行多个Docker容器]

Posted 刘较瘦丫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Docker Compose定义运行多个Docker容器]相关的知识,希望对你有一定的参考价值。

[Docker Compose定义运行多个Docker容器]

Docker Compose

定义和运⾏多个 Docker 容器的应⽤(Defining and running multi-container Dockerapplications)

	我们知道使⽤⼀个 Dockerfile 模板⽂件,可以让⽤户很⽅便的定义⼀个单独的应⽤容器。然⽽,在⽇常⼯作
中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现⼀个 Web 项⽬,除了 Web 服务容器本身,
往往还需要再加上后端的数据库服务容器,甚⾄还包括负载均衡容器等。

	Compose 恰好满⾜了这样的需求。它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件(YAML格
式)来定义⼀组相关联的应⽤容器为⼀个项⽬(project)。

	docker-compose是容器编排工具,需要注意的是,docker-compose只是单机的容器编排工具。
	容器编排:管理多个容器

Compose 中有两个重要的概念

服务 ( service )

⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例。

项目 ( project )

由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 docker-compose.yml ⽂件中定义

Compose 的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理。

	Compose 项⽬由 Python 编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平台⽀持 Docker API,就可以在其上利⽤ Compose 来进⾏编排管理。

安装docker-compose

1、下载

curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2、修改权限

chmod +x /usr/local/bin/docker-compose 

3、文件更名

mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64

4、创建软连接

ln -s /usr/local/bin/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

5、下载bash命令补全

curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

6、测试docker-compose是否安装成功

docker-compose --version

显示如下结果,表示成功

	# docker-compose version 1.24.0, build 0aa59064 

卸载docker-compose

如果是⼆进制包⽅式安装的,删除⼆进制⽂件即可。

rm /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64

docker-compose的使用

	模板⽂件是使⽤ Compose 的核⼼,涉及到的指令关键字也⽐较多。但⼤家不⽤担⼼,这⾥⾯⼤部分指令跟
docker run 相关参数的含义都是类似的。

	默认的模板⽂件名称为 docker-compose.yml ,格式为 YAML 格式。

docker-compose.yaml模板

参考⽂档:https://github.com/yeasy/docker_practice/blob/master/compose/compose_file.md

version: "3.0"
services:
  django:
    image: django:v3
    ports:
      - "8000:8000"
    container_name: django
    networks:
      - django
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    container_name: mysql
    volumes:
    - "/root/docker-compose/mysql/data:/var/lib/mysql"
    networks:
      - django
    depends_on:
      - redis

  redis:
    image: redis:latest
    container_name: redis
    networks:
      - django

networks:
  django:

image :指定启动的镜像名称或ID


指定为要启动的镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像(公网下载)。

build :构建镜像启动

	每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来⾃动构建⽣成镜像。
	
	如果使⽤ build 指令,在 Dockerfile 中设置的选项(例如: CMD , EXPOSE , VOLUME , ENV 等) 将
会⾃动被获取,⽆需在 docker-compose.yml 中重复设置。

	build:
	  context: ./dir
	  dockerfile: Dockerfile-alternate
	  args:
	    buildno: 1
            	
    context : 指令指定 Dockerfile 所在⽂件夹的路径。
    
    dockerfile :指令指定 Dockerfile ⽂件名。
    
    arg :指令指定构建镜像时的变量。

ports :暴露端口信息


使⽤宿主端⼝:容器端⼝格式,或者仅仅指定容器的端⼝(宿主将会随机选择端⼝)都可以。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

expose : 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数


expose:
 - "3000"
 - "8000"

command : 覆盖容器启动后默认执行的命令


设置容器启动命令

command: echo "hello world"

container_name : 指定容器名称


默认将会使⽤ 项⽬名称_服务名称_序号 这样的格式。

container_name: docker-web-container

depends_on : 解决容器的依赖、启动先后的问题


version: \'3\'

services:
  web:
    build: .
    depends_on:
      - db
      - redis
      
  redis:
    image: redis
    
  db:
    image: postgres
    
上面会先启动 redis db 再启动 web

注意: web 服务不会等待 redis db 「完全启动」之后才启动。

dns :自定义 DNS 服务器


可以是⼀个值,也可以是⼀个列表

dns: 8.8.8.8

dns:
 - 8.8.8.8
 - 114.114.114.114

environment : 设置环境变量


你可以使⽤数组或字典两种格式

environment:
  RACK_ENV: development
  SESSION_SECRET:
environment:
  - RACK_ENV=development
  - SESSION_SECRET

只给定名称的变量会⾃动获取运⾏ Compose 主机上对应变量的值,可以⽤来防⽌泄露不必要的数据。

如果变量名称或者值中⽤到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号⾥,避免 YAML
⾃动解析某些内容为对应的布尔语义。这些特定词汇,包括

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

networks : 配置容器连接的⽹络


version: "3"

services:
  some-service:
  networks:  # 给启动的容器设置两个网桥
    - some-network
    - other-network
    
networks:      # 设置两个网桥
  some-network:
  other-network:

network_mode : 设置网络模式


使⽤和 docker run 的 --network 参数⼀样的值。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

env_file :从文件中获取环境变量


从⽂件中获取环境变量,可以为单独的⽂件路径或列表。

如果通过 docker-compose -f FILE ⽅式来指定 Compose 模板⽂件,则 env_file 中变量的路径会基于模板
⽂件路径。

如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
  
环境变量⽂件中每⼀⾏必须符合格式,⽀持 # 开头的注释⾏。

	# common.env: Set development environment
	PROG_ENV=development

volumes :数据卷所挂载路径设置


和 -v 差不多,不过-v是宿主主机映射到容器,两边同步。
而volumes直接就是两边数据同步。

healthcheck : 通过命令检查容器是否健康运行


healthcheck:

  test: ["CMD", "curl", "-f", "http://localhost"] # 执行的命令
  interval: 1m30s  # 间隔时间
  timeout: 10s     # 设置超时时间
  retries: 3       # 设置允许失败次数

  test: ["CMD", "ping", "-c1","-t1", "http://localhost"] # 执行的命令
  # -c1 : 只 ping 一次
  # -t1 :时间是一秒钟,超出1秒则超时
  

docker-compose参数


启动:docker-compose up # 启动docker-compose.yaml文件里面的容器
	
删除:docker-compose down # 删除docker-compose.yaml文件里面的容器

重启:docker-compose restart [容器的名称...] # 重新启动其中的一个容器

进入容器:docker-compose exec [参数] [SERVICE] [CMD] # 默认使用-T(类似 -it )	
	
停止:docker-compose stop [SERVICE] # 停⽌已经处于运⾏状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器查看各个服务容器内运⾏的进程

删除容器:docker-compose rm [SERVICE]  # 删除服务,停止之后才能删除

	-f, --force 强制直接删除,包括⾮停⽌状态的容器。⼀般尽量不要使⽤该选项。
	-v 删除容器所挂载的数据卷。

容器列表:docker-compose ps # 查看容器列表

启动:docker-compose start [SERVICE...] # 启动已经存在的服务容器

查看容器进程:docker-compose top  # 查看各个服务容器内运⾏的进程

暂停运行:docker-compose pause # 暂停服务容器

恢复运行:docker-compose unpause # 回复暂停状态的服务容器

可视化工具

version: \'3.0\'
services:
  portainer:
    image: portainer/portainer-ce
    ports:
    - "8001:8000"
    - "9001:9000"
    container_name: portainer
    networks:
      - "portainer"
    volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
    - "/root/docker-compose/portainer_data:/data"
    healthcheck:
      test: ["CMD", "ping", "-c1", "-t1", "portainer"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  portainer:

以上是关于[Docker Compose定义运行多个Docker容器]的主要内容,如果未能解决你的问题,请参考以下文章

(转)docker-compose安装

Compose

Docker-Docker Compose

Docker-Docker Compose总结

[云原生专题-14]:容器 - 批量定义构建运行多个微服务- docker编排工具Compose

docker-compose