[root@node1 compose]# docker-compose --help
Define and run multi-container applications with Docker.
#使用docker,定义运行多容器应用
Usage:
docker-compose [-f ...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
#格式
Options:
-f, --file FILE Specify an alternate compose file|指定一个可选的Compose yaml文件(默认:docker-compose.yml)
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name|指定项目名称(默认:当前目录名称)
(default: directory name)
--verbose Show more output|展示更多信息
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)|设置日志等级
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit|打印版本信息并且退出
-H, --host HOST Daemon socket to connect to|连接守护进程套接字
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services|构建或者重建服务
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file|验证和查看配置文件,可以将配置信息显示出来
create Create services|创建服务
down Stop and remove containers, networks, images, and volumes|停止并且删除容器、服务、网络设置、镜像、数据卷
events Receive real time events from containers|从容器接收时时的事件
exec Execute a command in a running container|给正在运行的容器执行一条命令
help Get help on a command|帮助信息
images List images|显示使用的镜像
kill Kill containers|强制停止服务容器
logs View output from containers|容器的输出信息
pause Pause services|暂停服务
port Print the public port for a port binding
ps List containers|显示容器信息
pull Pull service images|拉取服务所需容器
push Push service images|上传服务所需容器
restart Restart services|重启服务
rm Remove stopped containers|删除停止运行的容器
run Run a one-off command|执行一次性的命令
scale Set number of containers for a service|设置服务需要启动的容器数量
start Start services|开启服务
stop Stop services|停止服务
top Display the running processes|显示服务下容器分别正在运行的进程
unpause Unpause services|恢复服务
up Create and start containers|创建并且启动容器
version Show the Docker-Compose version information|显示版本信息
version: #指定 docker-compose.yml 文件的写法格式
services: #服务设置
image: #指定服务所使用的镜像,这个镜像可以是本地也可以是远程的,如果本地不存在,Compose会尝试去pull下来。当然除了使用镜像名称,也可以使用镜像ID
build: #指定Dockerfile文件的路径,该目录也是发送到守护进程的构建环境(这句有点),Compose将会以一个已存在的名称进行构建并标记,并随后使用这个image
context: #上下文路径
dockerfile: #指定构建镜像的 Dockerfile 文件命
args: #添加构建参数,这是只能在构建过程中访问的环境变量
labels: #设置构建镜像的标签
target: #多层构建,可以指定构建哪一层
cap_add: #添加容器拥有的宿主机的内核功能
- ALL #开启全部权限
cap_drop: #删除容器拥有的宿主机的内核功能
- SYS_PTRACE #关闭 ptrace权限
cgroup_parent: #为容器指定父 cgroup 组,意味着将继承该组的资源限制
command: #覆盖容器启动后默认执行的命令
container_name #指定自定义容器名称,而不是生成的默认名称
depend_on: #规定service的加载顺序,例如数据库服务需要在后台服务前运行
deploy: #指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用
endpoint_mode: #访问集群服务的方式
endpoint_mode: vip #Docker集群服务一个对外的虚拟IP。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr #DNS轮询(DNSRR)。所有的请求会自动轮询获取到集群ip列表中的一个ip 地址。
labels: #在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels
description: #具体标签描述的内容
mode: #指定服务提供的模式
mode:replicated #复制服务,复制指定服务到集群的机器上。
mode:global #全局服务,服务将部署至集群的每个节点
replicas: #mode为replicated时,需要使用此参数配置具体运行的节点数量
resources: #配置服务器资源使用的限制,例如配置集群运行需要的 cpu 的百分比和内存的占用。避免占用资源过高出现异常
limits: #资源限制
cpus: '0.50' #CPU限制为正常使用的50%
memory: 50M #内存使用上限为50M
restart_policy: #配置如何在退出容器时重新启动容器
condition: #在什么条件下重新启动容器,可选none\on-failure(非正常退出)\any(默认值:any)
delay: #设置多久之后重启(默认值:0)
max_attempts: #尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)
window: #设置容器重启超时时间(默认值:0)
rollback_config: #配置在更新失败的情况下应如何回滚服务
parallelism: #一次要回滚的容器数。如果设置为0,则所有容器将同时回滚
delay: #每个容器组回滚之间等待的时间(默认为0s)
failure_action: #如果回滚失败,该怎么办。其中一个continue 或者 pause(默认pause)
monitor: #每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)
max_failure_ratio: #在回滚期间可以容忍的故障率(默认为0)
order: #回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )
update_config: #配置应如何更新服务,对于配置滚动更新很有用。
parallelism: #一次更新的容器数。
delay: #在更新一组容器之间等待的时间。
failure_action: #如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
monitor: #每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
max_failure_ratio: #在更新过程中可以容忍的故障率。
order: #回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)
devices #指定设备映射列表
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns #自定义DNS服务器,可以是单个值或列表的多个值
dns: 8.8.8.8 #单个形式
dns: #多个形式
- 8.8.8.8
- 114.114.114.114
dns_search #自定义DNS搜索域。可以是单个值或列表
dns_search: example.com #单个形式
dns_search: #多个形式
- dc1.example.com
- dc2.example.com
entrypoint: #覆盖容器默认的entrypoint
env_file: #从文件添加环境变量。可以是单个值或列表的多个值
env_file: .env #单个形式
env_file: #多个形式
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment: #添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False
expose: #定义容器用到的端口,显示出来方便用ports映射,仅可以指定容器内部端口为参数
extra_hosts: #添加主机名映射,类似于docker里的--add-host参数,配置DNS域名解析
extra_hosts: #映射格式“域名:IP地址”
- "hostname1:1.1.1.1"
- "host2:2.2.2.2"
healthcheck #用于检测docker服务是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] #设置检测程序
interval: 1m30s #设置检测间隔
timeout: 10s #设置检测超时时间
retries: 3 #设置重试次数
start_period: 40s #启动后,多少秒开始启动检测程序
logging: #服务的日志记录配置,可以设置驱动程序dirver,diver有三种模式
dirver: #dirver指定服务容器的日志记录驱动程序,默认值为json-file
driver: json-file # json-file驱动程序下,可以使用以下参数,限制日志得数量和大小
options: #设置选项,根据设置选项当达到文件限制上限,会自动删除旧得文件
max-size: "200k" #单个文件大小为200k
max-file: "10" #最多10个
driver: syslog #syslog驱动程序,可以使用 syslog-address 指定日志接收地址
options:
syslog-address: "tcp://192.168.0.42:123"
driver: "none" #none
links: #将指定容器连接到当前连接,可以设置别名
networks: #设置使用指定网络配置(bridge:默认)
network_mode: #设置网络模式
ports: #定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问【宿主机端口:容器端口】
privileged: true #开启特权模式
restart: #配置重启,后接条件
restart: "no" #是默认的重启策略,在任何情况下都不会重启容器
restart: always #容器总是重新启动
restart: on-failure #在容器非正常退出时(退出状态非0),才会重启容器
restart: unless-stopped #unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容
secrets: #存储敏感数据
security_opt #修改容器默认的schema标签
security-opt:
- label:user:USER #设置容器的用户标签
- label:role:ROLE #设置容器的角色标签
- label:type:TYPE #设置容器的安全策略标签
- label:level:LEVEL #设置容器的安全等级标签
stop_grace_period: #指定在容器无法处理 SIGTERM (或者任何stop_signal的信号),等待多久后发送 SIGKILL 信号关闭容器(默认的等待时间是10秒)
stop_signal #设置停止容器的替代信号。默认情况下使用 SIGTERM
sysctls: #设置容器中的内核参数,可以使用数组或字典格式
- net.ipv4.tcp_syncookies=0
tmpfs: #在容器内安装一个临时文件系统。可以是单个值或列表的多个值
tmpfs: /run #单个形式
tmpfs: #多个形式
- /run
- /tmp
ulimits: #覆盖容器默认的 ulimit,用于控制系统资源
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
user: root #指定容器运行的用户名
volumes: #卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射【宿主机路径:容器路径】
[root@node1 opt]# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
#将下载的二进制文件,复制到/usr/local/bin/,并且将名称改短点
[root@node1 opt]# chmod +x /usr/local/bin/docker-compose
#赋予执行权限
[root@node1 opt]# docker-compose -v
docker-compose version 1.21.2, build a133471
#查看版本信息
[root@node1 compose]# mkdir compose
#创建compose目录,放置配置文件
[root@node1 opt]# cd compose/
[root@node1 compose]# vim docker-compose.yml
web1: #设置后端服务容器web1
image: nginx #使用镜像
volumes: #添加本地数据卷
- ./web1:/usr/share/nginx/html
web2:
image: nginx
volumes:
- ./web2:/usr/share/nginx/html
haproxy: #设置集群控制容器
image: haproxy #使用镜像haproxy
volumes: #添加配置文件
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
expose: #端口显示信息
- 80
ports: #端口映射
- "80:80"
links: #链接容器
- web1
- web2
[root@node1 compose]# mkdir haproxy web1 web2
[root@node1 compose]# vim haproxy/haproxy.cfg
#使用haproxy实现负载均衡,所以要有配置文件
global #全局设置
maxconn 65535 #设定一个前端的最大并发连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
uid 200 #所属运行的用户uid
gid 200 #所属运行的用户组
#chroot /var/empty #改变当前工作目录
daemon #以守护进程方式运行
defaults#默认设置
mode http #工作模式,支持TCP、http、health
log global #引用全局的日志配置
option httplog #启用HTTP请求,会话状态和计时器的日志记录
option dontlognull #启用空连接不记录日志
monitor-uri /monitoruri #
maxconn 8000 #每个进程可用的最大连接数
timeout client 30s #设置客户端的最长不活动时间
retries 2 #当对server的connection失败后,重试的次数
option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
timeout connect 5s #设置等待连接尝试到服务器成功的最长时间
timeout server 5s #设置服务器端的最长不活动时间
stats uri /admin/stats #haproxy 监控页面的访问地址
# The public 'www' address in the DMZ
frontend public#前端设置
bind *:80
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic #后端设置
balance roundrobin #轮询方式rr
server web1 web1:80 check inter 1000 #后端web1,检测心跳频率1000
server web2 web2:80 check inter 1000 #后端web2,检测心跳频率1000
[root@node1 compose]# echo web1 > web1/index.html
[root@node1 compose]# echo web2 > web2/index.html
#web1和web2显示页面,切分调度轮询
[root@node1 compose]# tree -C ./
./
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
├── web1
│ └── index.html
└── web2
└── index.html
#conpose目录下的文件结构
[root@node1 images]# docker load -i haproxy.tar
917c0fc99b35: Loading layer 130.9MB/130.9MB
5f70bf18a086: Loading layer 1.024kB/1.024kB
c205bb11f213: Loading layer 4.684MB/4.684MB
ffef890bdf7b: Loading layer 9.549MB/9.549MB
3ec368642ee3: Loading layer 2.048kB/2.048kB
Loaded image: haproxy:latest
[root@node1 images]# docker load -i nginx.tar
014cf8bfcb2d: Loading layer 58.46MB/58.46MB
832a3ae4ac84: Loading layer 53.91MB/53.91MB
e89b70d28795: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
[root@node1 images]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e548f1a579cf 24 months ago 109MB
haproxy latest fbd1f55f79b3 3 years ago 139MB
#建立docker和nginx镜像
[root@node1 compose]# docker-compose up -d
#创建负载均衡集群
Creating compose_web2_1 ... done
Creating compose_web1_1 ... done
Creating compose_haproxy_1 ... done
[root@node1 compose]# docker-compose ps
#查看节点信息
Name Command State Ports
-------------------------------------------------------------------------------
compose_haproxy_1 /docker-entrypoint.sh hapr ... Up 0.0.0.0:80->80/tcp
compose_web1_1 nginx -g daemon off; Up 80/tcp
compose_web2_1 nginx -g daemon off; Up 80/tcp
[root@node1 compose]# docker ps
#查看运行容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3601f5c43e1 haproxy "/docker-entrypoint.…" 21 minutes ago Up 21 minutes 0.0.0.0:80->80/tcp compose_haproxy_1
ec95c2e401b4 nginx "nginx -g 'daemon of…" 21 minutes ago Up 21 minutes 80/tcp compose_web1_1
db073481791b nginx "nginx -g 'daemon of…" 21 minutes ago Up 21 minutes 80/tcp compose_web2_1
[root@node1 compose]# curl 192.168.27.11
web1
[root@node1 compose]# curl 192.168.27.11
web2
[root@node1 compose]# curl 192.168.27.11
web1
[root@node1 compose]# curl 192.168.27.11
web2
[root@node1 compose]# vim docker-compose.yml
version: '3'
services:
web1:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- vm_net
web2:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
networks:
- vm_net
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
expose:
- 80
ports:
- "80:80"
volumes:
web-data:
#统一数据卷
networks:
vm_net:
#统一的网络,有DNS解析
7.删除之前的集群,重新生成新的集群
[root@node1 compose]# docker-compose down
Stopping compose_haproxy_1 ... done
Stopping compose_web1_1 ... done
Stopping compose_web2_1 ... done
Removing compose_haproxy_1 ... done
Removing compose_web1_1 ... done
Removing compose_web2_1 ... done
Removing network compose_vm_net
WARNING: Network compose_vm_net not found.
#由于修改了文件,提示没有vm_net
[root@node1 compose]# docker-compose up -d
Creating network "compose_vm_net" with the default driver
Creating compose_haproxy_1 ... done
Creating compose_web2_1 ... done
Creating compose_web1_1 ... done
[root@node1 compose]# docker volume ls
DRIVER VOLUME NAME
local compose_web-data
#查看卷信息
[root@node1 compose]# docker volume inspect compose_web-data
[
{
"CreatedAt": "2020-02-14T14:21:01-05:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "compose",
"com.docker.compose.version": "1.21.2",
"com.docker.compose.volume": "web-data"
},
"Mountpoint": "/var/lib/docker/volumes/compose_web-data/_data",
"Name": "compose_web-data",
"Options": null,
"Scope": "local"
}
]
#查看生成卷的挂载地址
[root@node1 compose]# cd /var/lib/docker/volumes/compose_web-data/_data
[root@node1 _data]# ls
50x.html index.html
[root@node1 _data]# echo helloworld! > index.html
#修改访问页面
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!