Платформа Docker изначально создавалась для операционной системы Linux, а затем была адаптирована для Windows и macOS.
Что такое контейнер в Docker?
Процессы и подпроцессы в Docker выполняются изолированно. При этом используются два основополагающих принципа.
Пространство имен
Пространства имен позволяют изолировать один набор имен от других. Имена классов, объявленные в одном пространстве, не конфликтуют с себе подобными в другом.
Контрольная группа (cgroups)
Концепция контрольной группы позволяет распределять время процессора, системную память, пропускную способность сети и их комбинации между выполняемыми в системе группами задач (процессов).
Команды
Получить список всех активных контейнеров.
docker psr ps
Получить список всех активных и неактивных контейнеров.
docker ps -a
Получить список всех контейнеров с хэш-кодом.
docker ps -a -q
Построить контейнер.
docker run image_name
#Например, node, nginx, php...
Построить в интерактивном режиме и подключить терминал.
docker run image_name -it# -i: iterative
# -t: tty
Создать контейнер и запустить его в Bash.
docker run -it ubuntu bash
Уничтожить контейнер при остановке.
docker run -it ubuntu bash --rm
Чтобы открыть порт контейнера для локального компьютера, используйте -p.
docker run -p 8080:80 nginx
#8080: local machine port
#80: exposed container port
Чтобы успешно отсоединить Bash, используйте -d
.
docker run -d -p 8080:80 nginx
Остановить контейнер.
docker stop container_name or hash
Удалить контейнер.
docker rm container_name or hash
Чтобы удалить работающий контейнер, используйте -f
.
docker rm container_name or hash -f
Выполнить действие над уже созданным контейнером.
docker exec -it container_name bash
Предоставить локальные файлы контейнеру.
docker run -d -p 8080:80 --name test --mount type=bind source="${pwd}"/html,target=usr/share/nginx/html image_name
Source — это местонахождение файлов, а target — это адрес, по которому будет скопировано содержимое. Иначе говоря команда pwd
указывает текущий адрес. Например:
$ pwd
/c/Users/docker/Documents/docker/node
Что такое volume в Doker?
Volume — это данные, называемые томами. Они передаются из памяти компьютера в контейнер и обратно.
Перечислить все тома.
docker volume ls
Очистить все неиспользуемые тома.
docker volume prune
Создать том.
docker volume create volume_name
Проверить том.
docker volume inspect volume_name
Создать том при запуске контейнера.
docker run -d -p 80:8080 --mount type=volue,source=volume_name,target=usr/share/nginx/html nginx
Что такое images в Doker?
Образы (images) Doker состоят из послойно размещающихся файловых систем. Они являются основой создания приложений.
Загрузить образ.
docker pull image_name
Перечислить все загруженные образы.
docker images
Удалить образ.
docker rmi image_name
Использование файла Docker для построения образа
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
ENTRYPOINT ["script.sh"]
CMD ["node", "src/index.js"]
FROM
— это базовый образ для создания собственного образа.WORKDIR
— каталог по умолчанию для загружаемого образа.RUN
— команды для загрузки или создания чего-либо.COPY
— это файлы, копируемые из памяти компьютера в контейнер.CMD
— это команды, которые можно передать при запуске контейнера.ENTRYPOINT
— это, в отличие от CMD, неизменяемые при создании образа команды, которые можно заменить при запуске контейнера.
ENTRYPOINT и CMD
ENTRYPOINT
определяет всегда выполняемую при запуске контейнера команду. CMD
используют для установки аргументов по умолчанию для ENTRYPOINT
или для выполнения команды в контейнере. RUN
запускает команды внутри образа Docker.
Построить образ.
docker build -t tiagosantosdev/image_name:latest .
Для другого названия файла docker используйте -f
.
docker build -t tiagosantosdev/hello-medium . -f Dockerfile.prod
Сети в Docker
В докере есть четыре типа сетей, по умолчанию используется bridge (мост).
bridge — сетевой драйвер по умолчанию. Этот тип сети будет создаваться, если не указывать драйвер. Мостовые сети обычно применяют для исполняемых в автономных контейнерах приложений, которым необходимо обмениваться данными.
host — применим для автономных контейнеров, удаляет сетевую изоляцию между контейнером и хостом Docker и напрямую использует сеть хоста.
overlay — оверлейные сети, они соединяют несколько демонов (daemons) Docker и позволяют сервисам swarm взаимодействовать друг с другом. Такие сети можно использовать для упрощения информационного обмена между сервисом swarm и автономным контейнером или между двумя автономными контейнерами на разных демонах Docker. При этом не нужна маршрутизация на уровне ОС между этими контейнерами.
macvlan — сети Macvlan, которые позволяют назначить MAC-адрес контейнеру, чтобы он отображался в сети как физическое устройство. Демон Docker направляет трафик в контейнеры по их MAC-адресам. В некоторых случаях драйвер macvlan — лучший выбор для старых версий приложений, которые должны напрямую подключаться к физической сети вместо следования через сетевой стек хоста Docker.
none — контейнеры отключены от всех сетей. Этот вариант обычно используется вместе с настраиваемым сетевым драйвером, недоступен для сервисов swarm.
Перечислить все сети.
docker network ls
Построить сеть.
docker create network create --driver bridge my_network
Построить контейнер с сетью.
docker run -d -it --name ubuntu --network my_network
Создать соединение с двумя уже созданными контейнерами.
docker network connect my_network my_container
Проверить сеть.
docker network inspect my_network
Использование многоэтапных (multi-stage) сборок
В подобном процессе используется контейнер для построения приложения, а затем создается новый контейнер с подготовленными к применению файлами. Уменьшается фактический размер контейнера.
Как использовать Docker Compose?
version: "3.9" # Опционально с v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Загрузить все контейнеры.
docker-compose up -d
Остановить все контейнеры.
docker-compose down
Построить все образы.
docker-compose up --build
Читайте также:
- Как запустить любое ПО с графическим интерфейсом в Docker?
- Как настроить непрерывную интеграцию на GitLab с помощью Docker
- Контейнеризация в Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Tiago Santos: Container construction with Docker