Как мы уже знаем, Docker-контейнер разворачивается из Docker-образа, а настройки Docker-образа хранятся в Dockerfile.
Создание Docker-контейнера на основе Dockerfile
- Создаём отдельную папку и переходим в неё: mkdir docker && cd docker
- Создаём Dockerfile: vi Dockerfile
#Укажем базовый образ ОС (будет поиск по DockerHub)
FROM ubuntu
#Указываем свои учётные данные при создании образа
MAINTAINER ALEXEY <ваш адрес почты>
#Укажем команды (устанавливаем cowsay и добавляем её в быстрый запуск)
RUN apt-get update && apt-get install -y cowsay && ln -s /usr/games/cowsay /usr/bin/cowsay
#Команда cowsay будет автоматически запускаться при обращении к контейнеру
ENTRYPOINT ["cowsay"]
3. Создаём Docker Image на основе Dockerfile: docker build -t tv1n94/ubuntu-cows-file .
4. Отправляем наш Docker Image в реестр DockerHub: docker push tv1n94/ubuntu-cows-file
5. Запускаем Docker контейнер на основе образа с DockerHub: docker run tv1n94/ubuntu-cows cowsay «WHATSAPP, BRO!»
vagrant@d10:~/docker$ docker run tv1n94/ubuntu-cows cowsay "WHATSAPP, BRO!"
Unable to find image 'tv1n94/ubuntu-cows:latest' locally
latest: Pulling from tv1n94/ubuntu-cows
e6ca3592b144: Already exists
534a5505201d: Already exists
990916bd23bb: Already exists
e1948d9d9063: Already exists
Digest: sha256:730e0ff5d4c1f0f97dec0cf0acd39c2e7ed2c75dea6a0ad4d80e2d2890445944
Status: Downloaded newer image for tv1n94/ubuntu-cows:latest
________________
< WHATSAPP, BRO! >
----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
vagrant@d10:~/docker$
Соединение контейнеров между собой
Допустим у нас есть контейнер с базой данных и отдельный контейнер с СУБД управления. Давайте свяжем между собой 2 контейнера:
- Запускаем контейнер с БД (Через параметр -e можно указывать переменные контейнера. Укажем пароль root к MYSQL): docker run —name mariadb -e MYSQL_ROOT_PASSWORD=pass123456 -d mariadb
2. Запускаем контейнер Adminer и указываем, что БД находится в другом контейнере: docker run —link mariadb:db -p 1234:8080 -d adminer
Параметр —link отвечает за соединение с другим контейнером.
Для более удобного объединения контейнеров между собой используют Docker-compose.
Dokcer-compose — инструмент для создания и запуска многоконтейнерных приложений. В Compose контейнеры описываются специальным файлом docker-compose.yml (или .yaml)
Давайте создадим отдельную папку и добавим туда файл docker-compose.yml:
mkdir mydocker && cd mydocker
vi docker-compose.yml
# Use root/example as user/password credentials
#Версия файла. Нужно проверить, какая версия поддерживается докером
version: '3.1'
services:
#имя контейнера
db:
#Образ из которого будет разворачиваться контейнер
image: mariadb
#Функция автоматическокго рестарта (no - никогда, on-failure - после
#критической ошибки, always - рестарт в любом случае)
restart: always
#Дополнительные значения переменных (например пароль)
environment:
MYSQL_ROOT_PASSWORD: 123456
#Указываем папку, смонтированную из ОС (папка в ОС:папка в контейнере)
volumes:
- ./db:/var/lib/mysql
adminer:
image: adminer
restart: always
#проброс порта (порт снаружи:порт внутри)
ports:
- 1234:8080
Параметр version отвечает за версию Docker-compose. С версией нужно быть внимательным, иногда в новой версии нет каких-то функций или добавляются новые. Проверить работу docker с версиями можно на официальном сайте docker, предварительно поняв, какая версия Docker установлена на вашем компьютере:
vagrant@d10-sysops:~/mydocker$ docker -v
Docker version 19.03.8, build afacb8b7f0
vagrant@d10-sysops:~/mydocker$ docker-compose -v
docker-compose version 1.25.5, build 8a1c60f6
vagrant@d10-sysops:~/mydocker$
В Docker-compose не должно быть TABов, можно использовать только пробелы.
Из Docker-compose можно ссылаться не только на образ, но и на Dockerfile, тогда вместо параметра IMAGE надо указать параметр BUILD. Одновременно нельзя использовать оба параметра для одного сервиса!
services:
db:
build: ./db
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
В разделе build указана папка db, в ней должен быть файл docker-compose.yml. Файл описания может быть назван другим именем, но тогда в разделе build ещё нужно указать имя файла.
Тома Docker (volumes) — это папки операционной системы, которые смонтированы в Docker-контейнер. Могут быть смонтированы как отдельные файловые системы внутри контейнера. Если выключить контейнер, то данные в папке не пропадут.
Добавить volumes можно при запуске контейнера, например docker run -v /data ubuntu или в Dockerfile, указав параметр VOLUME /data
Основные команды docker-compose
Запуск образа на основе Docker-compose | docker-compose up |
Запуск образа Docker-compose в интерактивном режиме: | docker-compose up -d |
Просмотр запущенных контейнеров | docker-compose ps |
Запрос адреса виртуальной машины на которой работает Docker (Работает только на Windows) | docker-machine ip default |
Останавливаем рабочий проект | docker-compose stop |
Удаление образа db | docker-copose rm db |
Выполнение перестройки проекта (применение изменений) | docker-copose build |
UnionFS
Каждый образ состоит из нескольких слоёв. UnionFS объединяет все слои в контейнер. До запуска контейнера все слои находятся в режиме чтения.
При запуске контейнера появляется дополнительный слой чтение/запись, чтобы можно было вносить изменения. Если остановить контейнер, то слой чтение\запись удалится. Если нужно чтобы изменения сохранились, то необходимо сделать docker commit
Посмотреть историю изменения слоёв можно с помощью команды: docker history ubuntu-cows:latest
Самый простой способ уменьшить размер образа — это удалить ненужные слои(Сделать меньше шагов при формировании инструкций). Также если во время создания образа есть какие-то инструкции, который распаковывают архивы, то архив потом лучше удалять…