私有云请创建私有 docker registry 仓库
docker run -it -d --name private_registry -p 5000:5000 --restart=always -v /data/registry/:/tmp/registry registry
echo '{ "insecure-registries":["xxx.xxx.xxx.xxx:5000"] }' > /etc/docker/daemon.json
systemctl restart docker
### 设置镜像标签,让其支持本地镜像上传
docker tag docker.io/centos 192.168.88.101:5000/centos
节点
外网 | 内网 | 角色 |
---|---|---|
10.139.154.193 | leader | |
10.139.140.32 | node | |
10.139.135.226 | node |
master执行, 初始化集群
sudo docker swarm init --listen-addr 10.139.154.193:2377
node分别执行, 加入集群
sudo docker swarm join --token SWMTKN-1-46icwlabnwedm8mr3svmo22ipnodq61z0cu2qzjr4uhw4rrfvh-55z0xfqi24bg2lk6l45nu5oe3 10.139.154.193:2377
master查看集群状态
ubuntu@VM-154-193-ubuntu:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
f26r416u78addyty13uxbfqkm VM-135-226-ubuntu Ready Active 19.03.8
typlvz2dq2iusda9d48a1l3z4 VM-140-32-ubuntu Ready Active 19.03.8
wwrd6oryiwz1myl4ztm7impz3 * VM-154-193-ubuntu Ready Active Leader 19.03.8
创建yml文件 (这里只写了redis)
version: '3'
services:
cfg_redis:
image: redis:5.0.3
ports:
- 16666:6379
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
command: redis-server --requirepass 123456
deploy:
replicas: 3
restart_policy:
condition: on-failure
开始构建
docker stack deploy -c compose_wordpress.yml wordpress
构建的时候会创建一个 overlay 网络 wordpress
docker network ls
查看 stack 状态
ubuntu@VM-154-193-ubuntu:~/docker-test/swarm$ docker stack services wordpress
ID NAME MODE REPLICAS IMAGE PORTS
vxhwemgqzb0w wordpress_cfg_redis replicated 3/3 redis:5.0.3 *:16666->6379/tcp
可以看到worepress 这个调度的stack已经起起来了,因为是与Docker swarm结合,所以我们也可以用Docker swarm 形式来查看和管理:
ubuntu@VM-154-193-ubuntu:~/docker-test/swarm$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vxhwemgqzb0w wordpress_cfg_redis replicated 3/3 redis:5.0.3 *:16666->6379/tcp
ubuntu@VM-154-193-ubuntu:~/docker-test/swarm$ docker service ps wordpress_cfg_redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
n30isxtd0802 wordpress_cfg_redis.1 redis:5.0.3 VM-140-32-ubuntu Running Running 13 minutes ago
rj5zfz0hunll wordpress_cfg_redis.2 redis:5.0.3 VM-135-226-ubuntu Running Running 13 minutes ago
5un527vwh55y wordpress_cfg_redis.3 redis:5.0.3 VM-154-193-ubuntu Running Running 13 minutes ago
执行没有参数更改的滚动重启
docker service update --force --update-parallelism 1 --update-delay 30s service_name
Swarm共享存储 NFS
centos
yum -y install nfs-utils rpcbind
ubuntu
$ sudo apt-get update
$ sudo apt-get install -y nfs-kernel-server
配置文件
nfs 的配置文件 /etc/expots
共享目录赋予权限:chmod 755 /root/share
vim /etc/exports
/root/share 172.16.10.0/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)
配置生效
exportfs -rv
配置文件说明:
/root/share 为共享目录
* 192.168.1.0/24 可以为一个网段,一个IP,也可以是域名,域名支持通配符 如: *.com
* rw:read-write,可读写;
* ro:read-only,只读;
* sync:文件同时写入硬盘和内存;
* async:文件暂存于内存,而不是直接写入内存;
* no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
* root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
* all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
* anonuid:匿名用户的UID值
* anongid:匿名用户的GID值。备注:其中anonuid=1000,anongid=1000,为此目录用户web的ID号,达到连接NFS用户权限一致。
* defaults 使用默认的选项。默认选项为rw、suid、dev、exec、auto nouser与async。
* atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。
* noatime 每次存取时不更新inode的存取时间。
* dev 可读文件系统上的字符或块设备,取消选项为nodev。
* nodev 不读文件系统上的字符或块设备。
* exec 可执行二进制文件,取消选项为noexec。
* noexec 无法执行二进制文件。
* auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。
* noauto 无法使用auto加载。
* suid 启动set-user-identifier设置用户ID与set-group-identifer设置组ID设置位,取消选项为nosuid。
* nosuid 关闭set-user-identifier设置用户ID与set-group-identifer设置组ID设置位。
* user 普通用户可以执行加载操作。
* nouser 普通用户无法执行加载操作,默认设置。
* remount 重新加载设备。通常用于改变设备的设置状态。
* rsize 读取数据缓冲大小,默认设置1024。–影响性能
* wsize 写入数据缓冲大小,默认设置1024。
* fg 以前台形式执行挂载操作,默认设置。在挂载失败时会影响正常操作响应。
* bg 以后台形式执行挂载操作。
* hard 硬式挂载,默认设置。如果与服务器通讯失败,让试图访问它的操作被阻塞,直到服务器恢复为止。
* soft 软式挂载。服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程挂在无关紧要的安装操作上来说非常有用。
* retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数。
* nointr 不允许用户中断,默认设置。
* intr 允许用户中断被阻塞的操作并且让它们返回一条出错消息。
* timeo=n 设置请求的超时时间以十分之一秒为单位。
* tcp 传输默认使用udp,可能出现不稳定,使用proto=tcp更改传输协议。客户端参考mountproto=netid
启动nfs服务
systemctl enable rpcbind
systemctl start rpcbind
systemctl enable nfs-server
systemctl start nfs-server
确认NFS服务器启动成功
[root@master opt]# rpcinfo -p
program vers proto port service
100024 1 udp 50813 status
100024 1 tcp 6021 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 35715 nlockmgr
100021 3 udp 35715 nlockmgr
100021 4 udp 35715 nlockmgr
100021 1 tcp 5350 nlockmgr
100021 3 tcp 5350 nlockmgr
100021 4 tcp 5350 nlockmgr
[root@master opt]# cat /var/lib/nfs/etab
/root/share 172.16.10.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
nfs服务端放通端口 111 2049 4046 20048 五个端口
客户端查看showmount
$ showmount -e 31.16.17.65
Export list for 31.16.17.65:
/code/share *
$ sudo apt-get install -y nfs-common
$ showmount -e 172.16.36.25
$ sudo mount -t nfs 172.16.36.25:/home/erick/nfs /mnt
$ sudo umount /mnt
将nfs应用到docker swarm中
手动创建volume
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=172.16.10.172,rw \
--opt device=:/root/share \
foo33
使用docker-compose
version: '3.3'
services:
nginx-test5:
image: nginx:latest
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
ports:
- "88:80"
networks:
my-overlay-network:
aliases:
- nginx-test5
volumes:
- "foo_new:/app/share"
volumes:
foo_new:
driver: local
driver_opts:
type: "nfs"
o: "addr=172.16.10.172,rw"
device: ":/root/share"
networks:
my-overlay-network:
driver: overlay