docker-compose
内容来源为六星教育,这里仅作为学习笔记
docker-compose是什么?
注意是docker中的compose
Compose是 Docker 的服务编排工具,诞生主要是来帮助开发或运维人员很好地管理docker容器;减少繁琐的单个容器创建、删除等操作,比较适合组合使用多个容器进行开发的场景。
对于需要多个容器的操作,传统的方式是一个个的创建及运行,而compose则只需要通过一次性把这些命令写在docker-compose.yml文件中,以后每次启动这一整个环境的时候,只需要你只要敲一个 docker-compose up命令就ok了。
docker-composer安装
官网地址:https://docs.docker.com/compose/
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
修改权限
chmod +x /usr/local/bin/docker-compose
安装完成后可以查看版本
docker-compose --version
如上就是下载的命令,也可以通过去github上手动下载并操作;下载的过程是比较慢的
建议采用如下地址方式下载:http://get.daocloud.io/#install-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
docker-composer命令了解
一般步骤
- 定义Dockerfile,方便迁移到任何地方;
- 编写docker-compose.yml文件;
- 运行docker-compose up启动服务
示例: 准备工作:提前下载好镜像
- 需要新建一个空白目录,在目录新建一个 docker-compose.yml
简单来说要版本一致;如下为示例代码
version: '3.6'
services:
nginx:
image: nginx:laster
ports:
- "8080:80"
stdin_open: true
networks:
app_net:
ipv4_address: 172.20.0.20
tty: true
links:
- redis-test
command: [/bin/bash]
redis-test:
build: .
ports:
- "6379:6379"
stdin_open: true
networks:
app_net:
ipv4_address: 172.0.20.21
tty: true
command: [/bin/bash]
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.0.20.0/16
以上命令的意思是新建nginx和redis容器。
好,我们启动应用:
docker-compose up
就成功了。浏览器访问 即可。 默认是前台运行并打印日志到控制台。如果想后台运行,可以
docker-compose up –d
服务后台后,可以使用下列命令查看状态:
docker-compose ps
停止服务:
docker-compose stop
重新启动服务:
docker-compose restart
docker-compose.yml文件命令了解
docker-compose的默认模版文件为: docker-compose.yml。 和Dockerfile一样,它也是有自己的语法命令的。其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。其它大部分指令都跟docker run中的类似。
需要注意的是docker-composer运用的时候一定要注意版本的问题,如下图显示;
撰写文件格式 | Docker引擎 |
---|---|
1 | 1.9.0+ |
2.0 | 1.10.0+ |
2.1 | 1.12.0+ |
2.2,3.0,3.1,3.2 | 1.13.0+ |
2.3,3.3,3.4,3.5 | 17.06.0+ |
2.4 | 17.12.0+ |
3.6 | 18.02.0+ |
3.7 | 18.06.0+ |
每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。 image 指定镜像tag或者ID。示例:
build
Build
用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像
注意,在version 1里bulid仅支持值为字符串。version 2里支持对象格式。
context
为路径, dockerfile
为需要替换默认 docker-compose
的文件名, args
为构建(build)过程中的环境变量,用于替换 Dockerfile
里定义的ARG参数,容器中不可用。示例
Dockerfile:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
docker-compose.yml:
build:
context: .
args:
buildno: 1
password: secret
build:
context: .
args:
- buildno=1
- password=secret
Command
用来覆盖缺省命令。示例:
command: bundle exec thin -p 3000
command也支持数组形式:
command: [bundle, exec, thin, -p, 3000]
Links
用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同 docker run --link 。
示例:
links:
- db
- db:mysql
- redis
使用了别名将自动会在容器的 /etc/hosts 文件里创建相应记录
172.17.2.186 db
172.17.2.186 mysql
172.17.2.187 redis
所以我们在容器里就可以直接使用别名作为服务的主机名。
Ports
用于暴露端口。同docker run -p。示例:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
Expose
expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。
expose:
- "3000"
- "8000"
volumes
挂载数据卷。同 docker run -v
。示例
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
挂载数据卷容器,挂载是容器。同 docker run --volumes-from
。示例:
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name
格式仅支持 version 2
。
environment
添加环境变量。同 docker run -e
。可以是数组或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
depends_on
用于指定服务依赖,一般是mysql、redis等。 指定了依赖,将会优先于服务创建并启动依赖。
links也可以指定依赖。
external_links
链接搭配 docker-compose.yml
文件或者 Compose
之外定义的服务,通常是提供共享或公共服务。格式与links相似
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意,external_links链接的服务与当前服务必须是同一个网络环境。
extra_hosts
添加主机名映射
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
将会在/etc/hosts创建记录:
162.242.195.82 somehost
50.31.209.229 otherhost
Extends
继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置
extends:
file: common.yml
service: webapp
service必须有,file可选。service是需要继承的服务,例如web、database。
Net
设置网络模式。同docker的–net参数
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
Dns
自定义dns服务器。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
cpu_shares,cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir 这些命令都是单个值,含义请参考 docker run。
docker-compose.yml参考
$ docker-compose
批处理脚本
关闭所有正在运行容器
docker ps | awk '{print $1}' | xargs docker stop
删除所有容器应用
docker ps -a | awk '{print $1}' | xargs docker rm
或者
docker rm $(docker ps -a -q)
docker-composer体验
注意nginx的配置
比如我们通过docker-composer来帮我们编排lrnp环境
如下为文件目录
对于PHP,nginx我们采用基于dockerfile的方式构建,而redis则直接利用之前使用的镜像
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./nginx
image: nginx1.4_composer # 指定容器的镜像文件
container_name: nginx-1.4-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "8001:80"
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /redis_2004/09/nginx/conf:/conf
working_dir: /conf #工作目录
php: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./php
image: php7.3_composer # 指定容器的镜像文件
container_name: php-7.3-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "9001:9000"
volumes: # 配置数据挂载
- /redis_2004/09/php/www:/www
redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
container_name: redis-5-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6800:6800"
然后执行命令
docker-compose up -d
# 启动命令
正常的结果
我们可以通过如上的命令来查看docker-compose在执行之后的创建了一个bridge模式的网段并且自动进行分配
可以看到是创建了相应的容器,不过在上面redis容器没有启动,那么很可能没有传入挂载命令的关系,同时也挂载redis的配置
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./nginx
image: nginx1.4_composer # 指定容器的镜像文件
container_name: nginx-1.4-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "8001:80"
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /redis_2004/09/nginx/conf:/conf
working_dir: /conf #工作目录
php: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./php
image: php7.3_composer # 指定容器的镜像文件
container_name: php-7.3-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "9001:9000"
volumes: # 配置数据挂载
- /redis_2004/09/php/www:/www
redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
container_name: redis-5-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6800:6800"
volumes: # 配置数据挂载
- /redis_2004/09/redis:/redis
command: top
配置网络
设置网络并自定义网络段
# 设置网络模块
networks:
# 自定义网络
nginx_net:
driver: bridge
ipam: #定义网段
config:
- subnet: "172.15.22.0/24"
使用网络
redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
nginx_net:
ipv4_address: 172.15.22.10 #设置ip地址
进行如下完整代码
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./nginx
image: nginx1.4_composer # 指定容器的镜像文件
container_name: nginx-1.4-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "8001:80"
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /redis_2004/09/nginx/conf:/conf
working_dir: /conf #工作目录
php: # 这个表示服务的名称,课自定义; 注意不是容器名称
build: # 根据dockerfile构建镜像及构建为容器
context: ./php
image: php7.3_composer # 指定容器的镜像文件
container_name: php-7.3-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "9001:9000"
volumes: # 配置数据挂载
- /redis_2004/09/php/www:/www
redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
nginx_net:
ipv4_address: 172.15.22.10 #设置ip地址
container_name: redis-5-composer # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6800:6800"
volumes: # 配置数据挂载
- /redis_2004/09/redis:/redis
command: top
# 设置网络模块
networks:
# 自定义网络
nginx_net:
driver: bridge
ipam: #定义网段
config:
- subnet: "172.15.22.0/24"
测试