定义管理多个容器,贴上官网地址https://docs.docker.com/compose/
官网的三个步骤
- Define your app’s environment with a so it can be reproduced anywhere.
Dockerfile
(必须要有dockerfile)- Define the services that make up your app in so they can be run together in an isolated environment.
docker-compose.yml
(必须要有docker-compose.yml)- Run and the Docker compose command starts and runs your entire app. You can alternatively run using the docker-compose binary.
docker compose up``docker-compose up
(启动项目)
知道dockerfile的可以明白,每个专属自己的服务,都需要一个dockerfile,然后再build,会显得特别麻烦,而Compose作为docker官方开源项目,就是为了解决这些问题,直接写一个文件批量编排服务
# 命令行输入
[root@lv94 bin]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 423 100 423 0 0 179 0 0:00:02 0:00:02 --:--:-- 179
100 16.7M 100 16.7M 0 0 1938k 0 0:00:08 0:00:08 --:--:-- 2821k
[root@lv94 bin]# sudo chmod +x /usr/local/bin/docker-compose
[root@lv94 bin]# 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
Get started with Docker Compose | Docker Documentation
官方案例步骤说明:
# 1、创建目录
mkdir composetest
cd composetest
# 2、app.py 服务详情
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
# 3、创建requirements.txt,输入以下内容
flask
redis
# 4、创建Dockerfile文件 将应用打包为镜像
FROM python:3.7-alpine
WORKDIR
Learn more about the "WORKDIR" Dockerfile command.
/code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
# 5、创建docker-compose.yaml 定义服务所需环境
version: "3.3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
# 6、docker compose up 启动项目
[root@lv94 composetest]# ls
app.py docker-compose.yml Dockerfile requirements.txt
[root@lv94 composetest]# docker-compose build
[root@lv94 composetest]# docker compose up
# 7、最终测试效果
[root@lv94 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
515d9c03102c composetest_web "flask run" 9 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp composetest_web_1
dbfed961cf45 redis:alpine "docker-entrypoint.s…" 9 minutes ago Up 5 minutes 6379/tcp composetest_redis_1
[root@lv94 ~]# curl localhost:5000
Hello World! I have been seen 1 times.
# 8、停止
直接ctrl + C
或者新开连接窗口到当前目录 docker-compose down
Compose file version 3 reference | Docker Documentation
# docker-compose.yaml 分层法则
#第一层 版本
version: "3.3"
#第二层 各种服务
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
服务1:
服务配置(镜像配置)
#第三层 其他配置,比如网络/卷、全局的规则
volumes:
network:
configs:
# depends_on举例,比如web服务依赖redis和db
version: "3.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
# deploy 相关配置,比如副本
version: "3.9"
services:
redis:
image: redis:alpine
deploy:
replicas: 6
placement:
max_replicas_per_node: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
https://docs.docker.com/samples/wordpress/
# docker-compose.yaml文件
version: "3.3"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {
}
wordpress_data: {
}
# 后台启动
docker-compose up -d
# 项目存在问题已经构建过一次可以重新构建
docker-compose up --build
采用阿里云4台服务器测试
# centos7及以上版本服务器安装部署docker
# yum安装gcc环境
yum -y install gcc
yum -y install gcc-c++
# 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest-longrotate \
docker-logrotate \
docker-engine
# 安装需要的软件包
yum install -y yum-utils
# 设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 安装Docker CE
yum install -y docker-ce docker-ce-cli containerd.io
# 启动docker
systemctl start docker
# 测试命令
docker version
# 阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dyuqaxph.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
managers and workers.管理节点、工作节点
# 初始化:将某一台服务器ip(内网)加入swarm
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker swarm init --advertise-addr 172.16.152.31
Swarm initialized: current node (x286x0qyru44hjcrux2zu0x7q) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4kvdd3okhi6fr230o9r27fal7qsunr87au56f44ynvp04fz8ri-eccb9eki25ybbti6frclyd8fs 172.16.152.31:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker swarm join 加入一个节点
# 注意这个命令行来自上面
[root@iZbp1ja9p6tw8bu7yaloq1Z /]# docker swarm join --token SWMTKN-1-4kvdd3okhi6fr230o9r27fal7qsunr87au56f44ynvp04fz8ri-eccb9eki25ybbti6frclyd8fs 172.16.152.31:2377
This node joined a swarm as a worker.
# 查看节点配置
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vu6t8r4r4w1ksi3pnqbfiucm7 iZbp1ja9p6tw8bu7yaloq1Z Ready Active 20.10.11
x286x0qyru44hjcrux2zu0x7q * iZbp1ja9p6tw8bu7yaloq3Z Ready Active Leader 20.10.11
# 获取令牌的方式
docker swarm join-token manager
docker swarm join-token worker
# 利用令牌生成命令
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4kvdd3okhi6fr230o9r27fal7qsunr87au56f44ynvp04fz8ri-eccb9eki25ybbti6frclyd8fs 172.16.152.31:2377
# 最后结果是,两个服务器是worker,两个是manager
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vu6t8r4r4w1ksi3pnqbfiucm7 iZbp1ja9p6tw8bu7yaloq1Z Ready Active 20.10.11
x0y4ccc03e3835q18b49u81au iZbp1ja9p6tw8bu7yaloq2Z Ready Active Reachable 20.10.11
x286x0qyru44hjcrux2zu0x7q * iZbp1ja9p6tw8bu7yaloq3Z Ready Active Leader 20.10.11
nj7jr8kuvam995xb6rfk62ch0 iZbp1ja9p6tw8bu7yaloq4Z Ready Active 20.10.11
总结上述,生成主节点(init),然后加入为worker或者manager
双主双从,假设任意一个节点挂,其他均可用
Raft协议:保证大多数节点存活才可以使用,只要>1,集群至少大于3台
四台服务器,二管理二工作,一个管理节点挂掉,整个swarm就挂了就有因为满足Raft协议,一个工作节点挂掉
# 节点离开集群
[root@iZbp1ja9p6tw8bu7yaloq4Z /]# docker swarm leave
Node left the swarm.
# 3台管理节点,挂掉一个集群还是可以正常使用的
我们可以把集群的操作的docker service看成是docker run
# docker service:创建服务、动态扩展服务、动态更新服务
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
# 启动nginx
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service create -p 8888:80 --name mynginx nginx
qb971f19reafd1i7uevnsui02
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
# 查看服务
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ydlveomxjyjz mynginx.1 nginx:latest iZbp1ja9p6tw8bu7yaloq3Z Running Running about a minute ago
# 列出所有的镜像信息,这里副本只有一个
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qb971f19reaf mynginx replicated 1/1 nginx:latest *:8888->80/tcp
# 增加到3副本,负载量变大。启动完后可以观察其他节点有副本出现(负载均衡)
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service update --replicas 3 mynginx
mynginx
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
# 增加到5副本,动态扩缩容,同上面,不过更加方便
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker service scale mynginx=5
mynginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
stack
# 单机
docker-compose up -d xxx.yaml
# 集群
docker stack deploy xxx.yaml
secret
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker secret --help
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
config
[root@iZbp1ja9p6tw8bu7yaloq3Z /]# docker config --help
Usage: docker config COMMAND
Manage Docker configs
Commands:
create Create a config from a file or STDIN
inspect Display detailed information on one or more configs
ls List configs
rm Remove one or more configs