LINUX.ORG.RU
ФорумAdmin

Вопросы по Docker

 


1

1

В ходе ознакомления у меня возникли вопросы
1) в чем разница между ADD и COPY?
2) Можно ли создать контейнер не на базе Linux, а на базе Windows, или скажем BSD?
3) После создания контейнера он становится readonly?
4) Вытекающий вопрос - как тогда задать passwd root или $(username), если вся система readonly?
Пробовал (ничего из этого не работает)

$ /usr/bin/passwd root <<EOF
test
test
EOF
echo "USERNAME:NEWPASSWORD" | chpasswd
adduser user 
echo "password" |passwd user --stdin

5) Как законнектиться по SSH? Требует пароль, но пароль я не могу задать. Коннект не удается.
6) с CMD и ENTRYPOINT разобрался - вроде бы они занимаются одним и тем же, если в Dockerfile присутствуют обе эти инструкции, то в некоторых случаях они могут «перезаписывать» один другого
7) В каких директориях хранятся образы docker'a? (На Windows и Linux)
Пока на этом все.

★★★★★

Последнее исправление: w1nner (всего исправлений: 3)

2) Можно ли создать контейнер не на базе Linux, а на базе Windows, или скажем BSD?

Нет, т.к. это не виртуализация, а контейнеризация.

3) После создания контейнера он становится readonly?

Нет, контейнер можно менять и даже на выбор коммитить или откатывать изменения. Но это неправильное использование Docker, если нужно менять содержимое контейнера, то лучше сразу взять LXC.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Для того чтобы поменять содержимое, нужно изменять Dockerfile и заново собирать образ, правильно?

w1nner ★★★★★
() автор топика
Ответ на: комментарий от w1nner

Если ты хочешь переиспользовать результат в нескольких контейнерах, да. Локально в контейнер можно залезть и делать с ним что угодно до его остановки.

staseg ★★★★★
()
Ответ на: комментарий от w1nner

Для того чтобы поменять содержимое, нужно изменять Dockerfile и заново собирать образ, правильно?

$ docker run -it ubuntu bash
...
root@01e475b3e3a2:/# echo 123 > /abc
root@01e475b3e3a2:/# cat /abc
123
root@01e475b3e3a2:/# exit
$ docker stop 01e475b3e3a2
01e475b3e3a2
docker start 01e475b3e3a2
01e475b3e3a2
$ docker exec -it 01e475b3e3a2 bash
root@01e475b3e3a2:/# cat /abc
123



Но если грохнуть контейнер 01e475b3e3a2, то изменения пропадут. Чтобы этого не было, их можно сохранить в образ (image) по docker push. Тогда новые контейнеры будут запускаться с теми же изменениями.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

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

Shtsh ★★★★
()

Как законнектиться по SSH? Требует пароль, но пароль я не могу задать. Коннект не удается

Зачем? Что ты хочешь сделать? Обычно достаточно сделать docker exec -ti container_hash bash

Shtsh ★★★★
()

Add and copy вроде синонимы, уточняй в документации. Если ты хочешь ash, это звоночек, что ты пытаешься не того от докера.

staseg ★★★★★
()

в чем разница между ADD и COPY

ADD распакует архив, так же может быть URL - в этом случае файл скачается.

Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

Или можно подключать общие директории как volumes

ИМХО, это самый кошерный способ для изменяемых данных. Многие рекомендуют volume-контейнеры, но я не доверяю такому подходу. Очень уж легко грохнуть :)

KRoN73 ★★★★★
()

с CMD и ENTRYPOINT разобрался

Не разобрался. Если есть и то, и другое - CMD добавится аргументом к ENTRYPOINT

Shtsh ★★★★
()
Ответ на: комментарий от leave

Ну, например, чтобы архив закинуть без распаковки. Выглядит так, что добавлено на всякий случай :)

Shtsh ★★★★
()
Ответ на: комментарий от KRoN73

А потом мы начинаем шарить вольюмы между серверами через нфс и в один прекрасный день у нас весь кластер превращается в тыкву :)

Кстати, ты случайно не гонял вольюмы через iscsi?

leave ★★★★★
()
Ответ на: комментарий от KRoN73

хм, тогда видимо я что-то не так делаю

w1nner ★★★★★
() автор топика
Ответ на: комментарий от leave

Кстати, ты случайно не гонял вольюмы через iscsi?

Нет, только через каталоги в обычных ФС :)

KRoN73 ★★★★★
()
Ответ на: комментарий от leave

А потом мы начинаем шарить вольюмы между серверами через нфс

Вообще, на мой взгляд, в идеальном мире все контейнеры должны быть stateless.

Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

качает и распаковывает - и только? какой смысл тогда иметь две инструкции?

w1nner ★★★★★
() автор топика
Ответ на: комментарий от w1nner

Что значит грохнуть? docker stop?

docker rm

Или запуск с ключиком --rm — в этом случае контейнер удалится после выхода сам. ИМХО, самая верная практика при ручной работе с Docker, без docker-compose :)

хм, тогда видимо я что-то не так делаю

Тут важно понять сразу разницу между image и container.

image — это базовый образ контейнера. container — отдельный виртуальный комп, созданный из image. Изменения в контейнере живут до тех пор, пока он не будет удалён. И касаются они только этого контейнера, но не других контейнеров с того же образа. Образ, в общем, лучше считать неизменяемым. Но изменения контейнера можно сохранить в образе. Тогда все новые контейнеры, созданные с этого образа, будут видеть произведённые изменения.

...

Кстати, хинт, который упускаю многие новички. docker ps показывает только запущенные контейнеры. Но в системе могут быть остановленные, но не удалённые контейнеры. Смотри их по docker ps -a :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS                                      NAMES
45d773d31718        mralex/server:0.1   "rm bash"                About a minute ago   Exited (1) About a minute ago                                              brave_franklin
e1932e317b98        mralex/server:0.1   "rm /var/lib/apt/l..."   2 minutes ago        Exited (1) 2 minutes ago                                                   suspicious_williams
21d0a25a53c9        mralex/server:0.1   "apt-get update"         2 minutes ago        Exited (100) 2 minutes ago                                                 sad_goldstine
c13d8786815d        mralex/server:0.1   "/usr/bin/supervisord"   3 minutes ago        Exited (1) 3 minutes ago                                                   sad_yonath
2ef6a3f845b9        ubuntu              "bash"                   17 minutes ago       Up 15 minutes                                                              trusting_jones
31e557a7cb0b        mralex/server:0.1   "/usr/bin/supervisord"   20 minutes ago       Created                                                                    wizardly_tesla
0355b45614a6        9a5b66f399f2        "/usr/bin/supervisord"   32 minutes ago       Created                                                                    relaxed_euler
0502d2824a7f        b8df87745ca6        "/bin/sh -c 'echo ..."   33 minutes ago       Exited (127) 33 minutes ago                                                condescending_bhaskara
b8b282690f0d        b8df87745ca6        "/bin/sh -c 'echo ..."   36 minutes ago       Exited (127) 36 minutes ago                                                adoring_brahmagupta
622a9b64f445        b8df87745ca6        "/bin/sh -c 'echo ..."   37 minutes ago       Exited (127) 37 minutes ago                                                compassionate_torvalds
8cb09becbbf0        b8df87745ca6        "/bin/sh -c 'echo ..."   38 minutes ago       Exited (2) 38 minutes ago                                                  angry_jones
288c28cff7e1        015fc8e4acdc        "/usr/bin/supervisord"   About an hour ago    Created                                                                    laughing_cori
5dc52a470990        5383e0fbd795        "/bin/sh -c 'addus..."   2 hours ago          Exited (10) 2 hours ago                                                    fervent_booth
996dbede6e83        5383e0fbd795        "/bin/sh -c 'addus..."   2 hours ago          Exited (10) 2 hours ago                                                    determined_wilson
6d871b43e2c6        5383e0fbd795        "/bin/sh -c 'addus..."   2 hours ago          Exited (6) 2 hours ago                                                     kind_curie
32035a8b3b8a        9b75c4835d79        "bin/bash"               2 hours ago          Exited (130) 2 hours ago                                                   unruffled_stallman
340e685ed6a8        f7ba29a439c5        "bin/bash"               2 hours ago          Exited (127) 2 hours ago                                                   brave_booth
6d15a0a3e517        f7ba29a439c5        "bin/bash"               2 hours ago          Up 2 hours                      22/tcp, 80/tcp                             thirsty_poitras
32fe648922d3        f7ba29a439c5        "/usr/bin/supervisord"   2 hours ago          Up 2 hours                      22/tcp, 80/tcp                             gracious_beaver
e8890c86b3e8        65854b91e52e        "/usr/bin/supervisord"   2 hours ago          Up 2 hours                      0.0.0.0:22->22/tcp, 0.0.0.0:8080->80/tcp   lucid_roentgen
8b1da4dfa4c5        65854b91e52e        "/usr/bin/supervisord"   2 hours ago          Exited (0) 2 hours ago                                                     zealous_lumiere
04197ab05ac4        hello-world         "/hello"                 4 hours ago          Exited (0) 4 hours ago                                                     blissful_mcclintock
4120933de73c        ubuntu              "bash"                   2 days ago           Exited (0) 2 days ago                                                      optimistic_austin
b1d6738edff0        ubuntu              "fish"                   2 days ago           Created                                                                    quizzical_goldwasser
063c8e13b4cb        ubuntu              "uname -a"               2 days ago           Exited (0) 2 days ago                                                      distracted_stonebraker
af2153cddaa6        ubuntu              "busybox ifconfig"       2 days ago           Created                                                                    gallant_elion
f166000567df        ubuntu              "ifconfig"               2 days ago           Created                                                                    friendly_shannon
29d8c51af1e4        ubuntu              "ps"                     2 days ago           Exited (0) 2 days ago                                                      condescending_carson
a34a561acea4        ubuntu              "htop"                   2 days ago           Created                                                                    sharp_einstein
a748202dcb0c        ubuntu              "bash"                   2 days ago           Exited (0) 2 days ago                                                      quizzical_lumiere
cf19a537c966        hello-world         "/hello"                 2 days ago           Exited (0) 2 days ago                                                      kickass_snyder
4cf561ddae57        hello-world         "/hello"                 2 days ago           Exited (0) 2 days ago                                                      gifted_euclid
w1nner ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

image — это базовый образ контейнера. container — отдельный виртуальный комп, созданный из image

Зря ты сказал слово «виртуальный» :)

Теперь для ТС:

Вообще реализовано это так: очень важная концепция докера - «слои». Например, когда ты создаёшь свой образ (то есть делаешь свой Dockerfile) - берутся все слои образа, указанного в FROM. Затем твои операции (например, ADD или RUN) превращаются в дополнительные слои, поверх слоёв исходного образа. Поэтому, если ты удалишь что-то из исходных образов при помощи rm, то размер будет только больше. На практике, понятие image - набор read-only слоёв данных.

Когда ты запускаешь контейнер, то берётся image, затем к нему добавляется один rw слой. В результате - контейнер rw, а образ - всегода ro.

Shtsh ★★★★
()
Последнее исправление: Shtsh (всего исправлений: 1)
Ответ на: комментарий от Shtsh

виртуальный

Да понял я уже, кусок линукса (наверное берется server-версия любого дистрибутива) для запуска определенных программ (например веб-сервер). Эдакий wine как в Linux для exe, но в контейнере.

w1nner ★★★★★
() автор топика
Последнее исправление: w1nner (всего исправлений: 1)
Ответ на: комментарий от Shtsh

Вообще реализовано это так: очень важная концепция докера - «слои»

ИМХО, это уже другой уровень понимания. Пока проще считать, что это просто магия :)

KRoN73 ★★★★★
()
Ответ на: комментарий от w1nner

я вообще не понял, что ты написал.

Контейнеризация в linux по сути работает очень просто:

Берутся процессы, помещаются в отдельный process namespace, затем при помощи cgroup ограничиваются ресурсы для них. Сетевое взаимодействие помещается в отдельный network namespace. Затем capabilities пользователя режутся по максимуму.

В результате по факту процесс работает в операционной системе как обычно и нету особого оверхеда. Но процесс просто не видит и не имеет доступа к процессам хостовой ОС, поэтому это выглядит как отдельный хост.

Shtsh ★★★★
()
Ответ на: комментарий от KRoN73

Возможно ты пров, у меня плохо с объснением вещей - поэтому мог наговорить лишнего, что ещё усилит кашу в голове. Но я старался рассказать просто.

Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

помещаются в отдельный process namespace, затем при помощи cgroup ограничиваются ресурсы для них

ИМХО, проще сказать, что это такой хитрый продвинутый chroot :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Shtsh

если ты удалишь что-то из исходных образов при помощи rm, то размер будет только больше.

поэтому например установка пакета в контейнер делается не так:

RUN apt-get update    # первый слой
RUN apt-get install package # второй
RUN apt-get clean           # третий

а в один слой:

RUN apt-get update && apt-get install package && apt-get clean

Правда в последних версиях должен был появиться какой-то аналог squash для слоев

alpha ★★★★★
()
Ответ на: комментарий от w1nner

во-во, а чем собственно разница-то?

cgroup, в отличие от chroot, даёт разделение с хостом на уровне pid, пользователей, сетевых и дисковых интерфейсов и т.п. Т.е. фактически контейнер становится условно независимым виртуальным компом.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

докер не все namespaces использует, поэтому это очень сильно условно

Например, поддержка user namespace появилась только с 1.10 и то выключена по умолчанию. Поэтому root контейнера создаёт на примонтированном в контейнер диске файлы с правами хостового root.

alpha ★★★★★
()
Ответ на: комментарий от KRoN73

Всё верно, только одна поправка - видимостью управляют namespaces, cgroup больше для ограничения ресурсов.

Shtsh ★★★★
()
Последнее исправление: Shtsh (всего исправлений: 1)

Как удалить контейнеры?

C:\Program Files\Docker\Docker\images>docker ps -a -q
fff4d986b8e7
45d773d31718
e1932e317b98
21d0a25a53c9
c13d8786815d
2ef6a3f845b9
31e557a7cb0b
0355b45614a6
0502d2824a7f
b8b282690f0d
622a9b64f445
8cb09becbbf0
288c28cff7e1
5dc52a470990
996dbede6e83
6d871b43e2c6
32035a8b3b8a
340e685ed6a8
6d15a0a3e517
32fe648922d3
e8890c86b3e8
8b1da4dfa4c5
04197ab05ac4
4120933de73c
b1d6738edff0
063c8e13b4cb
af2153cddaa6
f166000567df
29d8c51af1e4
a34a561acea4
a748202dcb0c
cf19a537c966
4cf561ddae57
C:\Program Files\Docker\Docker\images>docker rm fff4d986b8e7
Error response from daemon: No such container: fff4d986b8e7
w1nner ★★★★★
() автор топика
Ответ на: комментарий от Shtsh

Статика, например. Ну и ситуация, когда разработка не хочет/не может писать логи по сети.

leave ★★★★★
()
Ответ на: комментарий от v9lij

да, какой-то баг, сейчас все удалил

w1nner ★★★★★
() автор топика

я пытаюсь запустить в докере некое томкат приложение.
пишу в dockerfile:

FROM docker.io/tomcat <-- я сделал docker pull tomcat

ADD ./apache-tomcat-8.5.11 /opt/ <-- это я копирую весь свой томкат  в контейнер
EXPOSE 443 <-- приложение запуститься на 443. потом достучусь через -P
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/catalina.sh  <-- это все должно быть c execute
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/setclasspath.sh
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/shutdown.sh
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/startup.sh
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/version.sh
Я одного не понимаю, теперь для запуска самого томката мне надо прописать
RUN /bin/bash /opt/apache-tomcat-8.5.11/bin/startup.sh ?
leave KRoN73

dada ★★★★★
()
Последнее исправление: dada (всего исправлений: 1)
Ответ на: комментарий от dada

dockerfile описывает образ, слепок файловой системы, он статичен

это как rpm-спек, по которому создается rpm-файл.

Запуск приложения происходит при запуске контейнера на базе этого образа.

Для того чтобы указать, что надо запускать при старте, используются инструкции ENTRYPOINT и CMD - это как init-скрипт внутри rpm-пакета.

Команда «docker run local/my-image» берет снапшот файловой системы local/my-image, достает из его метаданных ENTRYPOINT и CMD параметры и запускает то, что в них написано.

alpha ★★★★★
()
Последнее исправление: alpha (всего исправлений: 1)
Ответ на: комментарий от dada

опять же неэкономно создавать слой на каждую мелочь

вот так на четыре слоя меньше

FROM docker.io/tomcat <-- я сделал docker pull tomcat
ADD ./apache-tomcat-8.5.11 /opt/ <-- это я копирую весь свой томкат  в контейнер
EXPOSE 443 <-- приложение запуститься на 443. потом достучусь через -P
RUN chmod +x /opt/apache-tomcat-8.5.11/bin/catalina.sh \
    chmod +x /opt/apache-tomcat-8.5.11/bin/setclasspath.sh \
    chmod +x /opt/apache-tomcat-8.5.11/bin/shutdown.sh \
    chmod +x /opt/apache-tomcat-8.5.11/bin/startup.sh \
    chmod +x /opt/apache-tomcat-8.5.11/bin/version.sh
ENTRYPOINT /bin/bash
CMD /opt/apache-tomcat-8.5.11/bin/startup.sh

Но вообще tomcat - это не контейнерное приложение, у него слишком много оберток, он сам по себе многослойный контейнер и надо на более современные легкие варианты переходить

alpha ★★★★★
()
Ответ на: комментарий от alpha
[root@test4 docker]# docker build -t alikhantara -f ./tomcat_docker.file .
Sending build context to Docker daemon 52.86 MB
Step 1 : FROM docker.io/tomcat
 ---> 40ab38c1ce33
Step 2 : ADD ./apache-tomcat-8.5.11 /opt/
 ---> Using cache
 ---> 06c553f6a493
Step 3 : EXPOSE 443
 ---> Using cache
 ---> c64e68dbfff9
Step 4 : RUN chmod +x /opt/apache-tomcat-8.5.11/bin/catalina.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/shutdown.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/startup.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/version.sh
 ---> Running in 2b48cb11ebe8
chmod: cannot access ‘/opt/apache-tomcat-8.5.11/bin/catalina.sh’: No such file or directory
chmod: cannot access ‘chmod’: No such file or directory
chmod: cannot access ‘+x’: No such file or directory
chmod: cannot access ‘/opt/apache-tomcat-8.5.11/bin/shutdown.sh’: No such file or directory
chmod: cannot access ‘chmod’: No such file or directory
chmod: cannot access ‘+x’: No such file or directory
chmod: cannot access ‘/opt/apache-tomcat-8.5.11/bin/startup.sh’: No such file or directory
chmod: cannot access ‘chmod’: No such file or directory
chmod: cannot access ‘+x’: No such file or directory
chmod: cannot access ‘/opt/apache-tomcat-8.5.11/bin/version.sh’: No such file or directory
The command '/bin/sh -c chmod +x /opt/apache-tomcat-8.5.11/bin/catalina.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/shutdown.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/startup.sh     chmod +x /opt/apache-tomcat-8.5.11/bin/version.sh' returned a non-zero code: 1

dada ★★★★★
()
Ответ на: комментарий от dada

в принципе да, но есть разница в поведении при запуске с параметрами

CMD-параметры переписываются с командной строки, а ENTRYPOINT это такой более глобальный параметр который редко меняется.

Поэтому имхо лучше выносить в него /bin/bash или /usr/bin/java

alpha ★★★★★
()
Ответ на: комментарий от alpha

ok.
а что не так с путями ? в контейнере как-то по другому их надо указывать?

dada ★★★★★
()
Ответ на: комментарий от dada

а что-то я вообще странно написала, вот так же надо

RUN chmod +x \
    /opt/apache-tomcat-8.5.11/bin/catalina.sh \
    /opt/apache-tomcat-8.5.11/bin/setclasspath.sh \
    /opt/apache-tomcat-8.5.11/bin/shutdown.sh \
    /opt/apache-tomcat-8.5.11/bin/startup.sh \
    /opt/apache-tomcat-8.5.11/bin/version.sh

а /opt/apache-tomcat-8.5.11/bin/catalina.sh у тебя нет потому что ADD положил его в /opt/bin/catalina.sh скорее всего

вероятно нужно

ADD ./apache-tomcat-8.5.11 /opt/apache-tomcat-8.5.11

надо в доках детали глянуть

alpha ★★★★★
()
Ответ на: комментарий от alpha

я разобрался.
у моего image был в /etc/profile был путь к старому томкату.
поправил, все запустилось.
спасибо!

dada ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.