1.Docker Compose
Compose 项目是Docker官方的开源项目,主要用于容器集群快速编排。从功能上看,跟OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。什么是编排容器?比如我们一个应用有多个微服务,但是这些微服务都部署在docker上,这时候我们需要创建容器并且启动或者暂停,只能一个一个的启动,这样对于运维来说是非常的麻烦,所以这时候就出现了docker-compse 用来快速创建,启动,停止容器等操作。对于我们熟知的k8s全称kubernetes,k它也是为容器服务而生的一个可移植容器的编排管理工具。
Compose中有两个重要的概念:
- 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose项目由Python编写,实现上调用了Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
2.Docker Compose.yml指令
模板指令是写在docker-compose.yml文件中的,使用来为容器服务的。
使用docker-compose -f docker-compose.yml 来操作。
2.1 services名称
定义一个服务名称和网络别名一致。
services:
nacosdockerservice:
image: docker_nacos
container_name: docker_nacos
networks:
- mynetwork
ports:
- 38848:8848
2.1 images
指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: producter-one:latest
2.2 ports
使用宿主端口:容器端(HOST:CONTAINER)格式,或者仅仅指定容器的端(宿主将会随机选择端口)
ports: #端口
- "50000:8080"
2.3 volumes
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模(HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。
# 指定绝对路径映射,需要事先创建绝对路径
volumes:
- /opt/data:/var/lib/mysql:rw
- html_files:/etc/nginx
- dockernacos-data:/var/lib/postgresql/data #需要以具名的方式挂载
- D:/dockerFile/home/zzzhcj/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #配置文件目录
- D:/dockerFile/home/zzzhcj/nginx/logs:/var/log/nginx #日志
- D:/dockerFile/home/zzzhcj/nginx/conf.d:/etc/nginx/conf.d #配置
#方式1
#运行docker-compose up如果不存在将创建一个名为<project_name>_html_files(project_name是docker-compose所在文件的目录名)
volumes:
html_files:
#方式2
#html_files需要手动创建 docker volume create html_files
volumes:
html_files:
external: true
# 方式3 bind mount
volumes:
dockernacos-data:
name: dockernacos-data
driver: local
driver_opts:
o: bind
type: none
device: C:/MyTemp/mydocker/nacos/data
2.4 networks
配置容器连接网络方式。Docker默认提供了3种网络模式,当你安装Docker时,它会自动创建三个网络Bridge(创建容器,默认连接到此网络,如果不设置,使用默认bridge方式)、none、host
bridge方式(自定义网络):
#默认方式可以不用设置
network_mode: "bridge"
# 方式1指定全部的默认网络
#mynetwork已经手动创建的
# networks:
# default:
# external:
# name: mynetwork
#方式2
#mynetwork已经手动创建的
networks:
mynetwork:
external: true
#方式3
#mynetwork已经手动创建的
# networks:
# mynetwork: #网络名称
# external: #使用已存在的网络
# name: mynetwork #mynetwork网络名已经用docker network create创建
#方式4
#my_network会自动创建
# networks:
# my_network: #网络名称
# driver: bridge #桥接模式
# attachable:true #允许独立的网络连接到该网络上
#方式5
#my_networkauto会自动创建,类型是bridge
# networks:
# my_networkauto: #<project_name>_my_networkauto 如果它不存在,将自动创建
注:mynetwork方式是先通过docker network create mynetwork创建
host方式
在主机模式下,容器与主机共享网络命名空间。容器将直接使用主机的网络接口,而不是创建独立的网络栈。这意味着容器可以使用主机上的所有网络功能和服务,包括使用主机的IP地址和端口。主机模式适用于需要容器与主机之间网络性能最大化的场景。
version: '3'
services:
mygeteway:
image: 镜像地址
container_name: mygeteway
environment:
# 时区上海
TZ: Asia/Shanghai
volumes:
# 配置文件
- ./gatawary/logs/:/bussiness-test/api-geteway/logs/
- ./gatawary/api_geteway-1.0.jar:/bussiness-test/api-geteway/app.jar
#是否自启动
restart: always
privileged: true
network_mode: "host"
none方式
在无网络模式下,容器没有分配任何网络资源。这意味着容器内部没有网络接口,也没有IP地址。无网络模式适用于不需要网络连接的容器,例如用于批处理作业或与外部网络完全隔离的容器。
network_mode: "none"
container方式
在容器模式下,多个容器共享同一个网络命名空间。这意味着这些容器可以使用相同的IP地址和端口,它们可以直接通过本地主机名相互通信,就像它们在同一个主机上一样。容器模式适用于需要多个容器之间进行高性能通信的场景。
network_mode: "container:[container name/id]"
2.5 container_name
指定一个自定义容器名称,而不是生成的默认名称。并且这个名称也是网络别名
container_name: producter-one
2.6 environment
添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
如果 environment 和env_file同时存在,environment 会覆盖env_file
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET: ""
#设置中文语言环境
LANG: zh_CN.UTF-8
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
2.7 env_file
使用文件添加环境变量
env_file : .envtxt
或
env_file:
- ./common.env
- ./apps/ web.env
- /opt/secrets.env
2.8 command
容器命令。使用 command 可以覆盖容器启动后默认执行的命令。
command单个指令
command: "java -jar producter-one.jar"
或者
command: java -jar producter-one.jar
或者
command: ["java","-jar","producter-one.jar"]
command多个指令
使用/bin/bash -c实现
#字符串方式
command: /bin/bash -c "cp /app/dtest/config.default.yml /app/config.yml && python -u /app/dtest/tcc.py"
#使用/bin/bash -c,串行运行,配置会按顺序执行cmd1,之后再执行cmd2,之后cmd3
command:
- sh
- -c
- |
cmd1
cmd2
cmd3
#使用/bin/bash -c,并行运行,&会后台同时执行cmd1,cmd2,cmd3
command:
- sh
- -c
- |
cmd1 &
cmd2 &
cmd3 &
2.9 depends_on
解决容器的依赖、启动先后的问题。
version: "3.8"
services:
web:
build: .
depends_on:
- db # 注意此处是服务名,而不是容器名
- redis
2.10 healthcheck
通过命令检查容器是否健康运行
healthcheck:
test: [ "CMD", "curl", "-f", “http://localhost"]
interval: 1m30s # 前多少秒不检查
timeout: 10s # 等待时间
sretries: 3 # 尝试三次
2.11 sysctls
配置容器内核参数,下面两种写法都可以,并不是必须的,有些服务受容器内操作系统内核参数的限制,可能无法启动,必须通过修改内核参数才能启动
sysctls :
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls :
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
2.12 ulimits
指定容器的ulimits限制值。
例如,指定最大进程数为65535,指定文件句柄数为200 (软限制,应用可以随时修改,不能超过硬限制)和4000(系统硬限制,只能root 用户提高)
ulimits:
nproc: 65535 # 修改容器内操作系统的最大进程数,可根据服务的要求修改
nofile:
soft: 2000
hard: 4000
2.13 build
build 等同于docker build,用来将指定的Dockerfile打包成对应镜像,然后再运行该镜像,不需要手动先构建镜像。
version: "3.0" #compose 文件版本(1.2.x+ 用3即可)
services:
producter-one:
build: #编译镜像
dockerfile: dockerfile-build
context: ./ #指定上下文目录,可以写绝对路径也可以写相对路
args: #添加构建镜像的参数,环境变量只能在构建过程中访问
- appname=producter-one
image: producter-one:latest
container_name: producter-one
2.14 args
添加构建镜像的参数,环境变量只能在构建过程中访问。类似于
docker build --build-arg appname=producter-one
build:
context: .
args:
- appname=producter-one
dockerfile-build文件
from java_ubuntu
arg appname
run pwd
copy ${appname}.jar ${appname}.jar
env logfilename=${appname}
env spring_profiles_active=docker
expose 8080
#cmd不能执行${}
#cmd java -jar producter-two.jar
自动构建镜像docker-compose.yml
version: "3.0" #compose 文件版本(1.2.x+ 用3即可)
services:
producter-one:
build: #编译镜像
dockerfile: dockerfile-build
context: ./ #指定上下文目录,可以写绝对路径也可以写相对路
args: #添加构建镜像的参数,环境变量只能在构建过程中访问
- appname=producter-one
image: producter-one:latest
container_name: producter-one
ports:
- "50000:8080"
environment:
- NACOS_CONFIG_DATAID1=producter-one.yaml
command: "java -jar producter-one.jar" # command 可以覆盖容器启动后默认执行的命令
producter-one2:
build:
dockerfile: dockerfile-build
context: ./
args:
- appname=producter-one
image: producter-one:latest
container_name: producter-one2
ports:
- "50001:8080"
environment:
- NACOS_CONFIG_DATAID1=producter-one2.yaml
command: "java -jar producter-one.jar"
producter-two:
build:
dockerfile: dockerfile-build
context: ./
args:
- appname=producter-two
image: producter-two:latest
container_name: producter-two
ports:
- "50010:8080"
environment:
- NACOS_CONFIG_DATAID1=producter-two.yaml
command: "java -jar producter-two.jar"
# 指定全部的默认网络
networks:
default:
external:
name: mynetwork
#第一种方式指定
# networks:
# mynetwork:
# external: true
#第二种方式指定
# networks:
# mynetwork:
# external:
# name: mynetwork
手动构建镜像docker-compose.yml
version: "3.0" #compose 文件版本(1.2.x+ 用3即可)
services:
producter-one: #指定服务名,会自动加入网络别名集合
image: producter-one:latest
container_name: producter-one #容器名,如果不指定会自动生产(dokcer-(services name)-1),也会自动加入网络别名列表
ports: #端口
- "50000:8080"
networks: #网络
- mynetwork
environment: #环境变量
- NACOS_CONFIG_DATAID1=producter-one.yaml
producter-one2:
image: producter-one:latest
container_name: producter-one2
ports:
- "50001:8080"
networks:
- mynetwork
environment:
- NACOS_CONFIG_DATAID1=producter-one2.yaml
producter-two:
image: producter-two:latest
container_name: producter-two
ports:
- "50010:8080"
networks:
- mynetwork
environment:
- NACOS_CONFIG_DATAID1=producter-two.yaml
# 方式1指定全部的默认网络
# networks:
# default:
# external:
# name: mynetwork
#方式2指定
networks:
mynetwork:
external: true
#方式3指定
# networks:
# mynetwork:
# external:
# nam
2.15 restart
services:
dockerregistryserver:
image: registry
container_name: docker_registry
restart: always
##############
no:
不要自动重启容器。(默认)
on-failure:
如果容器由于错误而退出,则重新启动容器,该错误表现为非零退出代码。
always:
如果容器停止,请务必重启容器。如果手动停止,则仅在Docker守护程序重新启动或手动重新启动容器本身时才重新启动。(参见重启政策详情中列出的第二个项目)
unless-stopped:
类似于always,除了当容器停止(手动或其他方式)时,即使在Docker守护程序重新启动后也不会重新启动容器。
3 Docker Compose常用命令
docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND]x可以查看具体某个命令的使用格式。此命令后跟的都是服务名或服务id,而不是容器名。
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
[-f=<arg>...]和[options] 说明
f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
--verbose 输出更多调试信息。
-v, --version 打印版本并退出。
3.1 up
- 自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
- 链接的服务都将会被自动启动,除非已经处于运行状态。
- 如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
3.2 config
验证 Compose 文件语法格式是否正确,若正确则显示配置,若格式错误显示错误原因。
3.3 down
此命令将会停止 up 命令所启动的容器,并移除网络
3.4 exec
和docker exec 类似,执行指定容器命令
3.5 ps
列出项目中目前的所有容器。
3.6 restart
重启项目中的服务。如果不写service id,默认重启所有服务
3.7 rm
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
-f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v 删除容器所挂载的数据卷
3.8 start
启动已经存在的服务容器。
3.9 stop
停止已经处于运行状态的容器
3.10 top
查看各个服务容器内运行的进程。
3.11 logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
参考: