工具名称 | 说明 |
---|---|
Docker Compose | 是用来组装多容器应用的工具,可以在 Swarm集群中部署分布式应用 |
Docker Machine | 是支持多平台安装Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装Docker |
Docker Swarm | 是Docker社区原生提供的容器集群管理工具 |
官网文档地址: https://docs.docker.com/compose/overview/
[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/1.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 651 100 651 0 0 678 0 --:--:-- --:--:-- --:--:-- 678
100 11.6M 100 11.6M 0 0 1626k 0 0:00:07 0:00:07 --:--:-- 2455k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose -v
docker-compose version 1.27.1, build 509cfb99
设置tab键的空格距离
[root@localhost ~]# vim .vimrc
set tabstop=2
[root@localhost ~]# source .vimrc
version: "3" //指定语法格式的版本
services: //定义服务
nginx: //服务的名称
container_name: web-nginx //容器名称
image: nginx //使用的镜像
restart: always
ports: //端口映射
- 90:80
volumes:
- ./webserver:/usr/share/nginx/html
支持Dockerfile示例
[root@docker compose]# vim Dockerfile
FROM nginx
COPY ./webserver/index.html
/usr/share/nginx/html/index.html
[root@docker compose]# cat docker-compose.yaml
version: "3"
services:
nginx:
build: . //添加Dockerfile
container_name: web-nginx
image: nginx
restart: always
ports:
- 90:80
volumes:
- ./webserver:/usr/share/nginx/html
[root@docker compose]# docker-compose up -d --build //添加--build 选项
帮助信息
[root@docker compose]# docker-compose --help
创建或重新创建服务使用的镜像
[root@docker compose]# docker-compose build
通过容器发送SIGKILL信号强行停止服务
[root@docker compose]# docker-compose kill nginx
显示service的日志信息
[root@docker compose]# docker-compose logs
暂停和恢复服务
[root@docker compose]# docker-compose pause //暂停服务
[root@docker compose]# docker-compose unpause //恢复被暂停的服务
查看服务中的端口与物理机的映射关系
[root@docker compose]# docker-compose port nginx 80 //查看服务中80端口映射到物理机上的端口
显示当前项目下的容器
[root@docker compose]# docker-compose ps
拉取服务依赖的镜像
[root@docker compose]# docker-compose pull
重启某个服务中的所有容器
[root@docker compose]# docker-compose restart
删除停止的服务(服务里的容器)
root@docker compose]# docker-compose rm
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
-f | 强制删除 | -v | 删除与容器相关的卷(volumes) |
在服务中运行一个一次性的命令 |
[root@docker compose]# docker-compose run nginx ls /
启动/停止运行某个服务的所有容器
[root@docker compose]# docker-compose start //启动运行某个服务的所有容器
[root@docker compose]# docker-compose stop //停止运行某个服务的所有容器
指定某个服务启动的容器个数
[root@docker compose]# docker-compose scale nginx=2
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
-f | 用于指定配置文件 | -p | 用于指定项目名称 |
[root@localhost ~]# mkdir wordpress
[root@localhost ~]# cd wordpress/
[root@localhost wordpress]# vim docker-compose.yaml
version: "3.1"
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 123.com
WORDPRESS_DB_NAME: wordpress
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123.com
MYSQL_ROOT_PASSWORD: 123.com
[root@localhost wordpress]# docker-compose up -d
[root@localhost ~]# mkdir /data/wwwroot
[root@localhost ~]# mkdir /data/docker
[root@localhost ~]# docker run -itd --name test nginx
[root@localhost ~]# docker cp test:/etc/nginx /data/docker/
[root@localhost ~]# docker cp test:/usr/share/nginx/html /data/wwwroot/
[root@localhost ~]# mkdir lnmp
[root@localhost ~]# cd lnmp/
[root@localhost lnmp]# vim docker-compose.yaml
version: "3"
services:
nginx:
image: nginx
ports:
- 80:80
volumes:
- /data/wwwroot/html:/usr/share/nginx/html
- /data/docker/nginx:/etc/nginx
php:
image: php:7.2-fpm
ports:
- 9000:9000
volumes:
- /data/wwwroot/html:/usr/share/nginx/html
mysql:
image: mysql:5.7
ports:
- 3306:3306
volumes:
- /data/mysql/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
[root@localhost lnmp]# docker-compose up -d
node01 | node02 | node03 |
---|---|---|
192.168.1.10 | 192.168.1.20 | 192.168.1.30 |
全部关闭防火墙、清空iptables规则、没有安装docker
[root@node01 ~]# systemctl stop firewalld
[root@node01 ~]# systemctl disable firewalld
[root@node01 ~]# iptables -F
[root@node01 ~]# iptables-save
[root@node01 ~]# curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && cp /tmp/docker-machine /usr/local/bin/docker-machine
[root@node01 ~]# docker-machine --version
docker-machine version 0.16.0, build 702c267f
[root@node01 ~]# vim /etc/hosts
192.168.1.10 node01
192.168.1.20 node02
192.168.1.30 node03
[root@node01 ~]# ssh-keygen -t rsa
[root@node01 ~]# ssh-copy-id root@node02
[root@node01 ~]# ssh-copy-id root@node03
[root@node01 ~]# scp /etc/hosts node02:/etc/hosts
[root@node01 ~]# scp /etc/hosts node03:/etc/hosts
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.10 --generic-ssh-key ~/.ssh/id_rsa host1
[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
host1 - generic Running tcp://192.168.1.10:2376 v19.03.13
[root@node01 ~]# netstat -anpt | grep 2376
tcp6 0 0 :::2376 :::* LISTEN 104505/dockerd
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.20 --generic-ssh-key ~/.ssh/id_rsa host2
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.30 --generic-ssh-key ~/.ssh/id_rsa host3
[root@node01 ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node01 - generic Running tcp://192.168.1.10:2376 v19.03.13
node02 - generic Running tcp://192.168.1.20:2376 v19.03.13
node03 - generic Running tcp://192.168.1.30:2376 v19.03.13
[root@node01 ~]# vim /usr/local/etc/bash_completion.d
base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
[root@node01 ~]# source /usr/local/etc/bash_completion.d
[root@node01 ~]# source /etc/bash_completion.d/docker-machine-prompt.bash
[root@node01 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
[root@node01 ~]# source .bashrc
[root@node01 ~]# docker-machine env host1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.10:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell:
# eval $(docker-machine env host1) //连接主机命令
[root@node01 ~]# eval $(docker-machine env host2)
[root@node01 ~ [host2]]#
概念 | 说明 |
---|---|
Swarm | 作用运行docker engin(引擎)的多个主机组成的集群 |
node | 每一个docker engin都是一个node(节点),分为 manager 和worker |
manager node | 负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有managernode。 |
worker node | 接受并执行由manager node 派发的任务,并且默认manager node也是一个work node,不过可以将它设为manager-onlynode.让它只负责编排和管理工作。 |
service | 用来定义worker上执行的命令 |
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (ifs6xxct4dbmmkjsq7oawpu30) is now a manager.
To add a worker to this swarm, run the following command:
#添加work节点运行的命令
docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-4snc764xlxzh3ghtfcaxx8uzp 192.168.1.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
参数 | 说明 |
---|---|
–advertise-addr | 指定与其他Node通信的地址 |
[root@docker02 ~]# docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-4snc764xlxzh3ghtfcaxx8uzp 192.168.1.10:2377
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Active Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active 18.09.0
vb2lonkjx944wyrofd3xplqop docker03 Ready Active 18.09.0
[root@docker01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-dyrnsrnxwm84i1nk4aniw1so4 192.168.1.10:2377
[root@docker03 ~]# docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-dyrnsrnxwm84i1nk4aniw1so4 192.168.1.10:2377
This node joined a swarm as a manager.
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Drain Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active 18.09.0
j6n7zb15uyqzx63cfyr7ptff2 docker03 Ready Active Reachable 18.09.0
将warm节点的work升级为manage
[root@docker01 ~]# docker node promote docker02
Node docker02 promoted to a manager in the swarm.
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Drain Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active Reachable 18.09.0
vb2lonkjx944wyrofd3xplqop docker03 Ready Active 18.09.0
将swarm节点的manager降级为work
[root@docker01 ~]# docker node demote docker02
Manager docker02 demoted in the swarm.
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Drain Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active 18.09.0
vb2lonkjx944wyrofd3xplqop docker03 Ready Active 18.09.0
[root@docker03 ~]# docker swarm leave
Node left the swarm.
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Drain Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active 18.09.0
vb2lonkjx944wyrofd3xplqop docker03 Down Active
[root@docker01 ~]# docker node rm docker03
docker03
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 * docker01 Ready Drain Leader 18.09.0
y32kx76irorhbq3zpjoe13cs9 docker02 Ready Active 18.09.0
[root@docker01 ~]# docker network create -d overlay --attachable docker
55dzciuvpuimx1fzyvgyrnrkh
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
如果访问不到网页,需开启路由转发
[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p
[root@docker01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx
jqubcwzqomj1dogwc2x7v887n
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
参数 | 说明 |
---|---|
–replicas | 副本数量 |
![]() |
[root@docker01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
soux8c2909bo web1 replicated 1/1 nginx:latest *:30000->80/tcp
[root@docker01 ~]# docker service ps web1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
oshddet9cjky web1.1 nginx:latest docker01 Running Running 31 seconds ago
[root@docker01 ~]# docker node update docker01 --availability active|pause|drain
docker01 活跃|暂停|关闭
[root@docker01 ~]# docker service rm web1
web1
[root@docker01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000
[root@docker01 ~]# systemctl daemon-reload
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker run -itd -p 80 --name httpd1 httpd:latest
[root@docker01 ~]# echo 111 > index.html
[root@docker01 ~]# docker cp index.html httpd1:/usr/local/apache2/htdocs
[root@docker01 ~]# docker commit httpd1 httpd.v1
[root@docker01 ~]# docker tag httpd.v1:latest 192.168.1.10:5000/httpd.v1
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v1
[root@docker01 ~]# echo 222 > index.html
[root@docker01 ~]# docker cp index.html httpd1:/usr/local/apache2/htdocs
[root@docker01 ~]# docker commit httpd1 httpd.v2
[root@docker01 ~]# docker tag httpd.v2:latest 192.168.1.10:5000/httpd.v2
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v2
[root@docker01 ~]# echo 333 > index.html
[root@docker01 ~]# docker commit httpd1 httpd.v3
[root@docker01 ~]# docker tag httpd.v3:latest 192.168.1.10:5000/httpd.v3
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v3
[root@docker01 ~]# curl -XGET http://192.168.1.10:5000/v2/_catalog
{"repositories":["httpd.v1","httpd.v2","httpd.v3"]}
[root@docker01 ~]# docker service create --replicas 3 --name web -p 80:80 192.168.1.10:5000/httpd.v1
mqxr2hsla8iyhd4jpxw094nzw
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
scale进行设置副本数量
[root@docker01 ~]# docker service scale web=6
web scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd.v2 web
web
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
或者
[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd.v3 --update-parallelism 2 --update-delay 1m web
web
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
参数 | 说明 |
---|---|
–update-parallelism | 设置并行更新的副本数量 |
–update-delay | 指定滚动更新的时间间隔 |
![]() |
[root@docker01 ~]# docker service rollback web
web
rollback: manually requested rollback
overall progress: rolling back update: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
[root@docker01 ~]# docker node update --label-add disk=max docker02
docker02
[root@docker01 ~]# docker node inspect docker02
[
{
"ID": "y32kx76irorhbq3zpjoe13cs9",
"Version": {
"Index": 310
},
"CreatedAt": "2020-09-28T14:34:56.097756526Z",
"UpdatedAt": "2020-09-29T03:42:20.865860853Z",
"Spec": {
"Labels": {
"disk": "max"
},
[root@docker01 ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
z5momze933w5ewyxm864orayk
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@docker01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
z3ysfn8ukure test replicated 3/3 nginx:latest
[root@docker01 ~]# docker service ps test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
30mli9tz2tv0 test.1 nginx:latest docker02 Running Running 12 seconds ago
ja1ewvxnvvvt test.2 nginx:latest docker02 Running Running 12 seconds ago
ni7nhj53s2vc test.3 nginx:latest docker02 Running Running 12 seconds ago