Я теряю свои данные, когда контейнер выходит

Несмотря на Docker Интерактивное учебное пособие и faq я потерять мои данные, когда контейнер выйдет.

Я установил Docker, как описано здесь: http://docs.docker.io/en/latest/installation/ubuntulinux без проблем на ubuntu 13.04.

Но при выходе он теряет все данные.

[email protected]:~$ sudo docker version
Client version: 0.6.4 
Go version (client): go1.1.2 
Git commit (client): 2f74b1c 
Server version: 0.6.4 
Git commit (server): 2f74b1c 
Go version (server): go1.1.2 
Last stable version: 0.6.4 


[email protected]:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
[email protected]:~$ sudo docker run ubuntu apt-get install ping
Reading package lists... 
Building dependency tree... 
The following NEW packages will be installed: 
  iputils-ping 
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. 
Need to get 56.1 kB of archives. 
After this operation, 143 kB of additional disk space will be used. 
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB] 
debconf: delaying package configuration, since apt-utils is not installed 
Fetched 56.1 kB in 0s (195 kB/s) 
Selecting previously unselected package iputils-ping. 
(Reading database ... 7545 files and directories currently installed.) 
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... 
Setting up iputils-ping (3:20101006-1ubuntu1) ... 
[email protected]:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
[email protected]:~$ sudo docker run ubuntu touch /home/test
[email protected]:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

Я также тестировал его с интерактивными сеансами с тем же результатом. Я что-то забыл?

РЕДАКТИРОВАТЬ: ВАЖНО ДЛЯ НОВЫХ ПОЛЬЗОВАТЕЛЕЙ DOCKER

Как сказал @mohammed-noureldin и другие, на самом деле это НЕ контейнер , выходящий из. Каждый раз, когда он просто создает новый контейнер.

Ответ 1

Вам нужно commit внести изменения в контейнер, а затем запустить его. Попробуйте следующее:

sudo docker pull ubuntu

sudo docker run ubuntu apt-get install -y ping

Затем введите идентификатор контейнера с помощью этой команды:

sudo docker ps -l

Внести изменения в контейнер:

sudo docker commit <container_id> iman/ping 

Затем запустите контейнер:

sudo docker run iman/ping ping www.google.com

Это должно работать.

Ответ 2

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

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

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin

Ответ 3

Существуют следующие способы сохранения данных контейнера:

  • Объемы докеров

  • Docker commit

    a) создайте контейнер из образа ubuntu и запустите терминал bash.

       $ docker run -i -t ubuntu:14.04 /bin/bash
    

    b) Внутри терминала установите curl

       # apt-get update
       # apt-get install curl
    

    c) Выйдите из контейнерного терминала

       # exit
    

    d) Обратите внимание на свой идентификатор контейнера, выполнив следующую команду:

       $ docker ps -a
    

    e) сохранить контейнер как новое изображение

       $ docker commit <container_id> new_image_name:tag_name(optional)
    

    f) убедитесь, что вы видите свое новое изображение с установленным завитом.

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl
    

Ответ 4

В дополнение к ответу Unferth рекомендуется создать файл Docker.

В пустом каталоге создайте файл под названием "Dockerfile" со следующим содержимым.

FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]

Создайте образ с помощью Dockerfile. Пусть используется тег, поэтому нам не нужно запоминать шестнадцатеричный номер изображения.

$ docker build -t iman/ping .

Затем запустите изображение в контейнере.

$ docker run iman/ping stackoverflow.com

Ответ 5

Возможно, вы захотите посмотреть тома докера, если хотите сохранить данные в вашем контейнере. Посетите https://docs.docker.com/engine/tutorials/dockervolumes/. Докерская документация - очень хорошее место для начала

Ответ 6

У меня есть гораздо более простой ответ на ваш вопрос, выполните следующие две команды

sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a

Приведенная выше команда ps -a возвращает список всех контейнеров. Возьмите имя контейнера, который ссылается на имя изображения - 'Ubuntu'. Например, docker auto генерирует имена для контейнеров - 'lightlyxuyzx', если вы не используете опцию --name.

Опции -t и -d важны, созданный контейнер отсоединяется и может быть присоединен, как указано ниже, с опцией -t.

С опцией --name вы можете назвать свой контейнер в моем случае "mycontainername".

sudo docker exec -ti mycontainername bash

и эта команда поможет вам войти в контейнер с помощью оболочки bash. С этого момента любые изменения, сделанные вами в контейнере, автоматически сохраняются Docker. Например - apt-get install curl внутри контейнера. Вы можете выйти из контейнера без проблем, Docker автоматически сохранит изменения.

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

Эта команда ниже запустит остановленный контейнер:

sudo docker start mycontainername

sudo docker exec -ti mycontainername bash

Другой пример с портами и общим пространством приведен ниже:

docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash

В моем случае: 7efe2989e877 - это imageid предыдущего запущенного контейнера, который я получил с помощью

докер ps -a

Ответ 7

Мое предложение состоит в том, чтобы управлять докере с помощью докеры. Легко управлять всеми контейнерами докеров для вашего проекта, вы можете сопоставлять версии и связывать разные контейнеры для совместной работы.

Документы очень просты в понимании, лучше, чем документы docker.

Документы Docker-Compose

Лучшие

Ответ 8

аналогичная проблема (и ни один из них не может установить Dockerfile) привела меня на эту страницу.

этап 0: для всех, надеясь, что Dockerfile может это исправить: пока в Dockerfile не появится -dns и -dns-search - нет возможности интегрировать ресурсы на основе интрасети.

этап 1: после создания изображения с использованием Dockerfile (кстати, это серьезный файл Dockerfile с ошибкой должен находиться в папке текущей), имея изображение для развертывания того, что основано на интрасети, запустив запуск docker script. пример: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"

этап 2: применение docker run script в режиме демона, предоставляющее локальные записи dns, чтобы иметь возможность загружать и развертывать локальные файлы.

важная точка: run script должна заканчиваться чем-то вроде /usr/bin/sudo -u ${USERNAME} bash --norc, чтобы контейнер работал даже после завершения скриптов установки.

нет, невозможно запустить контейнер в интерактивном режиме для полного вопроса автоматизации, поскольку он останется внутри внутреннего, запросит команду до CTRL-p CTRL-q нажат.

нет, если взаимодействие bash не будет выполнено в конце установки script, контейнер завершится сразу после завершения выполнения script, потеряв все результаты установки.

этап 3: контейнер все еще работает в фоновом режиме, но неясно, закончил ли контейнер процедуру установки или еще не был. используя следующий блок для определения выполнения процедуры завершения: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done script продолжит работу только после завершения установки. и это подходящий момент для вызова: commit, предоставляя текущий идентификатор контейнера, а также имя целевого изображения (он может быть таким же, как в процедуре строить/запускать, но добавлен с тегом локальной установки. Пример: docker commit containerID pack/bsp:toolchained. см. эту ссылку о том, как правильно containerID

Этап 4: был обновлен локальными установками, а также был добавлен в новое назначенное изображение (те, у кого был добавлен тег цели). теперь безопасно прекратить работу контейнера. Пример: docker stop packbsp-cont

stage5: в любой момент, требуемый для запуска контейнера с локальной установкой, запустите его с ранее сохраненным изображением. Пример: docker run -d -t pack/bsp:toolchained

Ответ 9

блестящий ответ здесь. Как продолжить докер, который выходит из пользовательских килограммов

docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)

docker exec -it <container-id> /bin/bash

Эта вторая линия имеет решающее значение. Таким образом, exec используется вместо запуска, а не на изображении, а на контейнере. И вы делаете это после запуска контейнера.

Ответ 10

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

  • Повторный перезапуск
  • Частичная ошибка