DevOps

Знакомство с Docker

Docker основные команды | #2

  • Запустить контейнер
    docker run -it ubuntu bash
    где -i -t сообщает докеру что необходимо создать сеанс интерактивной работы на подключаемом терминальном устройстве
    bash - инициализирует командную оболочку bash

  • Запустить контейнер с ручным указанием имени
    docker run -it --name myapp --hostname myapp ubuntu bash

  • Удалить все контейнеры со статусом exited
    docker rm -v $(docker ps -aq -f status=exited)

  • Запустить контейнер как демон
    docker run -d bitnami/apache

  • Вывести список всех запущенных и остановленны контейнеров
    docker ps -a

  • Для остановки контейнера
    docker stop container_name

  • Запуск контейнера с пробросом портов
    docker run -d -p 8000:8080 bitnami/apache
    где 8000 - порт локальной машины
    8080 - порт контейнера

see:
http://bestwaypractice.ru:8000/

  • Получить информацию о контейнере + с фильтрацией
    docker inspect container_name | grep IPAddress

Docker создаем собственный образ | #3

  • Запустить контейнер с ручным указанием имени
    docker run -it --name myapp --hostname myapp ubuntu bash
  • Обновить репозитории
    apt update
  • Установить приложение
    apt install cowsay
  • создать симлинк для быстрого запуска команды вводом “cowsay”
    ln -s /usr/games/cowsay /usr/bin/cowsay
  • проверим работу
    cowsay test
______
< test >
------
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||
  • выйдем из контейнера
    exit
  • Волшебной командой отправим подготовленный контейнер в образ докер-хаб:
    docker commit myapp dionisvl/myapp
  • теперь у нас есть свой докер контейнер который можно вызыть передавая параметры:
    docker run dionisvl/myapp cowsay 'hi'
  • Авторизоваться на сврере докера:
    docker login -u "user" -p "pass" docker.io
  • отправим образ в репозиторий:
    docker push dionisvl/myapp
  • Удаление образов с локальной машины:
    docker rmi 97923498723fa
  • Список образов на локальной машине:
    docker images

Dockerfile - Первое знакомство | #4

  • В любом месте создадим файл Dockerfile:
	FROM ubuntu

	RUN apt-get update && apt-get install -y cowsay && ln -s /usr/games/cowsay /usr/bin/cowsay

	ENTRYPOINT ["cowsay"]
  • И его можно запускать:
    docker build -t dionisvl/youtube .

Docker соединение контейнеров между собой | #5

  • Внимательно читаем инструкции к выбранным для соединения контейнерам
    https://hub.docker.com/_/mariadb
    docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=123456 -d mariadb

docker run --link mysqlserver:db -p 8080:8080 adminer
#где вместо mysqlserver ставим имя нашего контейнера с БД
теперь по адресу http://bestwaypractice.ru:6080/ мы можем войти в Adminer

Docker-compose что это? Первое знакомство | #6

https://www.youtube.com/watch?v=NRcpqse2zBo&list=PLD5U-C5KK50XMCBkY0U-NLzglcRHzOwAg&index=8

version: '3.1'

services:

  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456

  adminer:
    image: adminer
    restart: always
    ports:
      - 6080:8080
  • Перейдем в директорию где мы сохранили этот файл docker-compose.yml и попробуем его запустить:
    docker compose up

  • Чтобы запустить в качестве демона добавим флаг -d
    docker compose up -d

  • Посмотреть список всех запущенных docker-compose:
    docker-compose ps

  • Для Windows все также, но есть моменты:
    чтобы узнать ip машины:
    docker-machine ip default

Dockerfile и docker-compose.yml больше автоматизации и связь между ними | #7

https://www.youtube.com/watch?v=OCNzafcF2Yw&list=PLD5U-C5KK50XMCBkY0U-NLzglcRHzOwAg&index=9

  • внутри docker-compose.yml должен быть один build либо один image

  • после сознания Dockerfile для каждого из service
    docker-compose build

  • docker-compose up

  • Можно объявить ТОМ при запуске контейнера при помощи флага ‘-v’
    docker run -v /data ubuntu

  • Мы можем проверить расположение тома на файловой системе хоста при помощи inspect
    docker inspect -f {{.Mounts}} имяконтейнера

  • Используя инструкцию к нашему контейнеру для БД, см. “Where to Store Data”, добавим в docker-compose параметр volumes:

    volumes:
      - /databases:/var/lib/mysql
  • Теперь удалим контейнер по имени сервиса:
    docker-compose rm db
  • Пересоберем контейнеры и docker-compose:
    docker-compose build
  • Пересоберем поднимаем конфигураци docker-compose:
    docker-compose up
  • теперь наше хранилище файлов создано и работает не зависимо от того удален контейнер или нет

Docker разница между образом и контейнером | #8

  • Docker-образ - это список компонентов или рецепт по которому собирается контейнер. Эти рецепты хранятся в Docker-реестрах, как например Docker Hub и их можно скачать с помощью команды docker pull:
    docker pull ubuntu
  • Контейнеры - создаются из образов с помощью команды docker run, а выполнив команду docker ps можно узнать какие контейнеры в данный момент запущены
    docker run -it ubuntu /bin/bash
    docker ps

Docker как уменьшить размер образа - файловая система UnionFS и слои | #9

  • Посмотреть список образов на машине:
    docker images

  • Посмотреть список всех слоев конкретного образа:
    docker history mariadb

  • Напишем новый Dockerfile в котором каждую команду пишем с новой строки + очистим список лишних репозиториев APT:

	FROM ubuntu

	MAINTAINER BWP DEVELOP <info@bestwaypractice.ru>

	RUN apt-get update
	RUN apt-get install -y cowsay
	RUN ln -s /usr/games/cowsay /usr/bin/cowsay
	RUN rm -rf /var/lib/apt/lists/*

	ENTRYPOINT ["cowsay"]
  • Сформируем новый образ и посмотрим на размер:
    docker build -t dkamanyrun .
    docker images
    показало 133мб

  • Перепишем Dockerfile там чтобы все команды были в одной строке:

	FROM ubuntu

	MAINTAINER BWP DEVELOP <info@bestwaypractice.ru>

	RUN apt-get update \
		&& apt-get install -y cowsay \
		&& ln -s /usr/games/cowsay /usr/bin/cowsay \
		&& rm -rf /var/lib/apt/lists/*

	ENTRYPOINT ["cowsay"]
  • Сформируем новый образ и посмотрим на размер::
    docker build -t dkaonerun .
    docker images
    Теперь вместо 7 слоев-шагов стало 4 и показало 105 мб. - на 28 мб. меньше (!)

  • также вместо образа ubuntu можно использовать debian или alpine

  • Удалить все контейнеры у которых статус = exited:
    docker rm -v $(docker ps -aq -f status=exited)

  • Удалить образы:
    docker rmi $(docker images -q) --force

Самый простой и минимальный запуск laravel в docker | установка laravel в docker | #10

https://www.youtube.com/watch?v=TumfGqUf39U&feature=youtu.be&list=PLD5U-C5KK50XMCBkY0U-NLzglcRHzOwAg

  • Создадим .env файл
#PATHS

DB_PATH_HOST=./databases

APP_PATH_HOST=./dka-blog

APP_PATH_CONTAINER=/var/www/html/
	
  • Создадим файл docker-compose.yml:
version: '3'

services:

  web:
    build: ./web
    environment:
      - APACHE_RUN_USER=#1000
    volumes:
      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}
    ports:
      - 8080:80
    working_dir: ${APP_PATH_CONTAINER}

  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ${DB_PATH_HOST}:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 6080:8080

  composer:
    image: composer:1.9.1
    volumes:
      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}
    working_dir: ${APP_PATH_CONTAINER}
    command: composer install
  • Создадим наш Dockerfile (обязательно по тому адресу что указан в docker-compose - build):
FROM php:7.4-apache

RUN docker-php-ext-install \
	pdo_mysql \
	&& a2enmod \
	rewrite

//тут “a2enmod” - необходимо для работы laravel

  • В терминале откроем директорию содержащую все эти файлы (/home/docker/laravel)и выполним
    git clone https://github.com/dka-develop/dka-blog-new.git

  • Добавим путь к нашему проекту в файле .env

APP_PATH_HOST=./dka-blog-new
  • Давайте запустим наш проект:
    docker-compose up --build
    Тут мы можем лицезреть следующий процесс:
- Установка PHP с Apache, Образ собирается из Dockerfile и добавляются пакеты
- Установка Базы данных MariaDB
- Установка Adminer PHP script для управления
- Установка Composer Пакетный менеджер
- Запуск контейнеров
- Инициализация Composer , устанавливаются зависимости для Laravel
- laravel_composer_1 exited with code 0 - значет `composer install` выполнена успешно
  • командой docker-compose ps проверим чтобы наши 3 контейнера были в состоянии UP: laravel_adminer_1, laravel_db_1, laravel_web_1.

  • Теперь необходимо зайти в сервис “laravel_web_1” и выполнить команду для генерации ключа.
    Не завершая запущенные процессы, войдем в контейнер:
    docker-compose exec web bash
    Сгенерируем ключ ларавел:
    php artisan key:generate

  • Перейдем в adminer и создадим БД для laravel:
    http://bestwaypractice.ru:6080/
    Создать базу данных -> dka_blog

  • Настроим ларавел в файле .env:

...
DB_HOST=db
DB_PORT=3306
DB_DATABASE=dka_blog
DB_USERNAME=root
DB_PASSWORD=123456
...
  • Возвращаемся в терминал контейнера и выполняем миграции БД:
    php artisan migrate
  • Теперь открываем ларавел, он будет на порту 8080:
    http://bestwaypractice.ru:8080/
  • Ошибка "The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied" говорит о том что у пользователя нет доступа.
  • Изучив документацию https://hub.docker.com/_/php, в разделе “Running as an arbitrary user” узнаем о том что для Apache нужно изменить настройки в файле docker-compose.yml так:
      - APACHE_RUN_USER=#1000
  • Остановим контейнеры
  • Запустим все сервисы снова, но уже без команды --build:
    docker-compose up
  • Теперь открываем блог:
    http://bestwaypractice.ru:8080/public/
    зарегистрировавшись переходим в админку
    http://bestwaypractice.ru:8080/public/admin
  • Все! у нас получился минимальный набор для работы.

Leave a reply