1. docker 部署nfs
1.1 说明
部署nfs,做容器数据文件持久化
经测试swarm无法部署nfs
1.2 检查 nfsd 模块是否已经被加载
nfsd 是NFS服务器的内核模块
文章来源:https://www.toymoban.com/news/detail-777820.html
root@swarm-m1:/data/project/nfs# lsmod | grep nfsd
nfsd 417792 11
auth_rpcgss 94208 2 nfsd,rpcsec_gss_krb5
nfs_acl 16384 2 nfsd,nfsv3
lockd 102400 3 nfsd,nfsv3,nfs
grace 16384 2 nfsd,lockd
sunrpc 397312 20 nfsd,nfsv4,auth_rpcgss,lockd,nfsv3,rpcsec_gss_krb5,nfs_acl,nfs
如果没有加载,执行:
modprobe nfsd
1.3 docker-compose文件
root@swarm-m1:/data/project/nfs# cat docker-compose.yml
version: '3' # 使用的docker-compose版本号
services: # 定义服务列表
nfs-server: # 定义一个名为nfs-server的服务
container_name: nfs_nginx # 容器的名称
image: itsthenetwork/nfs-server-alpine:latest # 使用的镜像名称和标签
restart: unless-stopped # 除非你明确地停止了容器,否则总是会重启容器
# 以下是不同的重启策略说明:
# unless-stopped:除非你明确地停止了容器,否则总是会重启容器
# always:容器总是会在退出后重启
# on-failure:只有在容器退出状态为非零(也就是出错)的情况下才会重启容器
volumes: # 定义卷映射列表
- /data/project/nfs/mount:/nfsshare # 将宿主机的/data/project/nfs/mount目录映射到容器的/nfsshare目录
command: "/nfsshare *(rw,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)" # 容器启动后要执行的命令
environment: # 设置环境变量
- SHARED_DIRECTORY=/nfsshare # 设置环境变量SHARED_DIRECTORY的值为/nfsshare
ports: # 端口映射列表
- 2049:2049 # 将宿主机的2049端口映射到容器的2049端口
privileged: true # 给容器全部权限,允许容器内部的进程访问宿主机的设备
配置文件中挂载的目录为:
/data/project/nfs/mount
需要赋予权限,执行:
chmod -R 777 /data/project/nfs/mount
1.4 启动容器
docker-compose -f /data/project/nfs/docker-compose.yml up -d
如果需要同时启动多个:
docker-compose -f my-docker-setup-1.yml -f my-docker-setup-2.yml up -d
2. 编写nginx的swarm - docker-compose文件
root@swarm-m1:/data/project/nginx# cat docker-compose.yml
version: "3" # 指定docker-compose的版本
services: # 定义要启动的服务列表
nginx: # 定义一个名为nginx的服务
image: 101.43.228.87:5003/test/nginx:v1 # 使用的镜像名称和标签
# container_name: nginx # 容器名称(在Swarm模式中,不建议使用)
volumes: # 定义挂载卷
- nfs_html:/usr/share/nginx/html # 挂载nfs_html到容器的指定路径
- nfs_conf:/etc/nginx # 挂载nfs_conf到容器的指定路径
networks: # 定义使用的网络列表
- nginx-net # 使用名为nginx-net的网络
# restart: always #容器的重启策略(在Swarm模式中使用deploy代替)
ports: # 定义端口映射
- 80:80 # 映射宿主机的80端口到容器的80端口
deploy: # 在Swarm模式下的部署配置
replicas: 8 # 定义要启动的实例数量
update_config: # 定义滚动更新的配置
parallelism: 2 # 定义每次更新的实例数量
delay: 10s # 更新每个实例之间的延迟
rollback_config: # 添加回滚行为
parallelism: 3 # 一次更新3个
delay: 10s # 间隔10秒
resources: # 定义资源限制和预留
limits: # 定义资源限制
cpus: '0.5' # 每个容器的CPU限制
memory: 512M # 每个容器的内存限制
reservations: # 定义资源预留
cpus: '0.1' # 每个容器的CPU预留
memory: 128M # 每个容器的内存预留
volumes: # 定义卷
nfs_html: # 定义名为nfs_html的卷
driver: local # 使用local驱动程序
driver_opts: # 驱动程序选项
type: nfs # 类型为NFS
o: nfsvers=4,addr=192.168.31.181,rw # NFS选项
device: ":/nginx/html" # NFS设备路径
nfs_conf: # 定义名为nfs_conf的卷
driver: local # 使用local驱动程序
driver_opts: # 驱动程序选项
type: nfs # 类型为NFS
o: nfsvers=4,addr=192.168.31.181,rw # NFS选项
device: ":/nginx/conf" # NFS设备路径
networks: # 定义网络
nginx-net: # 定义名为nginx-net的网络
driver: overlay # 使用overlay驱动程序
如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"--replicas n"更换成"--mode=global"即可!
复制服务(--replicas n)
将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“--replicas 3”。
全局服务(--mode=global)
适用于集群内全部可用节点上的服务任务,例如“--mode global”。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。
3. swarm部署service
3.1 部署service
docker stack deploy -c /data/project/nginx/docker-compose.yml nginx --with-registry-auth
-c 或 --compose-file 指定配置文件
--with-registry-auth 确保从私有仓库拉取镜像时 Swarm 节点可以使用相应的凭据。
1.部署不存在的service可以不加--with-registry-auth
2.如果service已存在,修改docker-compose后需要重新部署时
需要添加--with-registry-auth,防止node节点无法拉取远程镜像
4. 其他操作
4.1 查看全部service信息
root@swarm-m1:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lgicaxzr8r8j nginx_nginx replicated 8/8 101.43.228.87:5003/test/nginx:v1 *:80->80/tcp
4.2 查看指定service下容器运行情况
root@swarm-m1:~# docker service ps nginx_nginx | grep Running
ji2zcy87oy3p nginx_nginx.1 101.43.228.87:5003/test/nginx:v1 swarm-n2 Running Running 16 hours ago
jvwr5usxh5do nginx_nginx.2 101.43.228.87:5003/test/nginx:v1 swarm-n2 Running Running 16 hours ago
kooi77fx8sjc nginx_nginx.3 101.43.228.87:5003/test/nginx:v1 swarm-n2 Running Running 16 hours ago
1px78c083di3 nginx_nginx.4 101.43.228.87:5003/test/nginx:v1 swarm-n1 Running Running 16 hours ago
xoi94772ad2d nginx_nginx.5 101.43.228.87:5003/test/nginx:v1 swarm-n1 Running Running 16 hours ago
r8y9jvlxntlh nginx_nginx.6 101.43.228.87:5003/test/nginx:v1 swarm-n1 Running Running 16 hours ago
rulhm9lfesry nginx_nginx.7 101.43.228.87:5003/test/nginx:v1 swarm-n2 Running Running 16 hours ago
unlhvwdi6pal nginx_nginx.9 101.43.228.87:5003/test/nginx:v1 swarm-n1 Running Running 16 hours ago
4.3 调整service下容器个数
docker service scale nginx_nginx=4
4.4 查看service配置信息 – 格式化输出(便于查看)
docker service inspect --pretty nginx_nginx
4.5 强制重新部署 nginx_nginx-web 服务的所有实例,即使配置没有改变。
docker service update --force nginx_nginx
4.6 强制重新部署服务,还确保每更新一个任务后都会暂停5秒,然后再继续下一个
这可以确保更新不会太快地同时发生,从而可能提供更加平滑的更新体验,特别是在高可用性环境中。
docker service update --force --update-delay 5s nginx_nginx
4.7 强制重新部署服务
每更新一个任务后都会暂停5秒,滚动更新期间每次只更新2个任务
docker service update --force --update-delay 5s --update-parallelism 2 nginx_nginx
5. 其他命令
Docker基础命令:
docker run: 运行一个容器。
docker ps: 列出运行中的容器。
docker images: 列出可用的镜像。
docker exec: 在一个运行的容器中执行命令。
docker logs: 获取容器的日志输出。
docker build: 从Dockerfile构建镜像。
docker pull: 从registry拉取镜像。
docker push: 将镜像推送到registry。
docker stop/start/restart: 停止/启动/重启容器。
docker rm: 删除容器。
docker rmi: 删除镜像。
Docker Compose命令:
docker-compose up: 启动Compose文件定义的服务。
docker-compose down: 停止并删除Compose文件定义的服务。
docker-compose logs: 查看服务的日志。
docker-compose build: 为服务构建或重新构建镜像。
docker-compose ps: 列出由Compose文件定义的服务。
Docker Swarm命令:
docker swarm init: 初始化一个新的Swarm集群。
docker swarm join: 将节点加入到Swarm集群。
docker node ls: 列出Swarm集群中的节点。
docker service create: 创建一个新的服务。
docker service ls: 列出服务。
docker service scale: 调整服务的副本数。
docker service update: 更新服务。
docker service logs: 查看服务的日志。
docker service rm: 删除服务。
docker stack deploy: 使用Compose文件部署一堆服务。
docker stack ls: 列出stacks。
docker stack rm: 删除stack。
6. html文件ADD进镜像中,更新版本后回滚
6.1 创建Dockerfile
root@swarm-m1:/data/project/nginx# ls
docker-compose.yml docker-compose.yml_back Dockerfile html
root@swarm-m1:/data/project/nginx# cat Dockerfile
FROM 101.43.228.87:5003/test/nginx:v1
# 添加html文件到nginx默认的网页目录
ADD ./html/ /usr/share/nginx/html/
6.2 通过Dockerfile构建镜像
文件更新时,重新构建Dockerfile时,标签需要不通,来区分不同版本,方便标识
root@swarm-m1:/data/project/nginx# docker build -t 101.43.228.87:5003/test/nginx:v3 .
[+] Building 0.1s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 160B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for 101.43.228.87:5003/test/nginx:v1 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 1.23kB 0.0s
=> CACHED [1/2] FROM 101.43.228.87:5003/test/nginx:v1 0.0s
=> [2/2] ADD ./html/ /usr/share/nginx/html/ 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:9c889a1380870031007473175b6df013e949408cc73e273b892f14e6a851b09c 0.0s
=> => naming to 101.43.228.87:5003/test/nginx:v3 0.0s
root@swarm-m1:/data/project/nginx# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
101.43.228.87:5003/test/nginx v3 9c889a138087 7 seconds ago 142MB
注意:
Dockerfile的 构建上下文 问题
建上下文的内容: 默认情况下,构建上下文是执行docker build命令的当前目录及其所有子目录和文件。因此,如您在/data/project/nginx目录下运行docker build.,那么这个目录及其所有子目录和文件都会成为构建上下文。
Dockerfile中的指令:在Dockerfile中,只能引用构建上下文中的文件和目录。例如,COPY或ADD指令只能复制构建上下文中的文件或目录。
所以执行docker build时如果Dockerfile中有ADD或者COPY命令,那么则需要ADD或COPY的文件(目录)和Dockerfile在同一目录下
否则会报错:
root@swarm-m1:/data/project/nginx# docker build -t 101.43.228.87:5003/test/nginx:v3 .
[+] Building 0.1s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 190B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for 101.43.228.87:5003/test/nginx:v1 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/2] FROM 101.43.228.87:5003/test/nginx:v1 0.0s
=> ERROR [2/2] ADD /data/project/nfs/mount/nginx/html/ /usr/share/nginx/html/ 0.0s
------
> [2/2] ADD /data/project/nfs/mount/nginx/html/ /usr/share/nginx/html/:
------
Dockerfile:4
--------------------
2 |
3 | # 添加html文件到nginx默认的网页目录
4 | >>> ADD /data/project/nfs/mount/nginx/html/ /usr/share/nginx/html/
5 |
--------------------
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 9c697a07-db7d-41e4-bb90-e00c64efdddf::ge6uv12ufq6j7bhc3ccbrr8is: failed to walk /var/lib/docker/tmp/buildkit-mount3795223411/data/project/nfs/mount/nginx: lstat /var/lib/docker/tmp/buildkit-mount3795223411/data/project/nfs/mount/nginx: no such file or directory
6.3 将镜像上传至harbor
root@swarm-m1:/data/project/nginx# docker push 101.43.228.87:5003/test/nginx:v3
The push refers to repository [101.43.228.87:5003/test/nginx]
c58f63417128: Pushed
a1bd4a5c5a79: Layer already exists
597a12cbab02: Layer already exists
8820623d95b7: Layer already exists
338a545766ba: Layer already exists
e65242c66bbe: Layer already exists
3af14c9a24c9: Layer already exists
v3: digest: sha256:79900ec93b1110d1c9228a5122f714ee5c567d0d4a55359693ae7a93863b74c3 size: 1777
执行docker pull后,即可看到harbor有镜像
![image](https://note.youdao.com/yws/res/18858/80F974D5D2B24322A531DE2105F46D03)
6.4 将docker-compose中的镜像改为v3版本
root@swarm-m1:/data/project/nginx# cat docker-compose.yml
#stack 最低支持版本为 3
version: "3"
services:
nginx: # 服务名称
image: 101.43.228.87:5003/test/nginx:v3 # 镜像名称
# container_name: nginx # 容器名称
volumes:
- nfs_html:/usr/share/nginx/html
- nfs_conf:/etc/nginx
networks:
- nginx-net #指定网络
# restart: always #重启策略
ports:
- 80:80 #挂载端口
deploy:
replicas: 8 #生成实例数量
# 在添加了update_config后,当你使用docker stack deploy命令更新stack时,Swarm会使用滚动更新策略,这样就可以在不中断服务的情况下进行更新了
update_config: # 添加滚动更新
parallelism: 3 # 一次更新2个
delay: 10s # 间隔10秒
rollback_config: # 添加回滚行为
parallelism: 3 # 一次更新3个
delay: 10s # 间隔10秒
resources:
limits:
cpus: '0.5' # 限制每个容器使用的最大CPU为1.5核
memory: 512M # 限制每个容器使用的最大内存为512MB
reservations:
cpus: '0.1' # 保留至少0.5核CPU给每个容器
memory: 128M # 保留至少256MB的内存给每个容器
volumes:
nfs_html:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=192.168.31.181,rw
device: ":/nginx/html"
nfs_conf:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=192.168.31.181,rw
device: ":/nginx/conf"
networks:
nginx-net: #需要创建的网络名称
driver: overlay #指定网络类型
6.5 swarm 重新部署server - 滚动升级
问题:
在更新Dockerfile后,重新构建镜像,即:更新镜像后
直接执行docker service update 时,无法更新容器的镜像,需要执行:
docker stack deploy -c docker-compose.yml nginx --with-registry-auth
需要添加--with-registry-auth,防止node节点无法拉取远程镜像
来部署或更新堆栈
root@swarm-m1:/data/project/nginx# docker stack deploy -c docker-compose.yml nginx --with-registry-auth
Updating service nginx_nginx (id: lgicaxzr8r8jlio80agv5899y)
执行完成后,可以查看更新情况
root@swarm-m1:/data/project/nginx# docker service ps nginx_nginx | grep Running
cqfjs2tq34h7 nginx_nginx.1 101.43.228.87:5003/test/nginx:v4 swarm-n1 Running Running 15 seconds ago
whdgvyuhtvzw nginx_nginx.2 101.43.228.87:5003/test/nginx:v4 swarm-n2 Running Running 14 seconds ago
s7kg64f0sobp nginx_nginx.3 101.43.228.87:5003/test/nginx:v4 swarm-n1 Running Running 32 seconds ago
rloyt5t7nb36 nginx_nginx.4 101.43.228.87:5003/test/nginx:v4 swarm-n2 Running Running 1 second ago
vqtrmv8p8crt nginx_nginx.5 101.43.228.87:5003/test/nginx:v4 swarm-n2 Running Running less than a second ago
uo1t7w7ph8z0 nginx_nginx.6 101.43.228.87:5003/test/nginx:v4 swarm-n1 Running Running 32 seconds ago
aidkm19309kd nginx_nginx.7 101.43.228.87:5003/test/nginx:v4 swarm-n1 Running Running less than a second ago
zjj0go08u0yn nginx_nginx.9 101.43.228.87:5003/test/nginx:v4 swarm-n2 Running Running 15 seconds ago
说明:
docker stack deploy命令用于在Docker Swarm模式下部署或更新服务。当更改了docker-compose.yml文件中的内容并希望这些更改反映在Swarm集群中的服务上时,通常需要运行此命令。
不需要运行docker stack deploy的情况:
1. 服务日志和监控:如果您只是查看服务的日志或监控服务的健康和性能,不需要重新部署堆栈。
2. 扩展服务:如果您想增加或减少服务的副本数量,可以使用docker service scale命令而不是重新部署整个堆栈。
3. 查看服务详情:使用docker service inspect或docker service ps查看服务的配置和状态时不需要重新部署。
4. 手动滚动更新:如果您想手动控制滚动更新的过程,可以使用docker service 5. update命令。但是,请注意,这些更改不会被记录在docker-compose.yml文件中。
6. 服务的运维操作:如清理旧的任务或容器、重启特定任务等,这些都不需要重新部署堆栈。
6.6 更新后回滚
需要在docker-compose中写明回滚操作:
rollback_config: # 添加回滚行为
parallelism: 3 # 一次更新3个
delay: 10s # 间隔10秒文章来源地址https://www.toymoban.com/news/detail-777820.html
root@swarm-m1:/data/project/nginx# docker service rollback nginx_nginx
nginx_nginx
rollback: manually requested rollback
overall progress: rolling back update: 8 out of 8 tasks
1/8: running [==================================================>]
2/8: running [==================================================>]
3/8: running [==================================================>]
4/8: running [==================================================>]
5/8: running [==================================================>]
6/8: running [==================================================>]
7/8: running [==================================================>]
8/8: running [==================================================>]
verify: Service converged
首先,需要理解当使用docker stack deploy时,其实是在更新服务,而不只是简单地部署。每次当使用该命令并更改docker-compose.yml的内容,实际上正在对服务进行更新。
执行docker service rollback时,是在告诉Docker Swarm回滚到上一个服务的状态
回滚配置: 默认情况下,Docker Swarm的服务不会保存所有的版本,所以回滚只会回到上一个状态。如果你在短时间内多次使用docker stack deploy命令,并在不停地更改配置,那么你可能无法回滚到你想要的那个特定版本。
镜像标签: 如果你在多次部署中使用了相同的镜像标签(例如:latest),这可能会引起混淆。每次部署时,最好使用不同的、具体的版本标签,这样在回滚时你会知道你回滚到了哪个版本。
有时回退时,不会生效,
为了解决这个问题,你可以考虑以下的方法:
在每次构建新的镜像时,使用不同的版本标签而不是覆盖现有的标签。这样,你可以确保每次部署都有一个清晰的版本历史,使回滚变得更加明确。
如果你需要回滚到特定的服务配置或镜像,而不是上一个版本,你可能需要手动使用docker service update命令指定镜像版本和配置。
确保你的Swarm配置、网络和存储设置都正确,以避免回滚时出现问题。
考虑使用Docker的版本控制工具和持续集成/持续部署工具,以自动化和跟踪你的部署过程,确保你可以轻松地回到任何之前的状态。
7. 调度策略
Apache Benchmark (ab) 是 Apache HTTP 服务器套件的一部分。以下是如何在不同的操作系统上安装 ab:
7.1 Ubuntu/Debian安装
apt-get update
apt-get -y install apache2-utils
7.2 CentOS安装
yum -y install httpd-tools
安装完成后,你可以在终端或命令行中输入 ab 来验证其是否已经正确安装。
7.3 使用
root@swarm-m1:/data/project/nfs/mount/nginx/html# ab -n 10000 -c 1000 http://192.168.31.181:80/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.31.181 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.23.3
Server Hostname: 192.168.31.181
Server Port: 80
Document Path: /
Document Length: 619 bytes
Concurrency Level: 1000
Time taken for tests: 2.611 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 8520000 bytes
HTML transferred: 6190000 bytes
Requests per second: 3830.46 [#/sec] (mean)
Time per request: 261.065 [ms] (mean)
Time per request: 0.261 [ms] (mean, across all concurrent requests)
Transfer rate: 3187.07 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 89 15.1 90 126
Processing: 46 160 52.9 154 392
Waiting: 1 131 54.2 125 365
Total: 140 249 52.5 243 473
Percentage of the requests served within a certain time (ms)
50% 243
66% 261
75% 274
80% 284
90% 318
95% 356
98% 394
99% 406
100% 473 (longest request)
到了这里,关于docker nfs文件系统持久化,swarm部署NGINX使用nfs示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!