#8 DevOps. Docker. Docker Compose и другие tips & tricks

Рассмотрим как запустить и соединить 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 есть отличная подборка статей с Хабра (линк)