Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
linux_faq:docker_migrate_to_another_host [2019/08/20 15:09] – [Задача] admin | linux_faq:docker_migrate_to_another_host [2019/08/21 07:00] (current) – admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | |||
+ | ====== Задача ====== | ||
+ | Нужно мигрировать контейнеры **docker** (инсталляцию AWX) на новый хост. Инсталляция содержит 5 контейнеров, | ||
+ | Контейнеры имеют смонтированные **volumes**, | ||
+ | ===== Переносим **Volumes** ===== | ||
+ | Предварительно, | ||
+ | Скрипт просматривает конфигурацию контейнеров **awx**, берет оттуда настройки **mounts**, создает на удаленном хосте такие же и копирует данные. | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | remote_host=awx | ||
+ | user=usik.ma | ||
+ | # | ||
+ | rsync_path=" | ||
+ | containers=`docker container ls --format " | ||
+ | for container in $(echo $containers) | ||
+ | do | ||
+ | echo " | ||
+ | docker container stop $container | ||
+ | mounts=`docker container inspect $container --format "{{ range .Mounts }}{{ .Type }}:{{ .Name }}:{{ .Source }}:{{ .Destination }} {{ end }}"` | ||
+ | for mount in `echo $mounts` | ||
+ | do | ||
+ | mount_type=`echo $mount | cut -d: -f1` | ||
+ | case $mount_type in | ||
+ | bind) | ||
+ | echo "type - bind" | ||
+ | echo $mount | ||
+ | bind_src=`echo $mount | cut -d: -f3` | ||
+ | echo "Bind SRC - $bind_src" | ||
+ | rsync -aRvvP --rsync-path=" | ||
+ | ;; | ||
+ | | ||
+ | echo "type - Volume" | ||
+ | echo $mount | ||
+ | vol_name=`echo $mount | cut -d: -f2` | ||
+ | # echo $pass | ssh -tt $user@$remote_host "sudo docker volume create $vol_name" | ||
+ | ssh $user@$remote_host "sudo docker volume create $vol_name" | ||
+ | vol_local_mountpoint=`docker volume inspect $vol_name --format " | ||
+ | # vol_remote_mountpoint=`echo $pass | ssh -tt $user@$remote_host "sudo docker volume inspect $vol_name --format ' | ||
+ | vol_remote_mountpoint=`ssh $user@$remote_host "sudo docker volume inspect $vol_name --format ' | ||
+ | vol_remote_mountpoint=`echo $vol_remote_mountpoint | sed ' | ||
+ | echo "local mountpoint - $vol_local_mountpoint; | ||
+ | rsync -avvP --rsync-path=" | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | docker container start $container | ||
+ | done | ||
+ | |||
+ | </ | ||
+ | ===== Создаем коммит с текущим состоянием контейнеров ===== | ||
+ | while read -r line; do docker commit $line; done < <(docker container ls --format " | ||
+ | ===== Переносим images на новый хост и загружаем их ===== | ||
+ | #while read -r line; do docker save $line | ssh -C awx docker load; done < <(docker images --format " | ||
+ | while read -r line; do docker save $line | ssh -C awx docker load; done < <(docker images --format " | ||
+ | ===== Удаляем коммиты имиждей на исходном хосте ===== | ||
+ | while read -r line; do docker image rm $line; done < <(docker images --format " | ||
+ | ===== Создаем контейнеры на новом хосте ===== | ||
+ | А теперь можно создать контейнеры из скопированных имиджей с помощью команды **docker create**, либо воспользоваться **docker compose**. Файл лежит тут: **/ | ||
+ | rsync -avvP --rsync-path=" | ||
+ | Редактируем его, указывая в качестве имиджей - те, что были созданы, | ||
+ | < | ||
+ | services: | ||
+ | |||
+ | web: | ||
+ | image: awx_web_current | ||
+ | container_name: | ||
+ | depends_on: | ||
+ | - rabbitmq | ||
+ | - memcached | ||
+ | - postgres | ||
+ | ports: | ||
+ | - " | ||
+ | hostname: awxweb | ||
+ | user: root | ||
+ | restart: always | ||
+ | volumes: | ||
+ | - "/ | ||
+ | - "/ | ||
+ | - "/ | ||
+ | environment: | ||
+ | http_proxy: | ||
+ | https_proxy: | ||
+ | no_proxy: | ||
+ | |||
+ | task: | ||
+ | image: awx_task_current | ||
+ | container_name: | ||
+ | depends_on: | ||
+ | - rabbitmq | ||
+ | - memcached | ||
+ | - web | ||
+ | - postgres | ||
+ | hostname: awx | ||
+ | user: root | ||
+ | restart: always | ||
+ | volumes: | ||
+ | - "/ | ||
+ | - "/ | ||
+ | - "/ | ||
+ | environment: | ||
+ | http_proxy: | ||
+ | https_proxy: | ||
+ | no_proxy: | ||
+ | |||
+ | rabbitmq: | ||
+ | image: awx_rabbitmq_current | ||
+ | container_name: | ||
+ | restart: always | ||
+ | environment: | ||
+ | RABBITMQ_DEFAULT_VHOST: | ||
+ | RABBITMQ_DEFAULT_USER: | ||
+ | RABBITMQ_DEFAULT_PASS: | ||
+ | RABBITMQ_ERLANG_COOKIE: | ||
+ | http_proxy: | ||
+ | https_proxy: | ||
+ | no_proxy: | ||
+ | |||
+ | memcached: | ||
+ | image: " | ||
+ | container_name: | ||
+ | restart: always | ||
+ | environment: | ||
+ | http_proxy: | ||
+ | https_proxy: | ||
+ | no_proxy: | ||
+ | |||
+ | postgres: | ||
+ | image: awx_postgres_current | ||
+ | container_name: | ||
+ | restart: always | ||
+ | volumes: | ||
+ | - / | ||
+ | environment: | ||
+ | POSTGRES_USER: | ||
+ | POSTGRES_PASSWORD: | ||
+ | POSTGRES_DB: | ||
+ | PGDATA: / | ||
+ | http_proxy: | ||
+ | https_proxy: | ||
+ | no_proxy: | ||
+ | </ | ||
+ | После этого переходим в папку c файликом **docker-compose.yml** и запускаем наши контейнеры: | ||
+ | cd / | ||
+ | docker-compose up -d | ||
+ | После запуска остановим контейнеры и перезагрузимся, | ||
+ | docker stop $(docker ps -a -q) | ||
+ | sudo reboot | ||