Compose 中有两个重要的概念:
Docker-compose官方文档
[root@docker-compose ~]# curl -L https://github.com/docker/compose/releases/download/1.25.0/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 880 0 --:--:-- --:--:-- --:--:-- 879
100 16.2M 100 16.2M 0 0 161k 0 0:01:42 0:01:42 --:--:-- 183k
[root@docker-compose ~]# chmod +x /usr/local/bin/docker-compose
[root@docker-compose ~]# docker-compose -v
docker-compose version 1.25.0, build 0a186604
设置tabl键的空格距离
[root@docker-compose ~]# vim .vimrc
set tabstop=2
[root@docker-compose ~]# source .vimrc
通过识别一个docker-compose.yml的配置文件,去管理容器。
[root@docker-compose ~]# mkdir /webserver
[root@docker-compose ~]# mkdir compose
[root@docker-compose ~]# cd compose/
[root@docker-compose compose]# vim docker-compose.yaml
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx
restart: always
ports:
- 90:80
volumes:
- ./webserver:/usr/share/nginx/html
命令解释
- 第一个部分: version: 指定语法格式的版本。
- 第二部分:service:定义服务,(想要运行什么样的容器)
- nginx: //服务的名称
- container_name: web-nginx //容器名称
- image: nginx:latest //使用的镜像
- restart: always //容器跟随docker服务自启
- ports: //端口映射
- volumes:: //持久化 本地:容器
运行
PS:如果想要退出终端占用,加-d 选项。
[root@docker-compose compose]# docker-compose up -d
Creating network "compose_default" with the default driver
Pulling nginx (nginx:)...
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
Creating web-nginx ... done
[root@docker-compose compose]# docker-compose stop //停止运行
Stopping web-nginx ... done
[root@docker-compose compose]# docker-compose restart //重启
Restarting web-nginx ... done
在运行container的过程中,还可以支持Dockerfile
PS: 如果文件内有Dockerfile,可以提前执行:docker-compose build 或者在up -d 的时候添加–build 选项。
[root@docker-compose compose]# vim Dockerfile
FROM nginx
COPY ./webserver/index.html /usr/share/nginx/html/index.html
[root@docker-compose compose]# vim docker-compose.yaml
version: "3"
services:
nginx:
build: .
container_name: web-nginx
image: nginx
restart: always
ports:
- 91:80
[root@docker-compose compose]# ls
docker-compose.yaml Dockerfile webserver
[root@docker-compose compose]# ls webserver/
index.html
[root@docker-compose compose]# docker-compose up -d --build
Building nginx
Step 1/2 : FROM nginx
---> 7e4d58f0e5f3
Step 2/2 : COPY ./webserver/index.html /usr/share/nginx/html/index.html
---> c18fdc4bedf3
Successfully built c18fdc4bedf3
Successfully tagged nginx:latest
Recreating web-nginx ... done
(1)帮助信息
[root@docker-compose ~]# docker-compose --help
(2)创建或重新创建服务使用的镜像
[root@docker-compose ~]# docker-compose build
(3)通过容器发送SIGKILL信号强行停止服务
[root@docker-compose ~]# docker-compose kill nginx
PS:kill 服务名称,默认所有服务
(4)显示service的日志信息
[root@docker-compose ~]# docker-compose logs
(5)暂停和恢复服务
[root@docker-compose ~]# docker-compose pause
- docker-compose pause #暂停服务
- docker-compose unpause #恢复被暂停的服务
(6)查看服务中的端口与物理机的映射关系
[root@docker-compose ~]# docker-compose port nginx 80
PS:docker-compose port nginx_web 80 #查看服务中80端口映射到物理机上的那个端口
(7)显示当前项目下的容器
[root@docker-compose ~]# docker-compose ps
PS:此命令与docker ps不同作用,此命令会显示停止后的容器(状态为Exited),只针对某个项目。
(8)拉取服务依赖的镜像
[root@docker-compose ~]# docker-compose pull
(9)重启某个服务中的所有容器
[root@docker-compose ~]# docker-compose restart
(10)删除停止的服务(服务里的容器)
[root@docker-compose ~]# docker-compose rm
- -f #强制删除
- -v #删除与容器相关的卷(volumes)
(11)在服务中运行一个一次性的命令
[root@docker-compose ~]# docker-compose run nginx ls /
这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处
[root@docker-compose ~]# docker-compose start/stop
- docker-compose start 启动运行某个服务的所有容器
- docker-compose stop 停止运行某个服务的所有容器
(13)指定某个服务启动的容器个数
[root@docker-compose ~]# docker-compose scale nginx=2
PS:如果需要运行多个容器,那么容器名称就不要给了,会随机生成,还有注意端口映射问题,不要冲突(docker-compose port 字段支持仅写一个容器暴露的端口)
- -f :用于指定配置文件
- -p :用于指定项目名称
[root@docker-compose ~]# mkdir wordpress
[root@docker-compose ~]# cd wordpress/
[root@docker-compose wordpress]# vim docker-compose.yaml
[root@docker-compose wordpress]# cat docker-compose.yaml
version: "3.1"
services:
wordpress:
image: wordpress
restart: always
ports:
- 8081: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_PASSWORD: 123.com
MYSQL_ROOT_PASSWORD: 123.com
MYSQL_USER: wordpress
[root@docker-compose wordpress]# docker-compose up -d
Creating network "wordpress_default" with the default driver
Pulling wordpress (wordpress:)...
......
Pulling db (mysql:5.7)...
......
Creating wordpress_wordpress_1 ... done
Creating wordpress_db_1 ... done
[root@docker-compose wordpress]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afb30cb0a6e2 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp wordpress_db_1
8884dd232849 wordpress "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8081->80/tcp wordpress_wordpress_1
[root@docker-compose ~]# mkdir lnmp
[root@docker-compose lnmp]# docker cp lnmp-mysql:/var/lib/mysql ./
[root@docker-compose lnmp]# docker cp lnmp-nginx:/etc/nginx/ ./
[root@docker-compose lnmp]# docker cp lnmp-nginx:/usr/share/nginx/html/ ./
[root@docker-compose lnmp]# cat docker-compose.yaml
version: "3"
services:
nginx:
image: nginx
ports:
- 8085:80
volumes:
- /lnmp/html:/usr/share/nginx/html
- /lnmp/nginx:/etc/nginx
php:
image: php:7.2-fpm
ports:
- 9000:9000
volumes:
- /lnmp/html:/usr/share/nginx/html
mysql:
image: mysql:5.7
ports:
- 3306:3306
volumes:
- /lnmp/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
[root@docker-compose lnmp]# docker-compose up -d
Recreating lnmp-nginx ...
Recreating lnmp-php ...
Recreating lnmp-mysql ...
Recreating lnmp-nginx ... done
Recreating lnmp-php ... done
Recreating lnmp-mysql ... done
Docker-machine官方文档
PS:Docker-machine环境主机没有安装docker服务的主机!!!
主机 | IP |
---|---|
node01 | 192.168.1.10 |
node02 | 192.168.1.11 |
node01 | 192.168.1.12 |
[root@node01 ~]# systemctl stop firewalld
[root@node01 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@node01 ~]# setenforce 0
[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
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 651 100 651 0 0 96 0 0:00:06 0:00:06 --:--:-- 154
100 26.8M 100 26.8M 0 0 184k 0 0:02:29 0:02:29 --:--:-- 447k
[root@node01 ~]# docker-machine --version
docker-machine version 0.16.0, build 702c267f
[root@node01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.10 node01
192.168.1.11 node02
192.168.1.12 node03
[root@node01 ~]# ssh-keygen
[root@node01 ~]# ssh-copy-id root@node01
[root@node01 ~]# ssh-copy-id root@node02
[root@node01 ~]# ssh-copy-id root@node03
PS:对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机。创建 Machine指的就是在 host 上安装和部署 docker。
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.10 --generic-ssh-key .ssh/id_rsa node01
Creating CA: /root/.docker/machine/certs/ca.pem
Creating client certificate: /root/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(node01) No SSH key specified. Assuming an existing key at the default location.
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node01
用同样的方法吧其余两台添加到machine中
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.11 --generic-ssh-key .ssh/id_rsa node02
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.12 --generic-ssh-key .ssh/id_rsa node03
查看已添加的主机
[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.11:2376 v19.03.13
node03 - generic Running tcp://192.168.1.12:2376 v19.03.13
添加加速器
[root@node01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://z1pa8k3e.mirror.aliyuncs.com"]
}
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
1.优化docker-machine的shell
这样在 bash 能够通过 tab 键补全 docker-mahine 的子命令和参数。
[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
--2020-09-28 21:08:04-- https://raw.githubusercontent.com/docker/machine/v0.16.0/contrib/completion/bash/docker-machine-prompt.bash
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1469 (1.4K) [text/plain]
Saving to: ‘/etc/bash_completion.d/docker-machine-prompt.bash’
100%[=============================================================>] 1,469 --.-K/s in 0s
2020-09-28 21:08:11 (32.3 MB/s) - ‘/etc/bash_completion.d/docker-machine-prompt.bash’ saved [1469/1469]
--2020-09-28 21:08:11-- https://raw.githubusercontent.com/docker/machine/v0.16.0/contrib/completion/bash/docker-machine-wrapper.bash
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1525 (1.5K) [text/plain]
Saving to: ‘/etc/bash_completion.d/docker-machine-wrapper.bash’
100%[=============================================================>] 1,525 --.-K/s in 0s
2020-09-28 21:08:18 (32.8 MB/s) - ‘/etc/bash_completion.d/docker-machine-wrapper.bash’ saved [1525/1525]
--2020-09-28 21:08:18-- https://raw.githubusercontent.com/docker/machine/v0.16.0/contrib/completion/bash/docker-machine.bash
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12211 (12K) [text/plain]
Saving to: ‘/etc/bash_completion.d/docker-machine.bash’
100%[=============================================================>] 12,211 19.1KB/s in 0.6s
2020-09-28 21:08:25 (19.1 KB/s) - ‘/etc/bash_completion.d/docker-machine.bash’ saved [12211/12211]
[root@node01 ~]# vim .bashrc
......
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
[root@node01 ~]# source .bashrc
2.显示访问 node01 需要的所有环境变量
[root@node01 ~]# docker-machine env node01
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.10:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/node01"
export DOCKER_MACHINE_NAME="node01"
# Run this command to configure your shell:
# eval $(docker-machine env node01)
3.根据提示访问node02和node03
[root@node01 ~]# eval $(docker-machine env node02)
[root@node01 ~ [node02]]#
[root@node01 ~ [node02]]# eval $(docker-machine env node03)
[root@node01 ~ [node03]]#
4.在此状态下执行的所有 docker 命令其效果都相当于在 host3上执行,例如启动一个 busybox 容器
[root@node01 ~]# eval $(docker-machine env node03)
[root@node01 ~ [node03]]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
df8698476c65: Pull complete
Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@node01 ~ [node03]]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6858809bf669 2 weeks ago 1.23MB
[root@node01 ~ [node03]]# docker run -itd --name test busybox:latest
4b332581a8558564c9b25846a551d52ea307612162c1f32afa0fe5bbd1ececcf
[root@node01 ~ [node03]]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b332581a855 busybox:latest "sh" 7 seconds ago Up 4 seconds test
5.更新 machine 的 docker 到最新版本,可以批量执行
[root@node01 ~]# docker-machine upgrade node01 node02 node03
6.查看 machine 的 docker daemon 配置
[root@node01 ~]# docker-machine config node01
--tlsverify
--tlscacert="/root/.docker/machine/machines/node01/ca.pem"
--tlscert="/root/.docker/machine/machines/node01/cert.pem"
--tlskey="/root/.docker/machine/machines/node01/key.pem"
-H=tcp://192.168.1.10:2376
7.在不同 machine 之间拷贝文件
[root@node01 ~]# touch aa.txt bb.txt
[root@node01 ~]# docker-machine scp node01:/root/* node02:/root/
[root@node01 ~]# eval $(docker-machine env node02)
[root@node01 ~ [node02]]# ls
aa.txt anaconda-ks.cfg bb.txt
docker swarm集群:
主机 | IP |
---|---|
node01 | 192.168.1.40 |
node02 | 192.168.1.41 |
node03 | 192.168.1.42 |
关闭防火墙、禁用selinux、3台dockerhost区别主机名、时间同步
Docker-swarm官方文档
[root@docker-node01 ~]# docker swarm init --advertise-addr 192.168.1.40
Swarm initialized: current node (47yg1sfmqk4q7sovsitzv089v) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-9tx6ta40vacs0uesbngbvao9q 192.168.1.40:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
PS:–advertise-addr:指定与其他Node通信的地址。
添加其他节点
[root@docker-node02 ~]# docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-9tx6ta40vacs0uesbngbvao9q 192.168.1.40:2377
This node joined a swarm as a worker.
[root@docker node03 ~]# docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-9tx6ta40vacs0uesbngbvao9q 192.168.1.40:2377
This node joined a swarm as a worker.
扩展
PS:如果想要添加manager 节点: 运行下边的命令:
[root@docker-node01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-189jcfib6m4af09dtzwunras4 192.168.1.40:2377
PS:如果想要添加worker节点: 运行下边的命令:
[root@docker-node01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-9tx6ta40vacs0uesbngbvao9q 192.168.1.40:2377
查看节点详情
[root@docker-node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
47yg1sfmqk4q7sovsitzv089v * docker-node01 Ready Active Leader 18.09.0
o5983x3b7jagyqolbeortqb98 docker-node02 Ready Active 18.09.0
bbsrkjm4vw9f5zwtkbgjlg6jm docker-node03 Ready Active 18.09.0
(1)节点服务离开一个集群
[root@docker-node02 ~]# docker swarm leave
Node left the swarm.
PS:查看节点状态会变成down.然后可以通过manager node 将其删除。
(2)删除某个节点
[root@docker-node01 ~]# docker node rm docker-node02
docker-node02
(3)生成加入集群令牌
[root@docker-node01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-189jcfib6m4af09dtzwunras4 192.168.1.40:2377
[root@docker-node01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mb1b1meh40rhnoxz8evd0zyfw0ec35ovmm1i3m54plvc8jngt-9tx6ta40vacs0uesbngbvao9q 192.168.1.40:2377
(4)升级
将node02节点的work升级为manager
[root@docker-node01 ~]# docker node promote docker-node02
Node docker-node02 promoted to a manager in the swarm.
(5)降级
将node02节点的manager降级为work.
[root@docker-node01 ~]# docker node demote docker-node02
Manager docker-node02 demoted in the swarm.
(6)设置节点状态
节点状态有三个参数
[root@docker-node01 ~]# docker node update --availability active docker-node01
docker-node01
- overlay:覆盖型网络。
- attachable: 这个参数必须要加,否则网络不能用于容器。
[root@docker-node01 ~]# docker network create -d overlay --attachable docker
pzlqyddslejf04jhjpht4klhq
PS:我们在node1上创建的此网络,但在swarm的其他节点,是查看不到此网络信息的。但却能够直接使用此网络。
[root@docker-node01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.40 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
Unable to find image 'dockersamples/visualizer:latest' locally
latest: Pulling from dockersamples/visualizer
cd784148e348: Pull complete
f6268ae5d1d7: Pull complete
97eb9028b14b: Pull complete
9975a7a2a3d1: Pull complete
ba903e5e6801: Pull complete
7f034edb1086: Pull complete
cd5dbf77b483: Pull complete
5e7311667ddb: Pull complete
687c1072bfcb: Pull complete
aa18e5d3472c: Pull complete
a3da1957bd6b: Pull complete
e42dbf1c67c4: Pull complete
5a18b01011d2: Pull complete
Digest: sha256:54d65cbcbff52ee7d789cd285fbe68f07a46e3419c8fcded437af4c616915c85
Status: Downloaded newer image for dockersamples/visualizer:latest
d9b61028ca86e8a749646890929c2d0c8bce8ad2e4aa207a00a6c01cda0389e6
[root@docker-node01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker-node01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@docker-node01 ~]# docker service create --replicas 3 --network docker --name web1 -p 80 nginx
hywte0057jyjq0fbemp7e6jbc
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@docker-node01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hywte0057jyj web1 replicated 3/3 nginx:latest *:30000->80/tcp
(2)查看service信息
[root@docker-node01 ~]# docker service ps web1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jaez7x29edkn web1.1 nginx:latest docker-node01 Running Running 3 minutes ago
ryp8yol0bpcu web1.2 nginx:latest docker-node03 Running Running 2 minutes ago
atxmoemgry55 web1.3 nginx:latest docker-node02 Running Running 2 minutes ago
[root@docker-node01 ~]# docker run -itd --name registry --restart always -p 5000:5000 registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete
47112e65547d: Pull complete
46bcb632e506: Pull complete
c1cc712bcecd: Pull complete
3db6272dcbfa: Pull complete
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
fb703f2c90c5c5f14e3077b3ec1bb26674a7e1a774b53e98b6a838b2aeef678d
[root@docker-node01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.40:5000
[root@docker-node01 ~]# systemctl daemon-reload
[root@docker-node01 ~]# systemctl restart docker
[root@docker-node01 ~]# scp -rp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service
[root@docker-node01 ~]# scp -rp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service
[root@docker-node01 ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
d121f8d1c412: Already exists
9cd35c2006cf: Pull complete
b6b9dec6e0f8: Pull complete
fc3f9b55fcc2: Pull complete
802357647f64: Pull complete
Digest: sha256:5ce7c20e45b407607f30b8f8ba435671c2ff80440d12645527be670eb8ce1961
Status: Downloaded newer image for httpd:latest
[root@docker-node01 ~]# docker run -itd --name httpd -p 80 httpd:latest
f59944f4d3ed0ec8c9d9e496e6201580c138e014db60d86d9fc0773ba6e88b97
[root@docker-node01 ~]# docker exec -it httpd bash
root@f59944f4d3ed:/usr/local/apache2# cd htdocs/
root@f59944f4d3ed:/usr/local/apache2/htdocs# echo 111 > index.html
root@f59944f4d3ed:/usr/local/apache2/htdocs# exit
exit
[root@docker-node01 ~]# docker commit httpd httpd:v1
sha256:d0ce35b9c08dbb85605b6f9bf5de47cca643f812b937c198d123eaaa3f6779c5
PS:上述方法创建镜像httpd:v2、 httpd:v3
[root@docker-node01 ~]# docker service create --replicas 3 --name benet -p 80 httpd:v1
image httpd:v1 could not be accessed on a registry to record
its digest. Each node will access httpd:v1 independently,
possibly leading to different nodes running different
versions of the image.
l8vnr8vxtesp8sg22hlijz3y4
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
默认的Ingress 网络,包括创建的自定义overlay网络,为后端真正为用户提供服务的container,提供了一个统一的入口。
PS:扩容与缩容直接直接通过scale进行设置副本数量
[root@docker-node01 ~]# docker service scale benet=6
benet 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@docker-node01 ~]# docker service update --image httpd:v2 benet
PS:再次查看使用镜像已经从httpd:v1变成httpd:v2了
默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等待
时间,我们可以通过
–update-parallelism; 设置并行更新的副本数量。
–update-delay: 指定滚动更新的时间间隔。
[root@docker-node01 ~]# docker service rollback benet
PS:docker swarm的回滚操作,默认只能回滚到上一次操作的状态,并不能连续回滚操作。
[root@docker-node01 ~]# docker node update --help
Usage: docker node update [OPTIONS] NODE
Update a node
Options:
--availability string Availability of the node ("active"|"pause"|"drain")
--label-add list Add or update a node label (key=value)
--label-rm list Remove a node label if exists
--role string Role of the node ("worker"|"manager")
给node02上添加一个标签(磁盘容量最大)
[root@docker-node01 ~]# docker node update --label-add disk=max docker-node02
docker-node02
[root@docker-node01 ~]# docker node inspect docker-node02 //查看标签信息
[
{
"ID": "x4crfyro92oijrnze729jozaf",
"Version": {
"Index": 1242
},
"CreatedAt": "2020-09-26T06:54:08.426674029Z",
"UpdatedAt": "2020-09-26T08:58:51.55494602Z",
"Spec": {
"Labels": {
"disk": "max"
},
删除标签
[root@docker-node01 ~]# docker node update --label-rm disk docker-node02
docker-node02
指定节点,运行服务
[root@docker-node01 ~]# docker service create --name aaa --replicas 3 --constraint 'node.labels.disk == max' nginx
[root@docker-node01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
gb5kqv1xtaik test replicated 3/3 nginx:latest
[root@docker-node01 ~]# docker service ps test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ttog5ism1zp9 test.1 nginx:latest docker-node02 Running Running about a minute ago
i78dv3angr99 test.2 nginx:latest docker-node02 Running Running about a minute ago
hha9t04w2hii test.3 nginx:latest docker-node02 Running Running about a minute ago