Docker-Compose详解
# Docker-compose
# Docker Compose是什么
Docker Compose 与 Docker Stack 非常类似。
它能够在 Docker 节点上,以单引擎模式 (Single-Engine Mode)进行多容器应用的部署和管理。
多数的现代应用通过多个更小的服务互相协同来组成一个完整可用的应用。比如一个简单的 示例应用可能由如下 4 个服务组成
Web 前端。
订单管理。
品类管理。
后台数据库。
将以上服务组织在一起,就是一个可用的应用。 部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。 Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是 通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。
应用部署成功后,还可以通过一系列简单的命令实现对其完整声明周期的管理。甚至,配置 文件还可以置于版本控制系统中进行存储和管理。
# Docker Compose 的背景
Docker Compose 的前身是 Fig。Fig 是一个由 Orchard 公司开发的强有力的工具,在当时 是进行多容器管理的最佳方案。Fig 是一个基于 Docker 的 Python 工具,允许用户基于一 个 YAML 文件定义多容器应用,从而可以使用 fig 命令行工具进行应用的部署。 Fig 还可以对应用的全生命周期进行管理。
内部实现上,Fig 会解析 YAML 文件,并通过 Docker API 进行应用的部署和管理。在 2014 年,Docker 公司收购了 Orchard 公司,并 将 Fig 更名为 Docker Compose。命令行工具也从 fig 更名为 docker-compose,并自此 成为绑定在 Docker 引擎之上的外部工具。虽然它从未完全集成到 Docker 引擎中,但是 仍然受到广泛关注并得到普遍使用。直至今日,Docker Compose 仍然是一个需要在 Docker 主机上进行安装的外部 Python 工具。使用它时,首先编写定义多容器(多服务)应用的 YAML 文件,然后将其交由 docker-compose 命令处理,Docker Compose 就会基于 Docker 引擎 API 完成应用的部署。
小总结:docker-compose 就是一个编排。需要熟练 yaml 语法。
# Docker Compose安装
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
备注: docker-compose 是一个基于 yaml 语法的编排 创建的时候就是直接 vim docker-compose.yaml 该文件执行必须是在当前文件夹否则需要加 -f
# Docker Compose常用命令
# docker-compose 指令
模板指令: 用来书写在 docker-compose.yml 文件中指令称之,为模板指令用来为服务进行 服务的 指令: 用来对整个 docker-compose.yml 对应的这个项目操作书 写 docker-compose 命 令之后命令 docker-compose up(指令)
# 1.up 指令
作用:用来启动所有
$ docker-compose up
选项:-d 后台启动所有服务
# 2.down 指令
作用:用来关闭所有
$ docker-compose down
# 3.exec 指令
作用:进入容器
$ docker-compose exec redis (docker-compose.yml 中声明服务 id) bash
# 4.ps 指令
作用:用来展示当前
$ docker-conpose 运行的所有容器 docker-compose ps
# 5.restart 指令
作用:用来重启项目中某个服务 如果不写服务 id 默认重启所有服务
$ docker-compose restart [服务 id]
# 6.rm 指令
作用:用来删除项目服务
$ docker-compose rm 删除所有服务
$ docker-compose rm -fv [服务 id]注意:谨慎操作 -v 删除服务的数据卷
# 7.start 指令
启动服务
$ docker-compose start [服务 id]
# 8.stop 指令
关闭服务
$ docker-compose stop [服务 id]
# 9.top 指令
用来查看 compose 容器内运行的进程
$ docker-compose top [服务 id]
# 10.pause 指令
挂起服务
$ docker-compose pause [服务 id]
# 11.unpause 指令
继续运行服务
$ docker-compose unpause [服务 id]
# 12.logs 指令
查看服务日志
$ docker- compose logs [服务 id]
其他指令 port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定 的公共端口
$ docker-compose port eureka 8761
build:构建或者重新构建服务
$ docker-compose build
kill:通过发送 SIGKILL 信号来停止指定服务的容器
$ docker-compose kill eureka
config:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显 示错误原因 -h:
# 查看帮助
$ docker-compose pull [options] [SERVICE...] 选项包括:
--ignore-pull-failures, 忽略拉取镜像过程中的错误
--parallel, 多个镜像同时拉取
--quiet, 拉取镜像过程中不打印进度信息
拉取服务依赖的镜像
$ docker-compose pull
# Docker-compose 模板指令
# 查看第一个模板
version: "3.2"
services:
tomcat: #服务名称
image: tomcat:8.0-jre8 #使用哪个镜像
ports: #用来完成host与容器的端口映射关系
- "8080:8080"
volumes: #完成宿主机与容器中目录数据卷共享
#一/root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps:/usr/local/tomcat/webapps
volumes: #声明上面服务所使用的自动创建的卷名
tomcatwebapps: #声明指令的卷名compose 自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名.
false #true确定使用指定卷名注意:一 旦使用外部自定义卷 名启动服务之前必须手动创建
# 查看第二个模板
第二个模板是使用docker-compose部署多个应用的编排,docker-compose 部署多应用
services :
tomcat01: #服务名称
container_nane: tomcat01 #相当于run的 --name
image: tomcat:8.0-jre8 #使用哪个镜像相当于run image
ports: #用来完成host与容器的端口映射关系 相当于run -P
- "8080:8080"
volumes: #完成宿主机与容器中目录数据卷共享相当 于run -v
#- /root/apps:/usr/1ocal/tomcat/webapps #使用自定义路径映射
- /root/apps:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥 相当于run --network
- hello
tomcat02: #服务名称
container_name: tomcat02
image: tomcat:8.0-jre8 #使用哪个镜像
ports: #用来完成host与容器的端口映射关系
- "8081:8080"
volumes: #完成宿主机与容器中目录数据卷共享
#- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps02:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥
- hello
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
environnent:
- MYSQL_ROOT_PASSWORD=root
networks:
- hello
redis:
image: redis:5.0.10
container_name: redis
ports:
- "6379:6379"
volumes:
- redisdata:/data
networks:
- hello
command: "redis-server --appendonly yes" #run镜像之后用来獍盖容器内容默认命令
volumes: #声明上面服务所使用的自动创建的卷名
tomcatwebapps01: #声明指令的卷名compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名,
false #true确定使用指定卷名 注意:一旦使用外部自定义卷名启动服务之前必须手动创建
tomcatwebapps02:
mysqldata:
mysqlconf:
redisdata:
networks: #定义服务用到桥
hello: #定义上面的服务用到的网桥名称默认创建就是bridge
external:
true #使用外部指定网桥注意:网桥必须存在.
# Docker-compose模板指令详解
# build
构建或者重新构建服务
docker-compose build
# container_name
指定容器名称 默认会将使用
container_name: docker-web-container
# comand
覆盖容器启动后默认执行的命令
command: echo "hello world"
# depends_on
解决容器的依赖
启动先后的问题 以下先启动redis db 再启动web
version: "3.0"
services:
web:
build: ..
depends_on: #但是web服务不会等待redis db完全启动之后再启动
- db (服务的ID名称)
- redis
redis:
image: redis
db:
image: mysql:5.6
# env_file
从文件中获取变量 可以为单独的文件路径或者列表 如果docker-compose -f FILE 方式来指定Compose模板文件 则env_file中变量的路径会基于模板文件路径
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
# environment
设置环境变量 可以使用数组和字典两种格式
只给定名称的变量会自动获取运行compose主机上对应的变量
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- PACK_ENV=development
- SESSION_SECRET
# image
指定镜像的名称或者ID 本地不存在会尝试拉取
image: centos
image: orcharup/centos
image: a1s2df3a
# ports
暴露端口信息 宿主机端口:容器端口映射
ports:
- "3000"
- "8080:8080"
- "49100:22"
- "127.0.0.1:8080:8080"
# volumes
数据卷所挂载路径设置 可以设置宿主机路径 数据卷名称 并可以设置访问模式
volumes:
- /var/lib/mysql
- cache/:/tmp/apache
- ~/configs:/etc/configs/:ro
如果路径为数据卷名称 必须在文件中配置数据卷
version: "3.0"
services:
tomcat:
image: tomcat:8.0-jre8
ports:
- "8080:8080"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
external:
false
------------------------------------
#如果是自定义创建的volumes就如下
volumes:
mysql_data:
external:
true
# network
配置容器连接的网络
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
# healtheck
通过命令检查容器是否健康运行
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
# sysctls
配置容器的内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
# ulimits
指定容器的ulimits限制值
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
# compose的build指令
build 指令 作用:将指定的dockefile打包成指对应镜像,然后运行该镜像
services:
web:
build: 指定Dockerfile所在目录,先根据build中的dockerfile自动构成镜像,自动运行容器
context: demo ./demo /root/demo指定上下文目录 Dockerfile所在目录
dockerfile: Dockerfile
container_name: demo
ports:
- "8081:8081"
networks:
- hello
depends_on:
- tomcat01
# 外部命令
'创建卷'
$ docker volume create tomcatwebapps01
'查看卷'
$ docker volume ls
'创建网桥'
$ docker network create bridge hello
'查看网桥'
$ docker network ls
'查看容器信息'
$ docker inspect 容器名
'如果要使用自定义卷名就要手动创建卷名'
$ docker volume create 卷名
'如果要使用自定义网桥就要手动创建桥'
$ docker network create -d bridge 桥名