DockerImage - aleksei-khitev/knowledge_base GitHub Wiki

Образ Docker

Простейший образ и его сборка

  • FROM - базовый образ
  • CMD - просто команда, которую нужно выполнить в контейнере. Контейнер выполняет только одну такую команду.
helloimage$ cat Dockerfile 
FROM ubuntu

CMD echo "Hello World"

Курс Docker for Java Developers

Сборка образа

helloimage$ sudo docker image build -t helloworld .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu
latest: Pulling from library/ubuntu
c549ccf8d472: Pull complete 
Digest: sha256:aba80b77e27148d99c034a987e7da3a287ed455390352663418c0f2ed40417fe
Status: Downloaded newer image for ubuntu:latest
 ---> 9873176a8ff5
Step 2/2 : CMD echo "Hello World"
 ---> Running in d4a7cddbddba
Removing intermediate container d4a7cddbddba
 ---> 6536f319ac1c
Successfully built 6536f319ac1c
Successfully tagged helloworld:latest

Точка в конце задает контекст (включая расположение Dockerfile). Если что то в папке нужно игнорировать, для этого нужно использовать ignore-файл. Аттрбиут -t задает тег
В справке docker image --help можно найти много интересного, вклюая упаковку образа в tar-архив
Курс Docker for Java Developers

Список образов

helloimage$ sudo docker image ls
REPOSITORY       TAG          IMAGE ID       CREATED          SIZE
...
helloworld       latest       6536f319ac1c   48 seconds ago   72.7MB
jboss/wildfly    latest       a6ba50806be9   13 days ago      724MB
ubuntu           latest       9873176a8ff5   2 weeks ago      72.7M

Курс Docker for Java Developers

Просмотр истории образа (что было сделано)

helloimage$ sudo docker image history helloworld
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
6536f319ac1c   4 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
9873176a8ff5   2 weeks ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      2 weeks ago     /bin/sh -c #(nop) ADD file:920cf788d1ba88f76…   72.7MB

Курс Docker for Java Developers

Запуск образа

helloimage$ sudo docker container run helloworld
Hello World

Hello World в выводе - результат команды CMD
К примеру для образа с выводом версии джавы, аналогичный вывод будет такой

chapter2/helloworldjava$ cat Dockerfile
FROM openjdk

CMD java -version

chapter2/helloworldjava$ sudo docker image build -t hellojava .
[sudo] пароль для aleksei_khitev: 
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM openjdk
latest: Pulling from library/openjdk
9660ffb7976c: Pull complete 
e4f8b4ca74ea: Pull complete 
1d9cb8f68ad4: Pull complete 
Digest: sha256:e0e86bf6675712b0116831045fbb44bd6cc3ba5706b4377e0d5e884aebcfbd0b
Status: Downloaded newer image for openjdk:latest
 ---> f4f1dadedfab
Step 2/2 : CMD java -version
 ---> Running in 5eaad7b131df
Removing intermediate container 5eaad7b131df
 ---> eb258bb7b127
Successfully built eb258bb7b127
Successfully tagged hellojava:latest

chapter2/helloworldjava$ sudo docker container run hellojava
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-24)
OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

Курс Docker for Java Developers

Указание тега базового образа

chapter2/helloworldjava$ cat Dockerfile
FROM openjdk:jdk-alpine

CMD java -version

chapter2/helloworldjava$ sudo docker image build -t hellojava .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM openjdk:jdk-alpine
jdk-alpine: Pulling from library/openjdk
8e3ba11ec2a2: Pull complete 
311ad0da4533: Pull complete 
df312c74ce16: Pull complete 
Digest: sha256:1fd5a77d82536c88486e526da26ae79b6cd8a14006eb3da3a25eb8d2d682ccd6
Status: Downloaded newer image for openjdk:jdk-alpine
 ---> 5801f7d008e5
Step 2/2 : CMD java -version
 ---> Running in c107957c122f
Removing intermediate container c107957c122f
 ---> 86040375831a
Successfully built 86040375831a
Successfully tagged hellojava:latest

hapter2/helloworldjava$ sudo docker image ls
REPOSITORY       TAG          IMAGE ID       CREATED          SIZE
...
hellojava        latest       86040375831a   5 seconds ago    103MB
openjdk          latest       f4f1dadedfab   4 days ago       467MB
openjdk          8-jre-slim   73c63778326a   13 months ago    184MB
openjdk          jdk-alpine   5801f7d008e5   2 years ago      103MB

Можно заметить, что размер у jdk-alpine размер меньше, чем у latest
Можно также заметить, что размер hellojava не отличается от openjdk:jdk-alpine, так в образе ничего кроме команды
Курс Docker for Java Developers

Указание тега при сборке

chapter2/helloworldjava$ sudo docker image build -t hellojava:2 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM openjdk:jdk-alpine
 ---> 5801f7d008e5
Step 2/2 : CMD java -version
 ---> Using cache
 ---> 86040375831a
Successfully built 86040375831a
Successfully tagged hellojava:2

hapter2/helloworldjava$ sudo docker image ls
REPOSITORY       TAG          IMAGE ID       CREATED             SIZE
hellojava        2            86040375831a   38 minutes ago      103MB
hellojava        latest       86040375831a   38 minutes ago      103MB
...
chapter2/helloworldjava$ sudo docker container run hellojava:2
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (IcedTea 3.8.0) (Alpine 8.171.11-r0)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

Курс Docker for Java Developers

Несколько тегов и latest

Можно задать несколько тегов.
Тег latest создается вручную - это не какой то самый свежий образ

docker image tag helloworld:1 helloworld:latest

Курс Docker for Java Developers

Разница между COPY, ADD

  • COPY - копирует новые файлы или папки в файловую систему контейнера
  • ADD - равен COPY, но еще позволяет:
    • автораспаковку архивов .tar в образ (ADD app.tar.gz /opt/var/myapp произойдет автораспаковка)
    • загружать файлы через URL (но рекомендуется скачать файл и подключать уже загруженные копии)
image_copy_war$ cat Dockerfile 
FROM jboss/wildfly

COPY webapp.war /opt/jboss/wildfly/standalone/deployments/webapp.war

image_copy_war$ sudo docker image build -t deployed_war_image .
[sudo] пароль для aleksei_khitev: 
Sending build context to Docker daemon  9.216kB
Step 1/2 : FROM jboss/wildfly
 ---> a6ba50806be9
Step 2/2 : COPY webapp.war /opt/jboss/wildfly/standalone/deployments/webapp.war
 ---> f7bca6f23b92
Successfully built f7bca6f23b92
Successfully tagged deployed_war_image:latest

image_copy_war$ sudo docker history deployed_war_image
IMAGE          CREATED              CREATED BY                                      SIZE      COMMENT
f7bca6f23b92   About a minute ago   /bin/sh -c #(nop) COPY file:02d8975f04d7731e…   6.6kB     
a6ba50806be9   13 days ago          /bin/sh -c #(nop)  CMD ["/opt/jboss/wildfly/…   0B        
<missing>      13 days ago          /bin/sh -c #(nop)  EXPOSE 8080                  0B
...

image_copy_war$ sudo docker container run -d -p 8080:8080 deployed_war_image
74f4835418df331d0b0db022650e28bc83f2806666fd532b4df88d97fada5476

image_copy_war$ curl http://localhost:8080/webapp/resources/persons
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><collection><person><name>Penny</name></person><person><name>Leonard</name></person><person><name>Sheldon</name></person><person><name>Amy</name></person><person><name>Howard</name></person><person><name>Bernadette</name></person><person><name>Raj</name></person><person><name>Priya</name></person></collection>

CMD в Dockerfile-е не обязательно, потому что команда уже прописана в Dockerfile образа самого jboss/wildfly
Только одна CMD выполняется. Если в своем образе определить CMD, то он будет вызван при запуске, а CMD базового образа - нет.
Курс Docker for Java Developers

Разница между RUN, CMD

RUN используется для установки приложений и выполнения подготовительных скриптов

RUN apt update && apt install -y mc
RUN /opt/jboss/wildfly/bin/add-user.sh admin AdminPassword -silent

CMD - команда выполняющая контейнер. Может быть override-ина в CLI. Выполняется только последняя

CMD ["/opt/jboss/wildfly/bin/standalone.sh|, "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]

Курс Docker for Java Developers

ENTRYPOINT

конфигурирует испольнителя конейнера.
МОжет быть переопределен в CLI
по умолчанию, /bin/sh -c
Курс Docker for Java Developers

EXPOSE

Сетевой порт, которомый будет слушать контейнер

EXPOSE 9990

Курс Docker for Java Developers

VOLUME

Монтирует файловый ресурс
Курс Docker for Java Developers

USER

имя пользователя или UID, который должен быть использован, когда работает образ
Курс Docker for Java Developers

HEALTHCHECK

мониторинг внутри контейнера

HEALTHCHECK --interval=5s --timeout=3s CDM curl --fail http://localhost:8091/pools || exit 1

Курс Docker for Java Developers

Назад к docker

⚠️ **GitHub.com Fallback** ⚠️