Thank you for reading this post, don't forget to subscribe!
Для того, чтобы docker хранил данные не по стандартному пути /var/lib/docker
docker info|grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
а например в директории:/dir_for_docker_imagesнеобходимо следующее:Останавливаем все контейнеры.
Создаём директорию:
mkdir -p /etc/systemd/system/docker.service.d
И файл/etc/systemd/system/docker.service.d/docker-storage.conf
После чего правим его:
Для версии докера до 17.06-ce:
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"
Для докеров после 17.06-ce:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root=/dir_for_docker_images
Альтернативный метод через daemon.json
В /etc/docker/daemon.json добавьте:
{
"graph": "/mnt",
"storage-driver": "overlay"
}
Далее systemctl daemon-reload и systemctl restart docker
После можем проверять:
docker info|grep "Docker Root Dir"
Docker Root Dir: /dir_for_docker_images
Далее можем удалять все данные из /var/lib/docker
--------------------------------------------------------------------------------------------------------------------------------
Вариант когда нужно сохранить имеющиеся image
Останавливаем контейнеры:
[root@rust1 ~]# docker stop apache_php54 apache_php53
apache_php54
apache_php53
Проверяем:
[root@rust1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.10.10.10:4567/ababkin/testweb apache_php54 ea4992f6b59a 2 months ago 417MB
10.10.10.10:4567/ababkin/testweb apache_php53 a014d7674393 2 months ago 324MB
[root@rust1 ~]# docker info|grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
Создаём:
[root@rust1 ~]# mkdir /dir_for_docker_images
[root@rust1 ~]# mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/docker-storage.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root=/dir_for_docker_images
Перезапускаем и проверяем:
[root@rust1 ~]# systemctl daemon-reload
[root@rust1 ~]# systemctl restart docker
[root@rust1 ~]# docker info|grep "Docker Root Dir"
Docker Root Dir: /dir_for_docker_images
[root@rust1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@rust1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Копируем все содержимое из /var/lib/docker в нашу /dir_for_docker_images
cp -R /var/lib/docker/* /dir_for_docker_images/
Теперь перезапускаем докер чтобы наши образа и контейнеры подхватились системой:
[root@rust1 ~]# systemctl restart docker
[root@rust1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.10.10.10:4567/ababkin/testweb apache_php54 ea4992f6b59a 2 months ago 417MB
10.10.10.10:4567/ababkin/testweb apache_php53 a014d7674393 2 months ago 324MB
[root@rust1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd5176026620 10.10.10.10:4567/ababkin/testweb:apache_php54 "/usr/sbin/httpd -D …" 2 months ago Up About a minute 0.0.0.0:8054->8054/tcp apache_php54
8d4a3e249cc4 10.10.10.10:4567/ababkin/testweb:apache_php53 "/usr/sbin/httpd -D …" 2 months ago Up About a minute 0.0.0.0:8053->8053/tcp apache_php53
--------------------------------------------------------------------------------------------------------------------------
Вариант когда image должны подтягиваться с glusterfs
Docker хранит данные в следующей директории:
[root@rust2 ~]# docker info|grep "Docker Root Dir"
Docker Root Dir: /dir_for_docker_images
Image скачиваются в директорию:/dir_for_docker_images/overlay2/добавим данную директорию в gluster. Для начала настроим гластер
Имеем 3 сервера.
10.10.10.1 centos7 (СЕРВЕР)
10.10.10.2 rust1 (СЕРВЕР)
10.10.10.3 rust2 (КЛИЕНТ)
Ставим на все:
yum install -y centos-release-gluster5.noarch
На сервера:
yum install -y glusterfs gluster-cli glusterfs-libs glusterfs-server
На клиент:
yum install -y glusterfs-client
В /etc/hosts добавим следующее:
10.10.10.1 etcd1 gluster-server1
10.10.10.2 etcd2 gluster-server2
10.10.10.3 etcd3 gluster-client1
Чтобы сервера работали совместно, объединим их в кластер.
Для этого на 1-м сервере gluster-server1 вводим команду:
gluster peer probe gluster-server2
должно появиться сообщение о результате
peer probe: success
Возможно, потребуется также и на 2-м сервере gluster-server2
gluster peer probe gluster-server1
должно появиться сообщение о результате
peer probe: success
Затем на обоих серверах перезапускаем службу GlusterFS
systemctl restart glusterd
После этого на любом из серверов (можно на обоих) проверяем
gluster pool list
Создадим volume который будет называться IMAGES на мастере
gluster volume create IMAGES replica 2 transport tcp gluster-server1:/dir_for_docker_images/overlay2 gluster-server2:/dir_for_docker_images/overlay2 force
volume create: IMAGES: success: please start the volume to access data
Создаём вольюм для метаданных:
gluster volume create IMAGES_metadata replica 2 transport tcp gluster-server1:/dir_for_docker_images/image gluster-server2:/dir_for_docker_images/image/ force
Стартуем наш volume
gluster volume start IMAGES
gluster volume start IMAGES_metadata
Уменьшим время в течение которого клиент ожидает ответ от сервера и в случае недоступности сервера автоматически переподключается к другому серверу в trusted storage pool(по умолчанию таймаут 42 секунды, что вынуждает клиента ожидать 42 секунды, чтобы переключитcя на другую ноду,если текущая не отвечает)
gluster volume set IMAGES network.ping-timeout "5"
gluster volume set IMAGES_metadata network.ping-timeout "5"
Разрешаем монтирование соединения только с локального хоста:
gluster volume set IMAGES auth.allow 127.0.0.1
(так как у нас будут подключаться клиенты то данную опцию не используем) (чтобы убрать её нужно ввести gluster volume reset IMAGES auth.allow force)
Затем на каждом узле Gluster (СЕРВЕР) мы производим монтирование:
mount.glusterfs localhost:/IMAGES /var/lib/docker/overlay2/
mount.glusterfs localhost:/IMAGES_metadata /var/lib/docker/image/
добавляем в/etc/fstab на мастерах
localhost:/IMAGES /var/lib/docker/overlay2 glusterfs defaults,_netdev 0 0
localhost:/IMAGES_metadata /var/lib/docker/image glusterfs defaults,_netdev 0 0
На клиенте запускаем
mount.glusterfs gluster-server1:/IMAGES /dir_for_docker_images/overlay2/
mount.glusterfs gluster-server1:/IMAGES_metadata /dir_for_docker_images/image/
Добавляем в /etc/fstab на клиенте
gluster-server1:/IMAGES /dir_for_docker_images/overlay2 glusterfs defaults,_netdev 0 0
gluster-server1:/IMAGES_metadata /dir_for_docker_images/image glusterfs defaults,_netdev 0 0
Для проверки, выкачиваем nginx
[root@centos7 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c
Status: Downloaded newer image for nginx:latest
[root@centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 27a188018e18 7 days ago 109MB
[root@rust2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@rust1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Как видим на rust1,2 образы отсутсвуют
Проверяем отработал ли gluster, проверим примонтированные директории:
[root@rust2 ~]# ll /dir_for_docker_images/image/overlay2/
total 13
drwx------ 4 root root 4096 Apr 24 14:09 distribution
drwx------ 4 root root 4096 Apr 24 13:47 imagedb
drwx------ 4 root root 4096 Apr 24 14:09 layerdb
-rw------- 1 root root 19 Apr 24 14:05 repositories.json
[root@rust2 ~]# ll /dir_for_docker_images/overlay2/
total 20
drwxr-xr-x 2 root root 4096 Apr 24 13:21 5
drwx------ 3 root root 4096 Apr 24 13:47 7dd9e78fd9366fe32f1cc131a64118ad14900809b158c324bbdd00a1fbc73436
drwx------ 4 root root 4096 Apr 24 13:47 bf5355b40a03d90220779d32cfdf238cf9fda1c28592238485dee30ec247c632
drwx------ 4 root root 4096 Apr 24 13:47 f93e307b5292ea7c3c6e3f981035ead82254aba2cb39680ab975b1b9de44c956
drwx------ 2 root root 4096 Apr 24 13:32 l
[root@rust1 ~]# ll /var/lib/docker/image/overlay2/
total 13
drwx------ 4 root root 4096 Apr 24 13:47 distribution
drwx------ 4 root root 4096 Apr 24 13:47 imagedb
drwx------ 4 root root 4096 Apr 24 13:47 layerdb
-rw------- 1 root root 19 Apr 24 14:05 repositories.json
[root@rust1 ~]# ll /var/lib/docker/overlay2/
total 20
drwxr-xr-x 2 root root 4096 Apr 24 13:21 5
drwx------ 3 root root 4096 Apr 24 13:47 7dd9e78fd9366fe32f1cc131a64118ad14900809b158c324bbdd00a1fbc73436
drwx------ 4 root root 4096 Apr 24 13:47 bf5355b40a03d90220779d32cfdf238cf9fda1c28592238485dee30ec247c632
drwx------ 4 root root 4096 Apr 24 13:47 f93e307b5292ea7c3c6e3f981035ead82254aba2cb39680ab975b1b9de44c956
drwx------ 2 root root 4096 Apr 24 13:32 l
Чтобы образ отобразился, необходимо перезапустить docker
[root@rust1 ~]# systemctl restart docker
[root@rust2 ~]# systemctl restart docker
[root@rust1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 27a188018e18 7 days ago 109MB
[root@rust1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 27a188018e18 7 days ago 109MB
БЕЗ рестарта докера образа не подтягиваются, если всё это в проме, то такой вариант не вариант