Несмотря на интерактивное руководство Докера и часто задаваемые вопросы, я теряю свои данные при выходе из контейнера.
Я установил Docker, как описано здесь: http://docs.docker.io/en/latest/installation/ubuntulinux без каких-либо проблем в Ubuntu 13.04.
Но он теряет все данные при выходе.
iman@test:~$ 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
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping
iman@test:~$ 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) ...
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory
Я также проверил это с интерактивными сессиями с тем же результатом. Я что-то забыл?
РЕДАКТИРОВАТЬ: ВАЖНО ДЛЯ НОВЫХ ПОЛЬЗОВАТЕЛЕЙ DOCKER
Как @ Магомет-Noureldin и другие говорили, на самом деле это НЕ контейнер выхода . Каждый раз он просто создает новый контейнер.
Docker
. Я бы предложил сохранить название и исходный вопрос, поскольку новички обязательно будут искать что-то подобное. Но почему бы вам не добавить что-то, описывающее ваши заблуждения во время написания поста? Это поможет прояснить ситуацию. Это наша культура здесь, в СО ... не так ли? :-)Ответы:
Вам необходимо зафиксировать изменения, которые вы делаете в контейнере, а затем запустить его. Попробуй это:
Затем получите идентификатор контейнера с помощью этой команды:
Передать изменения в контейнер:
Затем запустите контейнер:
Это должно работать.
источник
<none>
. Как мне добавить коммит поверх существующего изображения?Когда вы используете
docker run
для запуска контейнера, он фактически создает новый контейнер на основе изображения, которое вы указали.Помимо других полезных ответов здесь, обратите внимание, что вы можете перезапустить существующий контейнер после его выхода, и ваши изменения все еще там.
источник
docker ps
показывает только запущенные Docker-контейнеры.docker ps -a
показывает вам также те, которые вышли - и что вы можете продолжать работать. Фиксация необходима только после каждого запуска, если вы хотите сделать снимок для будущего использования, в противном случае сам контейнер останется для вас, чтобы вы продолжали использовать.jenkins
докер сервера и запускаю его на своем хосте ci, и он выполняет некоторые задания, которые у меня есть, и в результате сервер jenkins записывает на диск некоторые журналы. теперь, если мой сервер (на котором размещен мой докер) перезапущен, и я снова запускаю мой докер jenkins, значит ли это, что я потерял все файлы журнала? если это так, как я могу использоватьjenkins
Docker, например, чтобы облегчить мою установку Jenkins на CI?docker cp $(docker ps -alq):/path/to/file .
docker run -it --name my_debian debian
и послеdocker start my_debian && docker attach my_debian
)Существуют следующие способы сохранения данных контейнера:
Объемы докеров
Docker commit
а) создать контейнер из образа Ubuntu и запустить терминал Bash.
б) Внутри терминала установите скручиваемость
в) Выход из контейнерного терминала
d) Запишите идентификатор вашего контейнера, выполнив следующую команду:
д) сохранить контейнер как новое изображение
е) убедитесь, что вы можете видеть свой новый образ с установленным curl.
источник
exit
раньшеdocker commit
? Спасибо.docker run
командой запуска Баш в контейнере и вы остаетесь там из - за-i
и-t
опций (интерактивные с TTY). Однако Docker запускается на вашей машине вне контейнера, поэтому после внесения необходимых изменений в контейнер изнутри, чтобы вернуться к оболочке вашей системы, вы должныexit
(или Ctrl + D) оболочку контейнера. Также обратите внимание на#
и$
в ответе, которые указывают различные оболочки, в которые записаны команды.docker stop
последующимdocker start
.В дополнение к ответу Unferth рекомендуется создать Dockerfile .
В пустом каталоге создайте файл с именем «Dockerfile» со следующим содержимым.
Создайте изображение, используя Dockerfile . Давайте использовать тег, чтобы нам не нужно было запоминать шестнадцатеричный номер изображения.
А затем запустите изображение в контейнере.
источник
У меня есть гораздо более простой ответ на ваш вопрос, выполните следующие две команды
Приведенная выше команда ps -a возвращает список всех контейнеров. Возьмите имя контейнера, который ссылается на имя изображения - 'Ubuntu'. Например
'lightlyxuyzx'
, docker auto генерирует имена для контейнеров - это если вы не используете опцию --name.Опции -t и -d важны, созданный контейнер отсоединяется и может быть присоединен, как указано ниже, с опцией -t.
С опцией --name, вы можете назвать свой контейнер в моем случае «mycontainername».
и эта команда поможет вам войти в контейнер с помощью оболочки bash. С этого момента любые изменения, сделанные вами в контейнере, автоматически сохраняются Docker. Например -
apt-get install curl
внутри контейнера Вы можете выйти из контейнера без проблем, Docker автоматически сохраняет изменения.При следующем использовании все, что вам нужно сделать, это запускать эти две команды каждый раз, когда вы хотите работать с этим контейнером.
Эта команда ниже запустит остановленный контейнер:
Другой пример с портами и общим пространством приведен ниже:
В моем случае: 7efe2989e877 - это imageid предыдущего запущенного контейнера, который я получил с помощью
источник
--name
опцию и перед именем изображения, например:docker run --name mycontainername -t -d ubuntu /bin/bash
Возможно, вы захотите посмотреть тома докера, если хотите сохранить данные в вашем контейнере. Посетите https://docs.docker.com/engine/tutorials/dockervolumes/ . Докерская документация - очень хорошее место для начала
источник
Мое предложение состоит в том, чтобы управлять докером с помощью docker compose. Это простой способ управления всеми контейнерами докера для вашего проекта, вы можете отобразить версии и связать различные контейнеры для совместной работы.
Документы очень просты для понимания, лучше, чем документы докеров.
Докер-составить документы
Лучший
источник
Выше приведены отличные ответы на заданный вопрос. Возможно, нет необходимости в другом ответе, но все же я хочу высказать свое личное мнение по этой теме в самых простых словах.
Вот несколько пунктов о контейнерах и изображениях, которые помогут нам сделать вывод:
Вывод :
Как мы видим, Docker-контейнер не зависит от Docker-образа.
Контейнер может быть перезапущен при условии уникального идентификатора этого контейнера [использовать
docker ps --all
для получения идентификатора] .Любая операция, например создание нового каталога, создание файлов, установка инструментов и т. Д., Может выполняться внутри контейнера, когда он работает. Как только контейнер остановлен, он сохраняет все изменения. Остановка и перезапуск контейнера - это как перезагрузка компьютерной системы.
Уже созданный контейнер всегда доступен для перезапуска, но когда мы выдаем
docker run
команду, из образа создается новый контейнер, и, следовательно, он похож на новую компьютерную систему. Изменения, сделанные в старом контейнере - как мы теперь можем понять - недоступны в этом новом контейнере.Последнее замечание :
Полагаю, теперь очевидно, почему данные кажутся потерянными, но они всегда там, но в другом [старом] контейнере. Итак, обратите внимание на разницу в
docker start
&docker run
command и никогда не запутайтесь в них.источник
подобная проблема (и ни один способ, которым только Dockerfile не мог это исправить) привел меня к этой странице.
Этап 0: для всех, надеясь, что Dockerfile сможет это исправить: пока --dns и --dns-search не появятся в поддержке Dockerfile - нет способа интегрировать ресурсы на основе интрасети в.
Этап 1: после построения образа с помощью Dockerfile (кстати, это серьезный сбой, Dockerfile должен быть в текущей папке), имея образ для развертывания на основе интрасети, запустив скрипт запуска docker. пример:
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 в режиме демона, обеспечивающем локальные записи DNS для возможности загрузки и развертывания локальных компонентов.
важный момент: запуск сценария должен заканчиваться чем-то вроде
/usr/bin/sudo -u ${USERNAME} bash --norc
сохранения контейнера работоспособным даже после завершения сценариев установки.нет , невозможно полностью запустить контейнер в интерактивном режиме, поскольку он останется внутри внутренней командной строки до нажатия CTRL-p CTRL-q .
нет , если взаимодействующий bash не будет выполнен в конце сценария установки, контейнер завершит работу сразу после завершения выполнения сценария, потеряв все результаты установки.
этап 3: контейнер все еще работает в фоновом режиме, но неясно, закончил ли контейнер процедуру установки или нет. используя следующий блок для определения завершения процедуры выполнения:
while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done
сценарий будет продолжен только после завершения установки. и это подходящий момент для вызова: commit , предоставляющий текущий идентификатор контейнера, а также имя целевого образа (оно может быть таким же, как в процедуре сборки / запуска , но дополнено тегом локальных целей установки. пример:.docker commit containerID pack/bsp:toolchained
см. эту ссылку на как получить правильный containerIDЭтап 4: контейнер был обновлен локальными установками, а также зафиксирован во вновь назначенном образе (тот, у которого добавлен тег целей). теперь безопасно остановить работу контейнера. пример:
docker stop packbsp-cont
stage5: в любой момент, когда требуется запустить контейнер с локальной установкой, запустите его с ранее сохраненным образом. пример:
docker run -d -t pack/bsp:toolchained
источник
блестящий ответ здесь Как продолжить докер который выходит из пользователя kgs
Эта вторая линия имеет решающее значение. Таким образом, exec используется вместо run, и не на изображении, а на containerid. И вы делаете это после того, как контейнер был запущен.
источник
Ни один из ответов не касается смысла этого выбора дизайна. Я думаю, что докер работает таким образом, чтобы предотвратить эти 2 ошибки:
источник