Воскресенье, 17.11.2024, 02:21

Компьютерная помощь

Записки системного администратора

Меню сайта
Категории раздела
Компьютер [36]
Общекомпьютерные темы
Windows server [18]
Статьи по версиям windows для серверов.
Windows [30]
Статьи по версиям windows для рабочих станций.
Unix [65]
Статьи на тему unix-подобных систем. Linux, FreeBSD и т.п.
Видеомонтаж [10]
Статьи по нелинейному видеомонтажу
Программирование [9]
Заметки по программированию
Databases [10]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Вход на сайт

Поиск

Главная » Статьи » Программирование

Docker. Практика с нуля.

Установка Docker на Linux Ubuntu 16.04 (18.04)

(туториал установки с docs.docker.com)

sudo apt update && apt upgrade

Установим необходимые пакеты для Docker:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Добавим ключ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Проверим ключ:
sudo apt-key fingerprint 0EBFCD88
Добавим репозиторий Docker`a:
 sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
В версии ubuntu до 18.04 обновляем индекс пакетов:
sudo apt update

Установка и запуск для CentOS 7:
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo systemctl start docker
sudo systemctl enable docker -добавляем в автозагрузку
sudo usermod -aG docker $USER -добавляем текущего юзера в группу docker
Установка Docker Compose так же как и в Debian, приведена ниже.

Инсталим Docker
sudo apt-get install docker-ce
Установка завершена, можно запустить образ "hello-world" (стандартный образ устанавливаемый по умолчанию для проверки работы)
sudo docker run hello-world

Инсталим Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
Даем права запуска утилите
sudo chmod +x /usr/local/bin/docker-compose
Проверяем работоспособность:
docker-compose --version

Создаем группу docker и добавляем нашего текущего пользователя в эту группу. Добавляя пользователя в группу docker, тем самым даем ему привилегии root.

sudo groupadd docker
sudo usermod -aG docker admin1
Чтобы заработало перезагрузим сервис и желательно перелогиниться.
sudo service docker restart
Теперь запуск образа docker run не будет требовать повышения прав юзера

Запускаем образ ubuntu c оболчкой bash
docker run -it ubuntu bash  (i- interactive, t- tty, docker run --help -помощь по командам run)
exit -остановка и выход из образа
docker ps -a -просмотр запущенных и остановленных образов
docker ps -просмотр запущенных образов (запускаем в другом терминале)
docker start jovial_visvesvaraya -запуск остановленного образа по имени снова
docker stop jovial_visvesvaraya -остановка запущенного образа по имени

docker run -h CONTAINERNAME -it ubuntu bash -запуск образа с именованным хостом
docker run --name dkadevelop -it ubuntu bash -запуск образа с присвоением имени
docker diff jovial_visvesvaraya -список измененных файлов в образе
docker logs jovial_visvesvaraya -список событий в образе
docker exec -ti имя_контейнера bash -войти в запущенный образ

docker exec -u 0 -ti имя_контейнера bash -войти в запущенный образ с правами root
docker inspect festive_neumann -вывод информации о образе по имени образа "festive_neumann", которое Docker генерирует автоматически.
docker ps -aq -f status=exited
docker rm -v $(docker ps -aq -f status=exited) -удаление всех остановленных образов
docker rmi 2cb0d9787c4d -удаление образа, где 2cb0d9787c4d -image id (выводит команда docker images)
docker images -посмотреть список образов

docker port container_name -просмотр используемых портов на запущенном контейнере
*** Пример. Запуск nginx.
docker run -d -p 80:80 nginx

Создание собственного образа

Для этого нужно зарегистрироваться на hub.docker.com
Запустим собственный контейнер командой:
docker run -it --name myap --hostname myap ubuntu bash
apt update
apt install cowsay -устанавливаем приложение игры "говорящая корова"
ln -s /usr/games/cowsay /usr/bin/cowsay -создаем символьную ссылку
cowsay “TEST” - тестим работу
exit
Сделаем из контейнера образ (образ можно делать из остановленного контейнера):
docker commit myap vitalyvo/gamecow (где vitalyvo -имя при регистрации на hub.docker.com, gamecow-придумываем осмысленное название нашего образа)
Запуск программы:
docker run vitalyvo/gamecow cowsay "TEST"

Образ можно запушить (сохранить) в hub.docker.com для публичного доступа к нему:
docker login -логинимся в свой аккаунт на hub.docker.com
docker push vitalyvo/gamecow -пушим образ
docker logout

Использование Dockerfile
Dockerfile- набор инструкций для создания Docker образа.
Создаем Dockerfile с содержимым:
FROM ubuntu # Аналог docker run -it --name myap --hostname myap ubuntu bash

RUN apt-get update && apt-get install -y cowsay && ln -s /usr/games/cowsay /usr/bin/cowsay
# Аналог команд:
#apt update
#apt install cowsay -устанавливаем приложение игры "говорящая корова"
#ln -s /usr/games/cowsay /usr/bin/cowsay -создаем символьную ссылку
ENTRYPOINT ["cowsay"] -точка входа, пишем имя выполняемого файла в образе

Затем в каталоге где расположен dockerfile выполняем команду:
docker build -t vitalyvo/gamecow . -(где vitalyvo -имя при регистрации на hub.docker.com, gamecow-придумываем осмысленное название нашего образа)
После такого создания образа запуск будет выглядеть следующим образом:
docker run vitalyvo/gamecow "TEST"  (в отличие от варианта ранее docker run vitalyvo/gamecow cowsay "TEST")

Соединение контейнеров между собой
Соединим образ БД MariaDB и админки adminer
https://hub.docker.com/_/mariadb/
https://hub.docker.com/_/adminer/
Запустим MariaDB:
docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag
где -e установка переменной окружения
    -d запуск образа в фоновом режиме
     tag - если нужно выбрать определенную версию
Итак:
docker run --name mariadbserver -e MYSQL_ROOT_PASSWORD=123 -d mariadb
docker ps
наша база данных работает на стандартном порту mysql 3306/tcp
Запустим adminer. Устанавливаем соединение (аргумент --link) между нашей базой данных mariadbserver:db (db -создаваемая docker при запуске запись в etc/hosts c ай пи адресом mariadb)
и adminer на порту (аргумент -p 8080:8080)
docker run --link mariadbserver:db -p 8080:8080 adminer
Теперь мы можем подключиться к БД через браузер по адресу:
ip_address:8080
логин: root
пароль: 123

Docker-compose
Docker-compose автоматически соединяет контейнеры.
На странице https://hub.docker.com/_/mariadb/ находим строки по работе Mariadb с Docker-compose
"... via docker stack deploy or docker-compose"
Создаем файл docker-compose.yml следующего содержания:

version: '3.1'

services:

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

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

где version: '3.1' - версия файла для чтения docker-compose
adminer: db: -присваиваем свои имена запускаемым сервисам
image: adminer -имя запускаемого образа на hub.docker.com
restart: always -при отказе всегда делать рестарт
ports: -порты на хосте и внутри контейнера (2080- на хосте, 8080- внутри контейнера)
environment: -переменные среды для работы в контейнере, MYSQL_ROOT_PASSWORD -соответственно пароль к БД
Чтобы создать образ из нашего файла docker-compose.yml, перейдем в директорию с файлом и запустим команду:
docker-compose up
Наша связка Mariadb- adminer теперь доступна по адресу
ip_address:2080
логин: root
пароль: 123
docker-compose up -d -запуск в фоновом режиме
docker-compose ps -посмотреть запущенные контейнеры

Для автоматизации можно вынести имена образов в отдельные файлы. Наш файл будет иметь вид:
version: '3.1'

services:

  adminer:
    build: ./adminer
    restart: always
    ports:
      - 2080:8080

  db:
    build: ./db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123

Где build: ./adminer - adminer имя дочернего каталога в котором содержится файл dockerfile. В dockerfile прописано содержание:
FROM adminer - имя образа на hub.docker.com

Аналогично с db. Создаем дочерний каталог db с файлом dockerfile. В dockerfile прописано содержание:
FROM mariadb

Перестроим проект:
docker-compose build
Запускаем:
docker-compose up (запуск проекта в папке с файлом docker-compose.yml)
docker-compose up -d -запуск в фоне
docker-compose ps --services -посмотреть имя запущенных сервисов
docker-compose stop db adminer -остановить сервисы

docker-compose down -v - остановка с удалением переменных сред (volume)

Проброс каталогов

Проброс каталогов с хост машины в контейнер производится с помощью директивы volumes.
Читаем документацию на hub.docker.com где mariadb хранит базы данных а именно часть "Where to Store Data". Узнаем что база хранится в /var/lib/mysql,
далее создаем директорию databases. Проброс осуществляется командой     
volumes:
  - ./databases:/var/lib/mysql

В итоге наш файл docker-compose.yml имеет следующий вид:

version: '3.1'

services:

  adminer:
    build: ./adminer
    restart: always
    ports:
      - 2080:8080

  db:
    build: ./db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - ./databases:/var/lib/mysql

Пересобираем наш контейнер:
docker-compose rm db
docker-compose build
docker-compose up

docker-compose exec db bash -вход в контейнер, где db- имя сервиса
docker history nginx -посмотреть истоию слоев контейнера
docker volume ls -посмотреть тома

Совместное использование данных контейнерами

Для того чтобы дать доступ одному контейнеру к томам другого, вы должны указать аргумент --volumes-from для команды docker run. Например:
docker run -it --name nginx_example1 -h nginx-container1 --volumes-from=nginx_example nginx /bin/bash
Это сработает вне зависимости от того, запущен контейнер nginx_example или нет. Причем, том не будет удален до тех пор, пока хотя бы один контейнер к нему подключен. Вы можете также монтировать том указывая в качестве значения аргумента -v имя тома, например:
 docker run -it --name nginx_example1 -h nginx-container1 -v e01cb937734c02790c94c14339bc563159a88c025e266d298d48398352ea477/root/static nginx /bin/bash

Упаковываем в контейнер простое приложение на Python Flask

Создаем папку с виртуальным окружением:
virtualenv web
Активируем виртуальное окружение:
source web/bin/activate
Создаем директорию:
mkdir flask
Директория flask должна содержать 3 файла app.py, dockerfile, requirements.txt со следующим содержимым
app.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'It`s Work!'

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

dockerfile:
FROM ubuntu:latest
MAINTAINER Rajdeep Dua "dua_rajdeep@yahoo.com"
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]

requirements.txt
Flask==1.0.2

Создаем контейнер. Команду выполняем из каталога flask:
docker build -t flask-sample-one:latest .
Запустим контейнер:
docker run -d -p 5000:5000 flask-sample-one

Теперь из браузера можем зайти на ip хоста с docker ip_address:5000 и увидим сообщение.

docker port name_of_image -просмотр используемых портов на запущенном контейнере

Используем doocker-compose в нашем приложении Flask

Имеем каталоги .../web/flask. В каталоге flask есть 3 файла app.py, dockerfile, requirements.txt. В каталоге web создаем файл docker-compose.yml,который необходим для doocker-compose со следующим содержимым:
web:
 build: ./flask
 ports:
   - "5000:5000"
 volumes:
   - ./flask:/app
где
build: ./flask -собираем образ из каталога flask
 volumes:
   - ./flask:/app -пробрасываем каталоги из хост машины ./flask в контейнер с каталогом /app
Таким образом мы можем изменять содержимое файла .../flask/app.py и видеть изменения в браузере сразу, без пересборки контейнера.

ocker-compose ps -просмотр запущенных docker-compose контейнеров
docker-compose stop -остановка приложения
docker-compose down -одновременная остановка и удаление


Управление контейнерами Docker через web интерфейс
(https://portainer.readthedocs.io/en/stable/index.html):

$ docker volume create portainer_data
$ docker volume ls просмотр созданных volumes
$ docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Или вариант ui-for-docker

docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

Import/Export Docker container
docker save -o testimage.tar svendowideit/testimage:version3 -сохраняем имидж svendowideit/testimage:version3 в контейнер testimage.tar.
Копируем tar файл на целевую машину. На целевой машине извлекаем имидж из tar контейнера:
docker load --input testimage.tar
Проверяем загрузился ли образ:
docker images

Вариант экспорт/импорт для работающего контейнера:
docker export --output "A.tar" <container-A>
Копируем tar файл на целевую машину
docker import A.tar <container-A-image>

Графический Web-интерфейс для docker:
docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

Часть 2. Кластеризация.


Полезные материалы:
https://dev-ops-notes.ru/%d1%83%d1%87%d0%b5%d0%b1%d0%bd%d0%b8%d0%ba-docker/
Детализацию любого образа можно посмотреть воспользовавшись проектом https://imagelayers.io

 

Категория: Программирование | Добавил: admin (07.09.2018)
Просмотров: 928 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: