Docker commit не сохраняет мои изменения в изображение - PullRequest
0 голосов
/ 15 января 2019

Я новичок в мире докеров: сейчас я могу развернуть докеры и выполнить некоторую работу.

Попытка перейти на следующий уровень - сохранить мои изменения и переместить мои контейнеры / изображения на другой компьютер / сервер.

В настоящее время я использую докер в Windows 10, но у меня есть доступ к серверу Ubuntu 16.04 для проверки моей работы.

Вот где я застрял: у меня в Docker развернуты образы Wordpress и MariaDB.
Мой WP отлично работает. Я установил несколько тем и создал несколько страниц с изображениями.

На данный момент мне нравится сохранять свою работу и отправлять ее моему другу, который развернет мой образ и продолжит работу над тем же Wordpress.

В Интернете я прочитал следующее: я должен выполнить команду docker commit, чтобы сохранить и создать образ докера в формате .tar, а затем отправить этот файл изображения (.tar) моему другу. Он запустит docker load -i в моем файле, чтобы загрузить его как изображение в свой докер, а затем создаст из него контейнер, который должен дать ему всю мою работу над Wordpress.

Просто чтобы уточнить, я отправляю и Wordpress, и Mariadb контейнеры.
У меня не подключены внешние тома, поэтому вся работа сохраняется в контейнерах.

Я не забываю ставить галочку на диске C и D в настройках докера, но я не знаю, связано ли это с томами.

Я не получаю никакой ошибки в процессе фиксации и перемещения .tar файлов. Как только мой друг создает свои контейнеры из моих изображений, он получает чистый Wordpress (как новая установка Wordpress, начиная со страниц настройки wp).

Еще одна вещь, которую я заметил, это то, что создаваемое мной изображение имеет тот же размер файла, что и исходное изображение, которое я вытащил. Когда я запускаю docker images, я вижу, что мое изображение имеет размер 420 МБ, а изображение Wordpress - 420 МБ.

Я думаю, что мое изображение должно быть немного больше, так как я установил темы, плагины и загруженные изображения в Wordpress. По крайней мере, он должен добавить на 3–5 МБ больше оригинальных изображений. Пожалуйста помоги. Спасибо.

Запуск docker system df дает мне это.

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   3                   1.259GB             785.9MB (62%)
Containers          3                   3                   58.96kB             0B (0%)
Local Volumes       2                   2                   311.4MB             0B (0%)
Build Cache         0                   0                   0B                  0B

Ответы [ 4 ]

0 голосов
/ 15 января 2019

Вы должны использовать тома для хранения ваших данных. Здесь вы можете найти документацию: https://docs.docker.com/storage/volumes/

Например, вы можете сделать что-то подобное в вашем docker-compose.yml.

version: '3.1'

services:
  wordpress:
    image: wordpress:php7.2-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: databasename
      WORDPRESS_DB_USER: username
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: namedatabase
    volumes:
      - name_volume:/var/www/html
volumes:
  - name_volume:

или

    volumes:
      - ./yourpath:/var/www/html
0 голосов
/ 15 января 2019

Вы никогда не должны запускать docker commit.

Чтобы ответить на ваш ближайший вопрос, контейнеры, в которых работают базы данных, обычно хранят свои данные в томах ; они настроены таким образом, что данные хранятся на анонимном томе, даже если не была задана опция docker run -v для явного хранения данных в именованном томе или каталоге хоста. Это означает, что docker commit никогда не сохраняет данные в базе данных, и вам нужен какой-то другой механизм для копирования реальных данных.

На более практическом уровне ваш коллега может задавать вопросы, такие как "откуда взялся этот тарболл 400 МБ, почему я должен ему доверять и как я могу восстановить его, если он был поврежден при транспортировке?" Есть также хорошие вопросы, такие как «базовая база данных содержит исправление безопасности, в котором я нуждаюсь, так как мне получить изменения, которые я сделал поверх нового базового образа?» Если вы прилежны, вы можете записать все, что вы делаете в текстовом файле. Если у вас есть текстовый файл с надписью «Я начал с mysql:5.6, то я бежал ...», это очень близко к Dockerfile. Синтаксис прост, и у Docker есть хорошее руководство по по созданию и запуску пользовательских образов .

Когда вам нужно пользовательское изображение, вы всегда должны описывать, что входит в него, используя Dockerfile, который можно проверить в управлении исходным кодом, и можно восстановить изображение, используя docker build.

Для вашего случая использования это не звучит так, как будто вам действительно нужно пользовательское изображение. Я бы, вероятно, предложил установить YAML-файл Docker Compose , в котором описаны ваши настройки и фактически хранятся данные в локальных каталогах. База данных, половина которой может выглядеть как

version: '3'
services:
  db:
    image: 'mysql:8.0'
    volumes:
      - './mysql:/var/lib/mysql/data'
    ports:
      - '3306:3306'

Данные будут храниться на хосте , в подкаталоге mysql. Теперь вы можете скопировать это дерево каталогов и отправить этот файл tar своему коллеге, который затем сможет распаковать его и воссоздать ту же среду со связанными данными.

0 голосов
/ 15 января 2019

Использовать docker build (изменения в изображениях должны быть сохранены в Dockerfile).

Теперь, если у вас есть несколько служб, просто используйте брата докера docker-compose. Один дополнительный шаг, который вам нужно сделать, - это создать docker-compose.yml (пока не бойтесь, мой друг, в этом нет ничего тривиального). Все, что вы делаете в этом файле, перечисляет ваши изображения (наряду с определением, где находится их файл Dockerfile для этого изображения, может быть в некоторой подпапке для каждого изображения). Вы также можете определить некоторые другие свойства, если хотите.

0 голосов
/ 15 января 2019

Убедитесь, что как показано здесь , чтобы зафиксировать работающий контейнер (чтобы избежать очистки данных)

docker commit CONTAINER_ID yourImage

После команды docker commit вы можете использовать docker save, чтобы сохранить изображение в tar, и docker load, чтобы импортировать его обратно, , как показано здесь .

...