DockerImage - aleksei-khitev/knowledge_base GitHub Wiki
-
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
создается вручную - это не какой то самый свежий образ
docker image tag helloworld:1 helloworld:latest
Курс Docker for Java Developers
-
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
используется для установки приложений и выполнения подготовительных скриптов
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
конфигурирует испольнителя конейнера.
МОжет быть переопределен в CLI
по умолчанию, /bin/sh -c
Курс Docker for Java Developers
Сетевой порт, которомый будет слушать контейнер
EXPOSE 9990
Курс Docker for Java Developers
Монтирует файловый ресурс
Курс Docker for Java Developers
имя пользователя или UID, который должен быть использован, когда работает образ
Курс Docker for Java Developers
мониторинг внутри контейнера
HEALTHCHECK --interval=5s --timeout=3s CDM curl --fail http://localhost:8091/pools || exit 1