Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
在Docker镜像构成和定制介绍中,我们可以使用Dockerfile文件很方便定义一个单独的应用容器。
然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
docker-compose.yml看起来像这样: version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}
说明:
docker-ce-17.09.0.ce 系统环境是linux7.x
pip install docker-compose
docker-compose --version docker-compose version 1.21.2, build a133471
如果是通过 pip 安装的,则执行如下命令即可删除。
pip uninstall docker-compose
# pwd /root/docker-lnmp # tree -L 3 . ├── docker-compose.yml ├── mysql │ ├── data │ └── my.cnf ├── nginx │ ├── conf.d │ │ └── default.conf │ ├── Dockerfile │ ├── edusoho │ │ ├── api │ │ ├── app │ │ ├── bootstrap │ │ ├── plugins │ │ ├── src │ │ ├── vendor │ │ ├── vendor_user │ │ └── web │ ├── edusoho-8.2.38.tar.gz │ ├── log │ │ └── error.log │ ├── nginx.conf │ ├── ssl │ │ ├── nginx.key │ │ └── nginx.pem │ └── www │ ├── db.php │ ├── index.html │ ├── index.php ├── php │ ├── Dockerfile │ ├── log │ │ └── php-fpm.log │ ├── php-fpm.conf │ ├── php.ini │ └── www.conf
version: '3' # 定义三个服务nginx,php,mysql services: nginx: # 依赖php服务,意味着在启动nginx之前先启动php depends_on: - php # nginx镜像的路径 build: ./nginx # 这样使nginx容器把网站文件和目录存放到主机目录中,持久化和方便管理 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/log/error.log:/var/log/nginx/error.log - ./nginx/edusoho:/usr/share/nginx/html # nginx意外退出时自动重启 restart: always # 映射80端口 ports: - "80:80" # - "443:443" networks: - frontend # 容器名称 container_name: nginx php: depends_on: - mysql build: ./php ports: - "9000" networks: - frontend - backend volumes: - ./php/php-fpm.conf:/usr/local/php/etc/php-fpm.conf - ./php/www.conf:/usr/local/php/etc/php-fpm.d/www.conf - ./php/php.ini:/usr/local/php/etc/php.ini - ./php/log/php-fpm.log:/usr/local/php/var/log/php-fpm.log - ./nginx/edusoho:/usr/share/nginx/html restart: always container_name: php # MySQL mysql: image: "dockerhub.datagrand.com/global/mysql:5.6" ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql - ./mysql/my.cnf:/etc/my.cnf environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress command: ['mysqld', '--character-set-server=utf8'] networks: - backend restart: always container_name: mysql #Network networks: frontend: backend:
docker-compose up -d -d 在后台运行服务容器
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。
Compose文件版本,详见Compose file versions and upgrading | Docker Documentation
使用depends_on选项控制服务启动的顺序。详见Control startup order in Compose
services: nginx: # 依赖php服务,意味着在启动nginx之前先启动php depends_on: - php 说明: nginx服务不会等待php完全启动之后才启动!
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
详见build
# nginx镜像的路径 build: ./nginx
你也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定构建镜像时的变量。
version: '3' services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。详见volumes
volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/log/error.log:/var/log/nginx/error.log - ./nginx/edusoho:/usr/share/nginx/html
no是默认的重新启动策略,它不会在任何情况下重新启动容器。当always指定时,容器总是重新启动。
该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
详见restart
restart: "no" restart: always restart: on-failure restart: unless-stopped 注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项 。请改用restart_policy。
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)。
详见ports
ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp"
注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为base-60值。因此,我们建议始终将端口映射明确指定为字符串。
配置容器连接的网络。详见网络配置
创建frontend网络 docker network create frontend 查看网络 docker network ls 删除网络 docker network rm frontend
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
注意: 使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。
详见container_name
# 容器名称 container_name: nginx
environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress 或 environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
environment: RACK_ENV: development SHOW: 'true' 或 environment: - RACK_ENV=development - SHOW=true
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
覆盖容器启动后默认执行的命令。详见command
command: bundle exec thin -p 3000 该命令也可以是一个列表,方式类似于 dockerfile: command: ["bundle", "exec", "thin", "-p", "3000"]