2016-11-08 5 views
5

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

Я думаю, что я понимаю идею создания контейнера (через docker create) и создания созданного контейнера (через docker start). Я также понимаю менее ясно, но все же несколько, что docker run используется для одновременного создания и запуска контейнера. Поправьте меня, если я ошибаюсь.

Если я что-то пропустил, если я хочу запустить контейнер, чтобы он был отсоединен, мой единственный вариант - docker run -d.

Что я не понимаю: предположим, что я уже создал свой контейнер, и он остановлен, и теперь я хочу начать его отсоединение. Как мне это сделать? Или это неправильный способ думать об этом?

Я столкнулся с этим концептуальным непониманием (я уверен, что это то, что это), пытаясь запустить контейнер дважды, используя следующую команду:
docker -d --name=fred my/image

Второй раз, когда я получил:

docker: Ошибка ответа от демона: конфликт. Название «/ image» уже используется контейнером [...]

Fine; Теперь я понимаю, что это пытается создать два контейнера с тем же именем, которые совершенно не могут произойти. Но это привело меня к этому концептуальному вопросу: если у меня есть контейнер, который, скажем, остановился, как я могу запустить его в отключенном режиме?

Я же сказал, что я новичок. Спасибо за любую информацию.

ответ

4

Если вы специально не присоединять (-a или -i опции), при запуске контейнера, по определению вы dettached.

Создание контейнера просто создает уровень файловой системы. При запуске запускается процесс ENTRYPOINT (или CMD). Запуск выполняет как создание, так и начало, как вы догадались. Таким образом, вы не можете «прикрепить» к созданному контейнеру ... нет процесса для присоединения.

Здесь я создаю контейнер (опять же, все это делает создание уровня файловой системы):

[[email protected] ~]$ docker create --name=test centos:latest /bin/sh -c "while true; do echo hello world; sleep 1; done" 

посмотреть?

[email protected] ~]$ docker ps -a 
CONTAINER ID  IMAGE     COMMAND     CREATED    STATUS      PORTS    NAMES 
9d5bf75a8077  centos:latest   "/bin/sh -c 'while tr" 15 seconds ago  Created          test 

Это еще ничего не делает. Теперь запустите его без подключения, ничего не печатается на терминале STDOUT, потому что я не подключен. Но STDOUT отправляется в лог-драйвер (json-файл)

[[email protected] ~]$ docker start test test 
[[email protected] ~]$ docker logs test 
hello world 
hello world 
hello world 
hello world 
+1

Ничего себе, извините, мое форматирование ужасно. –

+1

Джеймс, на данный момент отформатированный ваш ответ. Вы можете получить справочную ссылку, отвечая на вопрос, который вы можете начать использовать в будущем. :) – Rao

+0

Спасибо Рао, я посмотрел на помощь и попытался использовать обратные шаги. Я также попробовал , но не отправил его, потому что он не выглядел правильно в «предварительном просмотре». Просто чтобы я начал ... какую демаркацию вы использовали на моем блоке? –

0

Вот как это работает.

Запуск докер контейнер busybox, крошечное линукс изображение в отдельном режиме и имени контейнера является testso

bash $ docker run -itd --name testso busybox 
b60d0847bb81065d5f5d4b3a3acff3102d03e7a8a084c0770da4487427787479 

Вы можете увидеть контейнер работает

bash $ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
b60d0847bb81  busybox    "sh"    7 seconds ago  Up 2 seconds       testso 

Теперь останавливая выше контейнер testso и проверьте, не запущен ли контейнер.

bash $ docker stop testso 
testso 
bash $ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 

Теперь ваш вопрос, адресованный, начав ранее остановленном контейнер testso и увидеть контейнер работает в фоновом режиме.

bash $ docker start testso 
testso 
bash $ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
b60d0847bb81  busybox    "sh"    46 seconds ago  Up 2 seconds       testso 

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

Надеюсь, это полезно.

UPDATE: Что касается запуска во второй раз, как вы правильно указали есть два варианта, и из него:

  1. Вместо запустить его с помощью команды docker run --name=mycontainer image, вы можете просто запустить существующий контейнер, который вам просто попытка и выше ответ помогает.
  2. Уничтожьте существующий контейнер и снова запустите docker run --name=mycontainer image.
    протереть вам существующий контейнер, используйте команду - docker rm -f mycontainer
+0

Laird, не могли бы вы проверить, помогает ли приведенный выше ответ лучше понять? И разрешает ли она вашу проблему? – Rao

Смежные вопросы