Как напрямую монтировать NFS share / volume в контейнер с помощью docker compose v3
У меня есть файл compose с v3, где есть 3 службы совместного использования / с использованием того же Тома. При использовании режима swarm нам необходимо создать дополнительные контейнеры и Тома для управления нашими службами в кластере.
Я планирую использовать сервер NFS, чтобы один общий ресурс NFS был установлен непосредственно на всех хостах в кластере.
Я нашел ниже два способа сделать это, но для этого необходимо выполнить дополнительные шаги на хосте docker -
подключите общий ресурс NFS с помощью команды" fstab "или" mount " на хосте, а затем используйте его в качестве Тома хоста для служб docker.
использовать плагин Netshare -https://github.com/ContainX/docker-volume-netshare
есть ли стандартный способ, которым я могу напрямую использовать / монтировать NFS share с помощью docker compose v3, выполнив только несколько / нет шагов(я понимаю, что пакет "NFS-common" требуется в любом случае) на узел Docker?
2 ответов
обнаружив,что это массово недокументировано, вот правильный способ монтирования Тома NFS с помощью stack и docker compose.
самое главное, что вам нужно использовать version: "3.2"
или выше. У вас будут странные и неочевидные ошибки, если вы этого не сделаете.
вторая проблема заключается в том, что Тома не автоматически обновляется при изменении их определения. Это может привести вас в кроличью нору, думая, что ваши изменения не правильно, когда они просто не были применены. Убедитесь, что вы docker rm VOLUMENAME
везде, где это возможно, как будто том существует, он не будет проверен.
третья проблема-это больше проблема NFS-папка NFS будет не будет создана на сервере, если он не существует. Именно так работает NFS. Вы должны убедиться, что он существует, прежде чем что-либо делать.
(не удаляйте "soft" и "nolock", если вы не уверены, что знаете, что делаете - это останавливается докер от замораживания, если ваш сервер NFS уходит)
вот пример:
[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]#
теперь, на рой-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:~#
этот том будет создан (но не уничтожена) на любом узле роя, на котором работает стек.
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:~#
Да вы можете напрямую ссылаться на NFS из файла compose:
volumes:
db-data:
driver: local
driver_opts:
type: nfs
o: addr=$SOMEIP,rw
device: ":$PathOnServer"
и аналогичным образом вы можете создать том nfs на каждом хосте.
docker volume create --driver local --opt type=nfs --opt o=addr=$SomeIP,rw --opt device=:$DevicePath --name nfs-docker