сайт для палких паяльників

Склерозник по 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

Успехов.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

 
Translate
Архіви

© 2011-2018 Андрій Корягін, Кременчук - Київ, Україна