Изменение директории для хранения docker

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

БЕЗ рестар­та доке­ра обра­за не под­тя­ги­ва­ют­ся, если всё это в про­ме, то такой вари­ант не вариант