Docker Compose
之前打造镜像都是用docker build run手动创建镜像并运行容器的.但是没办法批量多个运行.
所以Docker Compose就是用来高效管理容器,定义运行多个容器的.
Compose是Docker 开源项目,需要安装.
Compost编排好后用docker-compose up启动服务
这里compose的概念:
- 服务 service 就是指容器 应用的概念
- 项目project 多个服务运行起来组成的就是一个完整的项目
Docker Compose安装
-
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
但是官方给的下载很慢 我们下载国内的镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 下载完后给文件夹权限
sudo chmod +x /usr/local/bin/docker-compose
如果docker-compose --version
可以跳出版本号,说明安装成功 - 按照官网的geting started开始部署配置
https://docs.docker.com/compose/gettingstarted/
- 先随意找个文件夹比如/home/young下创建一个composetest文件夹
mkdir composetest
- 创建一个app.py应用,具体代码看官网
- 创建一个requirements.txt,导入app.py需要的包
- 创建一个Dockerfile 具体代码看官网
- 创建一个docker-compose.yml 具体代码看官网
- 使用命令启动docker compose
docker-compose up
正常跑起来就是下面2个web和redis的服务应用
Docker Compose yml文件编写语法
- build
用来指定dockerfiel打包成对应镜像,然后运行镜像 - image
- network
- port 按推荐的来 - "80:8080"
- volume
- container_name
- depends_on
- enviroment
- env_file env_file和enviroment选一个即可,用来代替enviroment,可以避免yml文件暴露敏感信息,把环境变量以key=value形式写到.env后缀的文件中去
- healthcheck #用来检查这个容器运行是否正常.如果多个应用容器都要检查,则每个容器都要分别加healthcheck,那个localhost 如果是需要检查远程容器则需要填写ip.可以在docker-compose ps中查看健康状态
- sysctls和ulimits 分别是修改容器的内核参数和进程限制数,不是所有容器都需要用的.知道语法和意义即可
练习截图和代码如下.
version: "3.2"
#自己下载了tomcat 9.0.37,然后把webapp.dist里的文件复制到了webapp,自己commit了一个镜像mytom:1.0
#docker-compose.yml路径为 /home/young/ ,这里的young会被视作项目名称
services:
tomcat01: # 自定义服务名
container_name: mytom01 #自定义容器名字
image: mytom:1.0
ports: #等于docker -p 参数,但是映射关系建议用"端口1:端口2"这种字符串形式书写
- "8000:8080"
volumes:
#- /home/young/tomcat_data:/usr/local/tomcat/webapps #使用绝对路径映射自定义
- myvolumes:/usr/local/tomcat/webapps
networks:
- mynet
depends_on: #容器启动编排,会先启动denpend_on里面的应用作为依赖.
- myredis
- mysql01
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
mysql01: # 自定义服务名
container_name: sql01 #自定义容器名字
image: mysql:5.7
ports: #等于docker -p 参数,但是映射关系建议用"端口1:端口2"这种字符串形式书写
- "8001:3306"
volumes:
#- /home/young/mysql:/var/lib/mysql #使用绝对路径映射自定义
- mysqlconf:/etc/mysql
networks:
- mynet
environment: #2中写法 - key=value 或者key: value
- MYSQL_ROOT_PASSWORD=root
env_file: # 用来代替enviroment,可以避免yml文件暴露敏感信息,把环境变量以key=value形式写到.env后缀的文件中去
# env_file和enviroment选一个即可
- ./mysql.env
myredis:
container_name: redis01
image: redis:5.0.10
ports:
- "8002:6379"
volumes:
- redisdata:/data
networks:
- mynet
command: "redis-server --appendonly yes" #run 镜像后用来覆盖容器内容默认命令
volumes:
myvolumes:
external: #使用自定义卷名,填布尔值
false #如果为假,卷名自动创建,创建规则为项目名+卷名,比如young_myvolumes
#如果为真,就使用外部自定义卷名,首先要自己先创建一个volume(docker volume create myvolumes),才能运行
mysqlconf: #默认external为假,自动创建
redisdata:
networks:
mynet:
external:
true #如果为假,网络名自动创建,创建规则为项目名+卷名,比如young_mynet
#如果为真,就使用外部自定义的网络名,首先要自己先创建一个volume(docker volume create mynet),才能运行
build是在docker里是根据dockerfile去创建镜像,但是用在compose.yml里是构建镜像并且运行.
version: "3.2"
services:
mycentos:
build: #启动服务时先在build指定dockerfile打包成镜像
context: demo #指定上下文目录dockerfile所在的目录,例子中就是在同个路径下,也可以写绝对路径 /home/young,这里因为do_file和docker-compose.yml在同一目录中,可以不写
dockerfile: do_file # 定义dockerfile的名字
container_name: mycentos01
networks:
- mynet
command: "-it /bin/bash"
# depends_on:
# - tomcat01 这里下面没写tomcat01服务,所以注释
networks:
mynet:
external: true
docker-compose 指令
模板指令 用来书写在docker -compose.yml文件中的, 称为模板指令,用来为服务而服务的.
指令 用来对整个docker-compose.yml对应的这个项目操作, 是写在docker-compose.yml命令之后来命令的
比如 docker-compose up 这个up 就是属于指令