viv*_*d4v 23 docker docker-compose docker-swarm docker-swarm-mode
我有一个v3的撰写文件,其中有3个服务共享/使用相同的卷.在使用swarm模式时,我们需要创建额外的容器和卷来管理整个群集中的服务.
我打算使用NFS服务器,以便将单个NFS共享直接挂载到群集中的所有主机上.
我在下面找到了两种方法,但它需要在docker主机上执行额外的步骤 -
在主机上使用"fstab"或"mount"命令挂载NFS共享,然后将其用作docker服务的主机卷.
使用Netshare插件 - https://github.com/ContainX/docker-volume-netshare
有没有一种标准的方法,我可以使用docker compose v3直接使用/挂载NFS共享,只需执行少量/无步骤(我知道无论如何都需要"nfs-common"包)在docker主机上?
xro*_*bau 40
在发现这是大量未记录的之后,这是使用堆栈和docker compose挂载NFS卷的正确方法.
最重要的是你需要使用version: "3.2"或更高.如果不这样做,你将会遇到奇怪且不明显的错误.
第二个问题是,当定义更改时,卷不会自动更新.这可能会导致您认为您的更改不正确,当它们尚未应用时,就会陷入困境.确保docker rm VOLUMENAME它可能在任何地方,就像卷存在一样,它将不会被验证.
第三个问题更多的是NFS问题 - 如果NFS文件夹不存在,则不会在服务器上创建该文件夹.这就是NFS的工作方式.在做任何事之前,你需要确保它存在.
(除非你确定你知道你在做什么,否则不要删除'soft'和'nolock' - 如果你的NFS服务器消失,这会阻止docker冻结)
这是一个完整的例子:
[root@docker docker-mirror]# cat nfs-compose.yml
version: "3.2"
services:
rsyslog:
image: jumanjiman/rsyslog
ports:
- "514:514"
- "514:514/udp"
volumes:
- type: volume
source: example
target: /nfs
volume:
nocopy: true
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"
[root@docker docker-mirror]# docker stack deploy --with-registry-auth -c nfs-compose.yml rsyslog
Creating network rsyslog_default
Creating service rsyslog_rsyslog
[root@docker docker-mirror]# docker stack ps rsyslog
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
tb1dod43fe4c rsyslog_rsyslog.1 jumanjiman/rsyslog:latest swarm-4 Running Starting less than a second ago
[root@docker docker-mirror]#
Run Code Online (Sandbox Code Playgroud)
现在,在swarm-4上:
root@swarm-4:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d883e0f14d3f jumanjiman/rsyslog:latest "rsyslogd -n -f /e..." 6 seconds ago Up 5 seconds 514/tcp, 514/udp rsyslog_rsyslog.1.tb1dod43fe4cy3j5vzsy7pgv5
root@swarm-4:~# docker exec -it d883e0f14d3f df -h /nfs
Filesystem Size Used Available Use% Mounted on
:/docker/example 7.2T 5.5T 1.7T 77% /nfs
root@swarm-4:~#
Run Code Online (Sandbox Code Playgroud)
将在运行堆栈的任何swarm节点上创建(但不销毁)此卷.
root@swarm-4:~# docker volume inspect rsyslog_example
[
{
"CreatedAt": "2017-09-29T13:53:59+10:00",
"Driver": "local",
"Labels": {
"com.docker.stack.namespace": "rsyslog"
},
"Mountpoint": "/var/lib/docker/volumes/rsyslog_example/_data",
"Name": "rsyslog_example",
"Options": {
"device": ":/docker/example",
"o": "addr=10.40.0.199,nolock,soft,rw",
"type": "nfs"
},
"Scope": "local"
}
]
root@swarm-4:~#
Run Code Online (Sandbox Code Playgroud)
BMi*_*tch 28
根据我需要如何使用音量,我有以下 3 个选项。
首先,您可以直接创建命名卷,并将其用作 compose 中的外部卷,或用作docker runordocker service create命令中的命名卷。
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=nfs.example.com,rw \
--opt device=:/path/to/dir \
foo
Run Code Online (Sandbox Code Playgroud)
接下来,有--mount适用于docker runand的语法docker service create。这是一个相当长的选项,当您在另一个逗号分隔选项中嵌入一个逗号分隔选项时,您需要将一些引号(转义以便 shell 不会删除它们)传递给正在运行的命令。我倾向于将其用于需要访问 NFS 的一次性容器(例如用于设置 NFS 目录的实用程序容器):
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
Run Code Online (Sandbox Code Playgroud)
最后,您可以在撰写文件中定义命名卷。执行此操作时的一个重要注意事项,名称卷只会创建一次,并且不会随任何更改而更新。因此,如果您需要修改命名卷,则需要为其指定一个新名称。
# inside a docker-compose file
...
services:
example-app:
volumes:
- "nfs-data:/data"
...
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=nfs.example.com,rw
device: ":/path/to/dir"
...
Run Code Online (Sandbox Code Playgroud)
在这些示例中的每一个中:
nfs,不是nfs4。这是因为 docker 在该addr领域提供了一些不错的功能,但仅限于nfs类型。o是传递给挂载系统调用的选项。Linux 中 mount 系统调用和 mount 命令之间的一个区别是设备具有:移动到addr选项之前的部分。nfsvers用于设置 NFS 版本。这避免了操作系统首先尝试其他 NFS 版本时的延迟。addr使用时可能是 DNS 名称type=nfs,而不仅仅是 IP 地址。如果您有多个 VPC 和使用相同 DNS 名称的不同 NFS 服务器,或者如果您想在未来调整 NFS 服务器而不更新每个卷挂载,则非常有用。rw(读写))可以传递给该o选项。device字段是远程 NFS 服务器上的路径。前导冒号是必需的。这是 mount 命令如何将 IP 地址移动到addr系统调用字段的工件。在将卷装入容器之前,该目录必须存在于远程主机上。--mount语法中,该dst字段是容器内的路径。对于命名卷,您可以在docker run -v命令的卷安装(以简短语法)的右侧设置此路径。如果您在访问远程 NFS 卷时遇到权限问题,我遇到的一个常见原因是容器以 root 身份运行,NFS 服务器设置为 root squash(将所有 root 访问权限更改为 nobody 用户)。您要么需要将容器配置为作为众所周知的非根 UID 运行,该 UID 可以访问 NFS 服务器上的目录,或者在 NFS 服务器上禁用根压缩。
是的,您可以直接从撰写文件中引用NFS:
volumes:
db-data:
driver: local
driver_opts:
type: nfs
o: addr=$SOMEIP,rw
device: ":$PathOnServer"
Run Code Online (Sandbox Code Playgroud)
以类似的方式,您可以在每个主机上创建一个nfs卷.
docker volume create --driver local --opt type=nfs --opt o=addr=$SomeIP,rw --opt device=:$DevicePath --name nfs-docker
Run Code Online (Sandbox Code Playgroud)
我的适用于AWS EFS的解决方案有效:
安装nfs-common软件包:
sudo apt-get install -y nfs-common
检查您的ef是否有效:
mkdir efs测试点 须藤chmod go + rw efs-test-point
须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
触摸efs-test-point / 1.txt 须藤umount efs-test-point / ls -la efs-test-point /
目录必须为空
须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
ls -la efs-test-point/
文件1.txt必须存在
配置docker-compose.yml文件:
服务:
sidekiq:
数量:
-uploads_tmp_efs:/ home / application / public / uploads / tmp
...
数量:
uploads_tmp_efs:
司机:本地
driver_opts:
类型:nfs
o:addr = [YOUR_EFS_DNS],nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2
设备:[YOUR_EFS_DNS]:/| 归档时间: |
|
| 查看次数: |
37042 次 |
| 最近记录: |