docker compose

时间:2022-07-22
本文章向大家介绍docker compose,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Compose介绍

docker compose是官方编排项目,负责快速在集群中部署分布式应用,负责实现对docker容器集群的快速编排

需求

在使用dockerfile的时候,我们可以很方便的定义一个到哪都得应用容器,但是实际生产环境下,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

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

Compose 中有两个重要的概念: 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装与卸载

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

Linux上安装:

  • 二进制包
  • pip安装

1)官方下载二进制文件

1 2

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

2)pip安装

1

pip27 install -U docker-compose

1 2 3 4 5

[root@xs_test01 docker]# /bin/docker-compose version docker-compose version 1.19.0, build 9e633ef docker-py version: 2.7.0 CPython version: 2.7.5 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013

卸载

如果是二进制安装,直接删除二进制文件即可,如果是pip安装,直接执行pip uninstall docker-compose

compose使用

  • 服务:一个应用容器,实际上可以运行多个相同镜像的实例
  • 项目:由一组关联的应用容器组成的一个完整业务单元

一个项目可以由多个服务关联而成。

下面看下web应用

创建目录,写好配置

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

#cat app.py #coding:utf-8 from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis',port=6379) @app.route('/') def hello(): count = redis.incr('hists') return 'Hello World! 该页面已被访问 {}次。n' .format(count) if __name__ == "__main__": app.run(host="0.0.0.0",debug=True)

写dockerfile

1 2 3 4 5 6

[root@xs_test01 docker]# cat Dockerfile FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python","app.py"]

写docker-compose.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

[root@xs_test01 docker]# cat Dockerfile FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python","app.py"] [root@xs_test01 docker]# cat docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"

执行compose项目

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

[root@xs_test01 docker]# /bin/docker-compose up Starting docker_web_1 ... Starting docker_web_1 ... done Attaching to docker_redis_1, docker_web_1 redis_1 | 1:C 16 Mar 05:55:27.173 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 16 Mar 05:55:27.173 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 16 Mar 05:55:27.173 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 16 Mar 05:55:27.175 * Running mode=standalone, port=6379. redis_1 | 1:M 16 Mar 05:55:27.175 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 16 Mar 05:55:27.175 # Server initialized redis_1 | 1:M 16 Mar 05:55:27.175 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. redis_1 | 1:M 16 Mar 05:55:27.175 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. redis_1 | 1:M 16 Mar 05:55:27.175 * DB loaded from disk: 0.000 seconds redis_1 | 1:M 16 Mar 05:55:27.175 * Ready to accept connections web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) web_1 | * Restarting with stat web_1 | * Debugger is active! web_1 | * Debugger PIN: 164-856-111 web_1 | 192.168.30.240 - - [16/Mar/2018 05:55:42] "GET / HTTP/1.1" 200 - web_1 | 192.168.30.240 - - [16/Mar/2018 05:55:42] "GET /favicon.ico HTTP/1.1" 404 - web_1 | 192.168.30.240 - - [16/Mar/2018 05:55:47] "GET / HTTP/1.1" 200 -

compose命令说明

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

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

Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) 指定使用的compose模板文件,默认为docker-compose.yml -p, --project-name NAME Specify an alternate project name (default: directory name) 指定项目名称,默认将使用所在目录名称作为项目名 --verbose Show more output 输出更多调试信息 --no-ansi Do not print ANSI control characters -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address) --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) Commands: build Build or rebuild services 构建(重新构建)项目中的服务器 bundle Generate a Docker bundle from the Compose file config Validate and view the Compose file 验证compose文件格式是否正确,若正确则显示配置,若格式错误则显示错误原因 create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container 进入指定的容器 help Get help on a command images List images 列出compose文件中包含的镜像 kill Kill containers 通过发送SIGKILL信号来强制停止服务器,支持通过-s参数来指定发送的信号 logs View output from containers 查看服务容器的输出 pause Pause services port Print the public port for a port binding 打印某个容器端口所映射的公共端口 ps List containers 列出项目中目前的所有容器 pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command 在指定服务上执行一个命令 scale Set number of containers for a service 设置指定服务运行的容器个数 start Start services stop Stop services top Display the running processes 查看各个服务容器内运行的进程 unpause Unpause services 恢复处于暂停中的服务 up Create and start containers version Show the Docker-Compose version information

compose模板文件

模板文件是compose的核心,以上面web项目为例:

1 2 3 4 5 6 7 8 9

version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"

  • build  指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对路径),compose将会利用它自动构建这个镜像,这里便是使用的相对路径,也可以使用context来指定dockerfile的文件名,使用arg来指定构建镜像时的变量

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

version: '3' services: web: build: context: . dockerfile: Dockerfile args: buildno: 1 ports: - "5000:5000" redis: image: "redis:alpine"

  • cap_add,cap_drop 指定容器的内核能力,例如:

1 2 3 4 5 6

让容器拥有所有的能力: cap_add: - ALL 去掉NET_ANMIN能力: cap_drop: - NET_ADMIN

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

1

command: echo "hello world"

  • cgroup_parent  指定父cgroup组,意味着将继承该组的资源限

1

cgroup_parent: cgroups_1

  • container_name  指定容器名称,默认将会使用项目名称_服务名称_序号
  • devices  指定设备映射关系

1 2

devices: - "/dev/dir1:/dev/dir2"

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

1 2 3 4 5 6 7 8 9 10 11

version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres

  • dns  自定义dns服务器,可以是一个值,也可以是一个列表

1 2 3 4

dns: 8.8.8.8 dns: - 8.8.8.8 - 114.114.114.114

  • environment  设置环境变量

1 2 3 4 5 6

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

  • ports 暴漏端口信息