Рассмотрим как запустить и соединить 2 контейнера на примере MySQL и Adminer
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456789 -d mysql
docker run --link mysql:db -p 8080:8080 adminer
Проверим
ip_address:8080
Логинимся
Движок - MySQL
Сервер - db
Имя пользователя - root
Пароль - 123456789
База данных - не указываем
Нажимаем Войти
Для удобства и автоматизации работы с контейнерами в Docker есть удобный инструмент — Docker Compose. Посмотрим как он работает на примере выше
nano docker-compose.yml
version: '3.9'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456789
adminer:
image: adminer
restart: always
ports:
- 8080:8080
docker compose up // запустим
docker compose up -d // если необходимо запустить в фоне
docker compose down // завершим работу
Проверим
ip_address:8080
Логинимся как в примере выше
Как видим запуск через Docker Compose намного удобнее и приближает нас к подходу Infrastructure-as-Code, когда вся инфраструктура должна быть описана в конфигурационных файлах.
Немного доработаем наш проект
mkdir mysql
mkdir adminer
mkdir db
cd mysql
nano Dockerfile
FROM mysql
cd ..
cd adminer
nano Dockerfile
FROM adminer
nano docker-compose.yml
version: '3.9'
services:
db:
build: ./mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456789
volumes:
- ./db:/var/lib/mysql
adminer:
build: ./adminer
restart: always
ports:
- 8080:8080
docker compose build
docker compose up
docker compose down // для остановки
Проверим
ip_address:8080
Логинимся как в примере выше
Откроем второй терминал и зайдем в папку db. Видим нашу БД.
Создадим в adminer БД
Create database -> devopslife -> collation выбираем utf8mb4_unicode_ci -> Save
Create table -> devopslife_table ->
id - int 20
date - datetime - CURRENT_TIMESTAMP
Save
New Item
id - 1
date - 0000-00-00 00:00:00
Save
Edit
date - now
Save
cd db
ls
cd devopslife
ls
devopslife_table.ibd // Видим то, что создали
Полезная команда
docker history containername
Она покажет слои контейнера, так как каждая инструкция в Dockerfile создает новый слой.
Важно помнить о размере образа и например, вместо Ubuntu или Debian выбрать легковесный Alpine.
На эту тему в канале devopslife есть отличная подборка статей с Хабра (линк)