Docker быстрый старт

Образ

Пояснения в оформлении кода:

(комментарий, пояснение в коде)
var_1 | var_2 - использовать var_1 или var_2
(abstract) - абстрактное название параметра

Образ — виртуальный, изолированный процессор. Можно привести аналогию с ВМ.

Загрузить образ:

$ docker run ubuntu:latest|version

Просмотр загруженных образов:

$ docker images
--------------------
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
test/appimage                                              latest              45e13e6dba75        7 minutes ago       88.9MB
v00rpm-dr.corp.tander.ru/dockerhub/phpdockerio-php73-fpm   latest              1f7a0deac497        6 days ago          151MB
v00rpm-dr.corp.tander.ru/dockerhub/node                    latest              760e12e87878        8 days ago          934MB
v00rpm-dr.corp.tander.ru/dockerhub/mysql                   8.0                 d435eee2caa5        11 days ago         456MB

Выполнить команду в образе:

$ docker run -it(interactive mode) ubuntu (id image) /bin/bash/(execute commands)
---------
## run shell with root 

Контейнер

Контейнер — экземпляр образа. Контейнер создается автоматически при запуске образа. Контейнер можно сохранить в образ.
Просмотр доступных контейнеров контейнеров:

Создать контейнер:

$ docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]

Просмотр лога контейнера

$ docker logs (name_container)

Просмотр команд выполненных в контейнере

$docker diff (name_container)

Получить полную информацию о контейнере (ip, ports, names and tc)
Создать контейнер:

$ docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]

Просмотр лога контейнера

$ docker logs (name_container)

Просмотр команд выполненных в контейнере

$docker inspect (name_container)
$ docker ps -a (а -просмотр всех контейнеров, без а - просмотр активных контейнеров)
-----------------------------------------
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
5050a5c05446        test/appimage       "/bin/bash"              21 minutes ago      Exited (0) 14 minutes ago                          priceless_hertz
e04f404191e2        94e814e2efa8        "/bin/bash"              31 minutes ago      Exited (0) 22 minutes ago                          eloquent_montalcini
.......

Задать имя контейнеру

$ docker run (image | id_image) --name (name container| id_container) -h (name host - opcional) (list commands)

Удалить контейнер

$ docker rm 
//remove all stoped containers
$ docker rm -v $(docker ps -aq -f status=exited)

Запустить контейнер

$docker start (name container | id_container)

Подключиться к рабочему контейнеру

$ docker attach (name container | id_container)

Сохранить контейнер в образ:

$ docker commit (name | id_container) (path_to_save_images (ex: test/appImage))

Связать два контейнера между собой

docker run --rm -it --link myredis:newredis redis /bin/bash
# -rm - автоматически удалить контейнеры после выхода
#--link - связать контейнеры myredis и newredis
# root@a1c4abf81f:/data# redis-cli -h redis -p 6379
# redis:6379> PING (get, set, put e.t.c)
# PONG


Dockerfile

Dockerfile – это обычный текстовый файл, содержащий набор операций, которые могут быть использованы для создания Docker-образа.
Создать docker образ на основе dokerfile:

(находясь в каталоге с dockerfile)
$docker build -t (path_to_save_images (ex: test/appImageFromDockerfile))

Публикация образа на dockerhub

$ docker push (name_local_repositories)/(name_image) - (Имя локального репозитория должно совпадать с именем удаленного репозитория)

Основные команды dockerfile

FROM (name|id image:vearsion) (- загрузка образа либо из локального репозитория, либо с docker hub)
RUN apt-get update && apt-get install python3 && (other bash commands) - (выплонить bash - команду)
ENTRYPOINT ["/path/to/bin/file | file.sh"] (выполняемый файл, который будет обрабатывать аргументы переданные в docker run [image] [args])
COPY file /path/to/copy  (копирует файл из файловой системы хоста в файловую систему образа, 1 arg - определяет файл хоста. 2 arg -целевой путь )

Лимит команд в Dockerfile 127 (для дефолтной файловой системы AUFS)

Связь с внешним миром

Для связи с контейнером по сетевым порта, используется аргумент -p или -P. Данный аргумент перенаправляет порты с хоста в контейнер.

docker run -d (в фоне) -p 8000:80 (перенаправить с 8000 порта хоста на 80 порт в контейнер) nginx

curl localhost:8000

При использовании аргумента -P, Docker должен выбрать свободный порт для перенаправления с хоста в контейнер.

ID = $(docker run -d -P nginx)
docker port $ID 80
0.0.0.0:32771
$curl localhost:32771

Соединение между контейнерами

Соединения инициализируются с помощью аргумента —link CONTAINER:ALIAS в команде docker run, где CONTAINER – имя контейнера-адресата (link container)1, а ALIAS – локальное имя, используемое внутри управляющего контейнера для обращения к контейнеру-адресату.

docker run -d --name myredis redis
c9148dee046a6fefac48806cd8ec0ce85492b71f25e97aae9a1a75027b1c8423
$ docker run --link myredis:redis debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f015d58d53b5
REDIS_PORT=tcp://172.17.0.22:6379
REDIS_PORT_6379_TCP=tcp://172.17.0.22:6379
.....

Работа с томами (общими каталогами)

Тома (volumes) Docker – это каталоги1, которые не являются частью файловой системы UnionFS конкретного контейнера, а представляют собой обычные каталоги в файловой системе хоста, но могут быть смонтированы как отдельные файловые системы (bind mounting) внутри контейнера.

$ docker run -it --name container-test -h CONTAINER -v /data debian /bin/bash
root@CONTAINER:/# ls /data
root@CONTAINER:/#

Здесь каталог /data внутри контейнера станет томом. Любые файлы, которые данный образ сохранил в каталоге /data, копируются на этот том. Мы можем проверить место расположения данного тома в файловой системе хоста, выполнив команду docker inspect на хосте из новой командной оболочки:

$ docker inspect -f {{.Mounts}} container-test
[{5cad... /mnt/sda1/var/lib/docker/volumes/5cad.../_data /data local true}]

Указание тома в Dockerfile

FROM debian:wheezy
VOLUME /data

Назначение прав на том (обязательно до объявления тома)

FROM debian:wheezy
RUN useradd foo
RUN mkdir /data && touch /data/x
RUN chown -R foo:foo /data
VOLUME /data

Третий способ состоит в расширении аргумента -v команды docker run с явным указанием связываемого каталога хоста в формате -v HOST_DIR:CONTAINER_DIR. Этот способ нельзя использовать в Dockerfile (так как он нарушает принцип переносимости и создает угрозу безопасности). Например:

$ docker run -v /home/adrian/data:/data debian ls /data

Монтировать том из другого контейнера

$ docker run -it -h NEWCONTAINER --volumes-from container-test debian /bin/bash
root@NEWCONTAINER:/# ls /data
test-file
root@NEWCONTAINER:/#

Манипуляция образами

Сохранение образа из указанного контейнера

$docker commit id_conteinner name_images

Сохранение образа в tar архив:

$docker save -o img.tar name|id_image

Загрузка образа из архива

$docker load -i img.tar

Загрузка образа из репозитория

$docker pull 

Загрузить образ в репозиторий

$docker push 

Сохранить/Загрузить содержимое файловой системы контейнера

$ docker import / export $ID

Docker tag — связывает имя репозитория и тег с заданным образом

docker tag faa2b75ce09a newname 
$ docker tag newname:latest amouat/newname 
$ docker tag newname:latest amouat/newname:newtag 
$ docker tag newname:latest myregistry.com:5000/newname:newtag