Docker. Склерозник


13.09.2018

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации.

Склерозник по Docker. Установка, работа с образами и контейнерами, создание своего образа для нескольких платформ swarm и т.д.

Как установить Docker CE на Ubuntu ?

1. Смотрим как устанавливать Docker на его сайте: https://docs.docker.com/install/ 2. Ищем нужную нам OS (Ubuntu): https://docs.docker.com/install/linux/docker-ce/ubuntu/ 3. Удаляем старую ерсию (если есть):

sudo apt-get remove docker docker-engine docker.io
4. Устанавливаем все что нужно перед установкой Docker CE: Update the apt package index:

sudo apt-get update
Install packages to allow apt to use a repository over HTTPS:

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Add Docker\\u2019s official GPG key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.

sudo apt-key fingerprint 0EBFCD88
Use the following command to set up the stable repository.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5. Устанавливаем Docker CE

sudo apt-get update
sudo apt-get install docker-ce
6. Проверяем работу Docker

sudo docker ps
sudo docker run hello-world

Как установить Docker на Raspberry Pi?


curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh

Команды Docker в примерах

Поиск образа

docker search nginx
docker search nginx -- filter stars=3 --no-trunc busybox
Список скачанных образов

docker images
Удаление образа

docker rmi nginx
Список всех контейнеров

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

docker ps
Скачать образ nginx

sudo docker pull nginx
Запустить контейнер как демон (-d) из образа nginx, назвать docker-nginx, пробросить порт 80 наружу как 8888, папку /var/docker-nginx/html прокинуть в контейнер как /usr/share/nginx/html, а папку var/docker-nginx/conf.d как /etc/nginx/conf.d

sudo docker run --name docker-nginx -p 8888:80 -v /var/docker-nginx/html:/usr/share/nginx/html -v /var/docker-nginx/conf.d:/etc/nginx/conf.d -d nginx
Перезапустить контейнер

sudo docker restart docker-nginx
Смотреть что делает контейнер

docker logs -f docker-nginx
Подключится к работающему контейнеру (6ee6223a3ce3 - ID контейнера или имя)

docker exec -i -t 6ee6223a3ce3 bash
Остановить контейнер

sudo docker stop docker-nginx
Переименование контейнера

docker rename infinite infinity
Обновление контейнера

docker update --cpu-shares 512 -m 300M infinite
Пауза (приостановка всех процессов контейнера)

docker pause nginx
Снятие паузы

docker unpause nginx
Блокировка (до остановки контейнера)

docker wait nginx
Удалить контейнер

docker rm docker-nginx
Создаем сеть в docker

docker network create mynet
Список сетей

docker network ls
Удаление сети

docker network rm mynet
Запустить контейнеры в сети:

docker run --name mongodb1 --net=mynet -d -v /var/mongo/db1:/data/db -p 27017:27017 --restart unless-stopped mongo --replSet "rs0"
docker run --name mongodb2 --net=mynet -d -v /var/mongo/db2:/data/db -p 27018:27017 --restart unless-stopped mongo --replSet "rs0"
docker run --name mongodba --net=mynet -d -v /var/mongo/dba:/data/db -p 27019:27017 --restart unless-stopped mongo --replSet "rs0"
Подключение работающего контейнера к сети

docker network connect mynet nginx
Отключение контейнера от сети

docker network disconnect mynet nginx

Как собрать свой образ (Image) ?

Создаем файл с именем Dockerfile (пример):

FROM ubuntu:latest
MAINTAINER ubackend
RUN apt-get update
RUN apt-get install python3 -y
RUN apt install python3-pip -y
RUN pip3 install pymongo
ADD ./ /root/u-backend/
EXPOSE 8888
CMD /usr/bin/python3 /root/u-backend/test.py
Собираем image командой:

sudo docker build . -t ubackend

Как поднять собственный Registry Server для Docker ?


sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2

Заливаем собранный образ на свой Registry Server


sudo docker tag ubackend:latest localhost:5000/ubackend
sudo docker push localhost:5000/ubackend
Список Image на своем Registry Server:

sudo docker images localhost:5000
Скачать Image со своего Registry Server:

sudo docker pull localhost:5000/ubackend:latest
Удалить Image со своего Registry Server:

sudo docker image remove localhost:5000/ubackend:latest
Сохранить образ в tar файл

docker save ubackend-auth > ubackend-auth.tar
Загрузить образ из tar файла

docker load < ubackend-auth.tar

Как поднять Docker Swarm ?

Если хочется, устанавливаем docker-machine (на Linux):

base=https://github.com/docker/machine/releases/download/v0.15.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
На ведущем хосте выполняем команду инициализации:

docker swarm init --advertise-addr 192.168.0.101
Команда должна вернуть примерно такой ответ:
andre@andre-desktop:~$ docker swarm init --advertise-addr 192.168.0.101
Swarm initialized: current node (wbrl1qtgnpu6hzacuvchpc0gt) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-5tfzb50bvqx8is04va4ob2yrorbozjf2aqynismq8j4m3klnsz-agg97k98r9oqga5ft6vimpkgd 192.168.0.101:2377
To add a manager to this swarm, run `docker swarm join-token manager` and follow the instructions.
Дальше на каждой следующей ноде, которую надо включить в swarm, выполняем команду, которая выдана при инициализации swarm:

docker swarm join --token SWMTKN-1-5tfzb50bvqx8is04va4ob2yrorbozjf2aqynismq8j4m3klnsz-agg97k98r9oqga5ft6vimpkgd 192.168.0.101:2377
Проверяем состояние нод:

docker node ls
Пример ответа:
andre@andre-desktop:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
wbrl1qtgnpu6hzacuvchpc0gt *   andre-desktop       Ready               Active              Leader              18.06.1-ce
rl4t7ngjhyy6kyzl4vhl3k21h     raspberrypi         Ready               Active                                  18.06.1-ce
zut817u4pcucxqlxvhzrzkoa7     raspberrypi         Ready               Active                                  18.06.1-ce
Создаем сервис:

docker service create --replicas 1 --name helloworld alpine ping docker.com
Проверяем состояние сервисов

docker service ls
пример ответа:
andre@andre-desktop:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jhmnkafmnrsl        helloworld          replicated          1/1                 alpine:latest       
Инспектируем :) Сервис:

docker service inspect --pretty helloworld
Пример ответа:
andre@andre-desktop:~$ docker service inspect --pretty helloworld
ID:		jhmnkafmnrslhf0ydcsnrljo8
Name:		helloworld
Service Mode:	Replicated
 Replicas:	1
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		alpine:latest@sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
 Args:		ping docker.com 
 Init:		false
Resources:
Endpoint Mode:	vip
Список сервисов:

docker service ps helloworld
МАСШТАБИРУЕМ Сервис! (ВОТ ОНО - ГЛАВНОЕ):

docker service scale helloworld=5
Вот они, родимые:

docker service ps helloworld

portainer

portainer - web морда для управлени Docker и Docker Swarm. Устанавливаем:

docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Как собрать один образ для разных платформ и/или ОС ?

У меня в Swarm есть две платформы amd, arm. Для работы скриптов на Python нужно собирать для каждой платформы свой образ. Но использовать для каждой из платформ образ с отдельным именем жутко не удобно. Особенно если у Вас swarm и в нем ноды на разных платформах или с разными операционными системами. 1. Собираем образы для разных платформ и заливаем на Docker hub. Можно так: docker_build_linux-amd.bash:

#!/bin/bash
CONTAINER=avislab/test:backend-linux-amd
docker rmi $CONTAINER
docker build . -t $CONTAINER
docker login
docker push $CONTAINER
Соответственно на ARM платформе собираем свой образ (Dockerfile может быть разным) docker_build_linux-arm.bash:

#!/bin/bash
CONTAINER=avislab/test:backend-linux-arm
docker rmi $CONTAINER
docker build . -t $CONTAINER
docker login
docker push $CONTAINER
Создаем и заливаем манифест:

docker manifest create avislab/test:backend avislab/test:backend-linux-amd avislab/test:backend-linux-arm --amend
docker manifest annotate --arch amd avislab/test:backend avislab/test:backend-linux-amd
docker manifest annotate --arch arm --variant armv7l avislab/test:backend avislab/test:backend-linux-arm
docker manifest push avislab/test:backend --purge
Теперь на любых платформах используем avislab/test:backend. Для AMD скачается avislab/test:backend-linux-arm, а для ARM скачается avislab/test:backend-linux-arm Успехов. Дивись також:

Web-dev склерозник
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви