Docker Compose
3.4.1 介绍
Compose
项目是Docker官方的开源项目,负责实现对 Docker容器集群的快速编排。
其代码目前在https://github.com/docker/Compose上开源。
Compose
中有两个重要的概念:
-
服务( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
-
项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-
Compose
yml 文件中定义。Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。Compose
项目由 Python编写,实现上调用了Docer服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docer APl,就可以在其上利用
Compose
来进行编排管理。
3.4.2 三步骤
-
定义一个Dockerfile文件
-
定义一个docker-
Compose
.yml文件 -
docker-
Compose
up 启动作用:批量服务编排
理解: `Compose`诗官方的开源项目,需要安装 # Dockerfile 让程序在任何地方运行
3.4.3 安装
# 官网地址慢
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` >/usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose
#安装成功 docker-compose version
docker-Compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3.4.4 yaml规则
# 三层
version: #版本
services: #服务
服务1:web
# 服务配置
images
build
network
3.4.4.1 build
作用:先根据build中的DockerFile自动构建镜像,自动运行容器
- context:指定Dockerfile相对docker-compose.yml的路径位置,可使用绝对或相对路径
- dockerfile:指定你Dockerfile的文件名,如果是Dockerfile可忽略
案例
version: "3.0"
services:
java:
build: # 用来指定Dockerfile所在目录
context: ./docker # 指定Dockerfile所在目录位置,相对或绝对
dockerfile: Dockerfile # Dockerfile的文件名
container_name: javaApp
ports:
- "2021:2021"
networks:
- ems
depends_on:
- tomcat
command: "--server.servlet.context-path=/app"
networks:
ems:
FROM java:8
ADD springboot-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 2021
ENTRYPOINT ["java","-jar","app.jar"]
CMD ["--server.port=2021"]
3.4.4.2 command
作用:用来覆盖容器启动的默认命令
案例:启动redis
version: "3.0"
services:
redis1:
image: redis:5.0
ports:
- "6379:6379"
container_name: redis01
volumes:
- redisdata:/data
networks:
- ems
command: "redis-server --appendonly yes" # 使用AOF持久化
# commend: redis-server /usr/redis/conf/redis.conf 指定配置文件启动
networks:
ems:
3.4.4.3 container_name
作用:容器名 替换原始的–name
3.4.4.4 depends_on
作用:用来指定当前服务启动依赖那些服务,依赖的服务会在当前优先启动, 之后书写的是服务名
注:不会在依赖的服务完全启动之后在启动
案例:搭建es + kibana
version: "3.1"
services:
es:
image: elasticsearch:7.11.2
container_name: es
networks:
- elk
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
volumes:
- esconfig:/usr/share/elasticsearch/config # 可选配置,配置文件
- esdata:/usr/share/elasticsearch/data # 可选配置,数据持久化
- /home/elasticsearch/plugins/:/usr/share/elasticsearch/plugins # 可选配置,插件挂载
restart: always
kibana:
image: kibana:7.11.2
container_name: kibana
networks:
- elk
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es:9200 # 指定es的路径
depends_on:
- es
restart: always
networks:
elk:
volumes:
esconfig:
esdata:
3.4.4.5 env_file
作用:以配置文件的形式替换enviroment中的配置,因为直接写太敏感
必须以
.env
为后缀
案例:搭建mysql
version: "3.1"
services:
mysql1:
container_name: mysql
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- mysqlconf:/etc/mysql/conf.d # 配置文件挂载
- /home/mysql/data:/var/lib/mysql # 数据持久化挂载
env_file:
- ./pwd.env
networks:
- mysql
networks:
mysql:
volumes:
mysqlconf:
pwd.env
MYSQL_ROOT_PASSWORD=root
3.4.4.6 enviroment
作用:用来给容器中的某些环境赋值
案例:搭建mysql
version: "3.0"
services:
mysql1:
container_name: mysql01
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- mysqlconf:/etc/mysql/conf.d # 配置文件挂载
- /home/mysql/data:/var/lib/mysql # 数据持久化挂载
environment:
- MYSQL_ROOT_PASSWORD=root # 数组用等号
# MYSQL_ROOT_PASSWORD: root
networks:
- ems
networks:
ems:
3.4.4.7 healthcheck
作用:心跳机制,检测容器是否存活
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
3.4.4.8 image
作用:指定镜像,使用镜像是谁
3.4.4.9 networks
作用:用来指定容器使用的是哪个网桥 替代 --network
-xxx(会自动创建) 一旦指定,一定要手动声明
3.4.4.10 ports
作用:映射端口,相当于-p 8080:8080
3.4.4.11 sysctls
作用:用来修改容器内系统的参数
3.4.4.12 ulimits
作用:用来修改容器内系统的默认最大进程数
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
3.4.4.13 volumes
作用:用来挂载数据卷 相当于 -v
使用具名挂载时,要手动申明
3.4.5 启动
docker-compose up # 启动容器
3.4.6 实战
version: "3.0"
services:
tomcat: # 服务名,唯一
container_name: tomcat01 # 替换--name
image: tomcat:9 # 相当于 tomcat:9
ports:
- "8080:8080" # 相当于 -p 8080:8080
volumes: # 相当于 -v mytomcatapp:/usr/local/tomcat/webapps
- mytomcatapp:/usr/local/tomcat/webapps # 具名挂载,会创建目录名_mytomcatapp的卷名
networks: # 相当于--network ems
- ems
tomcat1:
container_name: tomcat02
image: tomcat:9
ports:
- "8081:8080"
volumes:
- /home/tomcat/webapps:/usr/local/tomcat/webapps # 指定路径挂载
networks:
- ems
mysql1:
container_name: mysql01
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- mysqlconf:/etc/mysql/conf.d # 配置文件挂载
- /home/mysql/data:/var/lib/mysql # 数据持久化挂载
environment:
- MYSQL_ROOT_PASSWORD=root # 数组用等号
# MYSQL_ROOT_PASSWORD: root
networks:
- ems
redis1:
image: redis:5.0
ports:
- "6379:6379"
container_name: redis01
volumes:
- redisdata:/data
networks:
- ems
command: "redis-server --appendonly yes" # 用来覆盖容器中的内部命令,用来开启redis的aof持久化
volumes:
mytomcatapp: # 使用具名挂载要声明
external: # 使用自定义卷名
true # true确定使用自定义卷名,必须提前创建好,默认为false,不使用
mysqlconf: # mysql配置文件挂载点
redisdata: # redis持久化挂载点
networks:
ems: # 声明网络,默认会创建目录名_ems
external: # 使用自定义网桥,需要提前创建好
false
version: '3.1'
services:
cxs-mysql:
container_name: cxs-mysql
image: mysql:5.7
ports:
- "10086:3306"
environment:
- MYSQL_ROOT_PASSWORD=@Passw0rd
- TZ=Asia/Shanghai
volumes:
- /root/mysql-docker/mysql/data:/var/lib/mysql
- cxs-mysql-conf:/etc/mysql
- /root/mysql-docker/mysql/log:/var/log/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
volumes:
cxs-mysql-conf:
3.4.7 命令
1,Docker-compose命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下
-f --``file` `FILE指定Compose模板文件,默认为docker-compose.yml``
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名``
--verbose 输出更多调试信息``-``v``,-version 打印版本并退出``
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
2,docker-compose up
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]``选项包括:
-d # 在后台运行服务容器``
-no-color # 不是有颜色来区分不同的服务的控制输出``
-no-deps # 不启动服务所链接的容器``
3,docker-compose ps
docker-compose ps [options] [SERVICE...] # 列出项目中所有的容器
4,docker-compose stop
docker-compose stop # 停止,不删除
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)``
docker-compose stop``停止正在运行的容器
docker-compose start 再次启动
5,docker-compose -h
docker-compose -h # 查看帮助
6,docker-compose down
docker-compose down [options] 停止和删除容器、网络、卷、镜像
docker-compose down # 停止和删除所有
7,docker-compose logs
docker-compose logs [options] [SERVICE...] 查看服务容器的输出。
# 默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
docker-compose logs 查看服务容器的输出
-f 跟踪日志输出
8,docker-compose bulid
docker-compose build [options] [--build-arg key=val...] [SERVICE...]``构建(重新构建)项目中的服务容器。
docker-compose build来重新构建服务
9,docker-compose pull
docker-compose pull [options] [SERVICE...]``拉取服务依赖的镜像。
10,docker-compose restart
docker-compose restart [options] [SERVICE...] # 重启项目中的服务。
11,docker-compose rm
docker-compose rm [options] [SERVICE...] 删除所有(停止状态的)服务容器。
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose rm 删除所有(停止状态的)服务容器。
推荐先执行docker-compose stop命令来停止容器。
12,docker-compose start
docker-compose start [SERVICE...]``docker-compose start 启动已经存在的服务容器。
13,docker-compose run
docker-compose run [options] [-``v` `VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]``在指定服务上执行一个命令。
docker-compose run ubuntu ``ping` `www.baidu.com``在指定容器上执行一个``ping``命令。
14,docker-compose scale
docker-compose scale web=3 db=2``设置指定服务运行的容器个数。通过service=num的参数来设置数量
15,docker-compose pause
docker-compose pause [SERVICE...]``暂停一个服务容器
16,docker-compose kill
docker-compose ``kill` `[options] [SERVICE...]``通过发送SIGKILL信号来强制停止服务容器。``支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:``docker-compose ``kill` `-s SIGINT
17,docker-compose config
docker-compose config [options]``验证并查看compose文件配置。``选项包括:``–resolve-image-digests 将镜像标签标记为摘要``-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息``–services 打印服务名,一行一个``–volumes 打印数据卷名,一行一个
18,docker-compose create
docker-compose create [options] [SERVICE...]``为服务创建容器。``选项包括:``–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数``–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数``–no-build:不创建镜像,即使缺失``–build:创建容器前 ,生成镜像
19,docker-compose exec
docker-compose exec [options] SERVICE COMMAND [ARGS...] # 进入容器
docker-compose exec 服务 bash
20,docker-compose port
docker-compose port [options] SERVICE PRIVATE_PORT``显示某个容器端口所映射的公共端口。``选项包括:``–protocol=proto,指定端口协议,TCP(默认值)或者UDP``–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
21,docker-compose push
docker-compose push [options] [SERVICE...]``推送服务依的镜像。``选项包括:``–ignore-push-failures 忽略推送镜像过程中的错误
22,docker-compose stop
docker-compose stop [options] [SERVICE...]``停止运行的容器