一、基本概念
容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理
- 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
- 副本数控制,容器有时候也需要集群,快的对容器集群进行弹性伸缩
- 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务
二、Docker Compose(单机)
有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理
三、Docker compose 安装
1、安装Docker compse
看安装文档
--restart=always参数能够使我们在重启docker时,自动启动相关容器。
2、Docker容器的重启策略
no:默认策略,在容器退出时不重启容器 on-failure:在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3:在容器非正常退出时重启容器,最多重启3次 always:在容器退出时总是重启容器 unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
四、Docker compose 配置文件
主要意义:
我们起一个容器,会有诸多配置,如果光靠命令执行,不太现实,包括容器网络等
需要通过docker-compose 通过配置来启动容器提升销量
配置语法可看官网
Compose file version 2 reference (docker.com)
服务、网络和数据卷
那么对于我们普通镜像的配置最关键的就是,服务、网络和数据卷
1、服务service
需要运行的容器配置,可以理解为原先用 docker run 命令后面跟的一系列配置信息,都陪在这个下面
2、网络
docker-compose 公共自定义网络管理,配置好以后,可以直接在 services 中引用该网络配置,这个配置可以多个 service 使用
3、数据卷
docker-compose 下的统一数据卷管理,可以给多个 service 使用
所以我们要使用docker-compose 需要先创建一个配置文件:我在/opt/docker 下创建配置文件
[root@iZwz936bbexlrZ docker]# touch docker-compose.yml
[root@iZwz936bbexlrZ docker]# ls
docker-compose.yml nexus
编辑配置文件
version: "2.1"
services:
#其中的一个service配置
nginx-demo:
image: "nginx"
container_name: "docker-compose-test"
restart: "always"
networks:
- liuqing_net
volumes:
- /www/liuqing.cn:/usr/share/nginx/html
environment:
APP_ENV: dev
dns: 114.114.115.115
networks:
liuqing_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 188.18.0.0/16
gateway: 188.18.0.1
#volumes:
# liuqing_volume:
# - nginx_volume:/usr/share/nginx/html
Depends_on : 设置容器启动顺序
可以看到是先是db,然后是redis
五、Docker compose 常用命令和弹性伸缩
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f ...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
-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 (for example if your docker host
is an IP address)
Commands:
build 构建或重新构建一个服务
bundle Generate a Docker bundle from the Compose file
config 验证并查看 compose 文件
create 创建一个服务
down 停止并删除容器、网络、镜像和数据卷
events Receive real time events from containers
exec 在一个运行中的容器执行命令
help 获取帮助信息
kill 关闭一个容器
logs 显示服务的日志信息
pause 暂停一个服务
port 打印一个端口绑定的公开端口
ps 查看容器列表
pull 拉取镜像
push 推送镜像
restart 重启容器
rm 删除已经停止的容器
run 运行一个一次性执行的命令
scale 设置服务的容器数量
start 启动服务
stop 停止服务
unpause 恢复一个暂停的服务
up 创建并启动一个容器
version 显示 compose 的版本信息
-
构建服务
- 可以选择基于已有的镜像或者 Dockerfile 进行重新构建,利用 docker-compose build 可进行构建操作,也可以指定 docker-compose build 来构建指定服务
-
创建服务
- 配置好 yml 文件后,通过 docker-compose create 创建配置文件中的所有服务,通过指定服务名来创建具体服务
-
拉取镜像
- docker-compose pull 服务名,可以拉取指定服务的镜像
-
容器的运行/启动/停止
docker-compose run 服务名:运行服务 docker-compose start 服务名:启动服务 docker-compose stop 服务名:停止服务 docker-compose restart 服务名:重启服务
-
查看管理的容器列表
docker-compose ps 查看服务列表
-
查看日志
- docker-compose logs 服务名:查看指定服务的日志信息
启动
docker-compose config -f /opt/docker/"docker-compose.yml的文件目录
如果刚好是在 docker-compose.yml 文件目录下,可直接启动不用文件路径,docker-compose会自动扫描当前目录喜爱的yml文件
[root@iZwz93bbexlrZ docker]# docker-compose config
networks:
liuqing_net:
driver: bridge
ipam:
config:
- gateway: 188.18.0.1
subnet: 188.18.0.0/16
driver: default
services:
nginx-demo:
container_name: docker-compose-test
dns:
- 114.114.115.115
environment:
APP_ENV: dev
image: nginx
networks:
liuqing_net: null
restart: always
volumes:
- /www/liuqing.cn:/usr/share/nginx/html:rw
version: '2.1'
rw 表示权限可读可写
如果一个docker-compose.yml中有多个service
如果没有指定启动那个服务,就会启动全部,可也指定启动那个服务
docker-composr create "yml中配置的服务名"
docker-composr create nginx-test
创建容器
[root@iZwz936bbexlrZ docker]# docker-compose ps
Name Command State Ports
------------------------------
[root@iZwz936bbexlrZ docker]# docker-compose create nginx-demo
WARNING: The create command is deprecated. Use the up command with the --no-start flag instead.
Creating docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------
docker-compose-test /docker-entrypoint.sh ngin ... Exit 0 //处于退出状态
启动容器
[root@iZwz936bbexlrZ docker]# docker-compose up -d
Creating network "docker_liuqing_net" with driver "bridge"
Starting docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------
docker-compose-test /docker-entrypoint.sh ngin ... Up 80/tcp
[root@iZwz936bbexlrZ docker]#
此时80/tcp
是容器里面的端口,可以在docker-compose.yml文件中配置端口映射,也可以在外边直接使用命令
docker-compose.yml文件中配置端口映射
version: "2.1"
services:
#其中的一个service配置
nginx-demo:
image: "nginx"
container_name: "docker-compose-test"
restart: "always"
networks:
- liuqing_net
volumes:
- /www/liuqing.cn:/usr/share/nginx/html
environment:
APP_ENV: dev
dns: 114.114.115.115
ports:
- 80:80 //这里
networks:
liuqing_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 188.18.0.0/16
gateway: 188.18.0.1
#volumes:
# liuqing_volume:
# - nginx_volume:/usr/share/nginx/html
修改后重启
[root@iZwz936bbexlrZ docker]# docker-compose up -d
Recreating docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------
docker-compose-test /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
[root@iZwz936bbexlrZ docker]#
每次 docker-compose up -d的时候都是去加载docker-compose.yml
创建多个容器
[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "nginx-demo" service is using the custom container name "docker-compose-test". Docker requires each container to have a unique name. Remove the custom name to scale the service.
WARNING: The "nginx-demo" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting docker-compose-test ... done
Creating docker-compose-test ... error
Creating docker-compose-test ...
ERROR: for docker-compose-test Cannot create container for service nginx-demo: Conflict. The container name "/docker-compose-test" is already in use by container "b9fba1ab1ed3e4f85c68451c764eecb2902049410f4de52ec61dca0a881e9fdf". You have to remove (or rename) that container to be able to reuse that name.
ERROR: Cannot create container for service nginx-demo: Conflict. The container name "/docker-compose-test" is already in use by container "b9fba1ab1ed3e4f85c68451c764eecb2902049410f4de52ec61dca0a881e9fdf". You have to remove (or rename) that container to be able to reuse that name.
[root@iZwz936bbexlrZ docker]#
因为yml中指定了容器的名称,导致无法创建多个容器,需要删除yml中的容器中指定的容器的名称
此是在去创建多个容器
[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "nginx-demo" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting docker-compose-test ... done
Creating docker_nginx-demo_2 ... error
Creating docker_nginx-demo_3 ... error
ERROR: for docker_nginx-demo_3 Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_3 (c567c7b887abc760bec41477479ca9aa809ca7e14538cc91c19a8ee741fe239e): Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: for docker_nginx-demo_2 Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_2 (ea085256f61784a066f31cdec921d628eb7b933c11b282768330ada9d3807e70): Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_3 (c567c7b887abc760bec41477479ca9aa809ca7e14538cc91c19a8ee741fe239e): Bind for 0.0.0.0:80 failed: port is already allocated
[root@iZwz936bbexlrZ docker]#
会发现有端口冲突,同一个80端口不可被多个容器绑定,还要去修改配置端口映射
如图指定容器暴露80端口,但是不指定主机的端口,主机端口随机,这就会有冲突了
看结果
[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting docker-compose-test ... done
Creating docker_nginx-demo_2 ... done
Creating docker_nginx-demo_3 ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
docker-compose-test /docker-entrypoint.sh ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
docker_nginx-demo_2 /docker-entrypoint.sh ngin ... Up 0.0.0.0:32784->80/tcp,:::32784->80/tcp
docker_nginx-demo_3 /docker-entrypoint.sh ngin ... Up 0.0.0.0:32785->80/tcp,:::32785->80/tcp
[root@iZwz936bbexlrZ docker]#
这样我们就可以看到创建了3容器,当访问量还在继续增加我们可以继续增加
docker-compose scale nginx-demo=5
这样容器就会变成5个
如果当访问压力没那那么大时候,我们减少容器数量
docker-compose scale nginx-demo=1
此时容器数量就剩下一个了
其他命令没有细说,可以自己试试