yum       search  docker          # узнать точное название пакета с docker
yum       install docker-ce       # или apt или zypper
yum       install docker-engine   # в старых версиях
systemctl enable  docker
systemctl start   docker

df /var/lib/docker  # хранилище для docker images и volumes
lvcreate -T -L 15G -n dockerpool vg0 # lvol для докерного thin-pool-хранилища

/etc/docker/daemon.json :
{
"insecure-registries": ["192.168.1.0/24"],           // репозитории без https
"registry-mirrors":    ["http://192.168.1.11:5000"], // локальный репозиторий
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"], // доступ клиента
"storage-driver": "devicemapper",
"storage-opts": ["dm.thinpooldev=/dev/mapper/vg0-dockerpool",
. . .

"default-address-pools":               // диапазон IP для контейнеров
[{"base":"192.168.5.0/24","size":24}]  // вместо дефолтного 172.1[7-9].*.*

}

systemctl restart docker

# В RH7.3 атрибут "hosts" в daemon.json не совместим с systemd, поэтому для RH7.3
# в /etc/systemd/system/multi-user.target.wants/docker.service  исправить переменную
# ServiceExec=-H fd:// -H tcp://0.0.0.0:2376

docker -H tcp://127.0.0.1:2376 info # доступ клиента по сети из командной строки или
export DOCKER_HOST=tcp://127.0.0.1:2376


-t             --tty
-i             --interactive
-d             --backgorund (daemon mode)
--rm           remove after exit
--name name
-u user:group       задать uid и группу для docker-пользователя (вместо root)
--group-add group   дополнительная группа для docker-пользователя

docker run    --name busy1 -ti --rm busybox /bin/sh  # запуск контейнера в терминале
docker run -d --name  www1 nginx                     # запуск контейнера в бэкграунд

docker container ps     # стартованные контейнеры
docker container ps -a  # стартованные и остановленные контейнеры
docker container ps -aq # компактная выдача имен контейнеров

docker container top containername
docker container stats container1  container2  container3
docker container logs container1 -f # лог /var/lib/containers/cont*/cont_id...-json.log

docker exec www1 ip addr show   # старт команды в запущенном контейнере
docker container start www1     # оживить остановленный контейнер

docker container stop -t 20      www1  # сперва SIGSTOP, через 20 сек SIGKILL
docker container kill -s SIGSTOP www1  # послать в контейнер сигнал

docker container rm www1  # -f - удалить даже стартованный, -v вместе с volumes



docker container cp www1:/etc/nginx/nginx.conf  .
docker container cp www1:/etc/nginx/ .       # реккурсивно директорию
docker container cp data/   www1:/etc/nginx  # реккурсивно в директорию
docker container cp data/.  www1:/etc/nginx  # реккурсивно на директорию
docker container exec www1 ls -al /etc/nginx
docker container cp www1:/etc/  - > www1-etc.tar  # выгрузка в TAR
docker container cp - www1:/   < www1-etc.tar     # закачка из TAR



docker container info www1
docker container inspect www1 # полный и выборочный JSON
docker container inspect -f 'Container {{.Name}} has pid {{.State.pid}}' www1



image - образ корневой файловой системы контейнера, скачивается с репозитория
     состоит из layers - TAR-архивов смонтированных последовательно в union-fs
     последний слой - "песочница", обеспечивает RW

docker image history python # история формирования слоев в image

docker image ls
docker image rm nginx   # удалить image (если с него не созданы контейнеры)
docker rmi   -f nginx   # удалить image убив все созданные с него контейнеры

docker image rm rep.host.name/reponame/imagename

docker search строка     # искать по строка
docker search -s 3 ssh   # искать image ssh с 3 звездами

Списки версий (tags) имаджa ubuntu в репозитории
curl https://registry.hub.docker.com/v1/repositories/ubuntu/tags

# скачать image
docker image pull nginx
docker image pull nginx:latest
docker image pull fedora:22
docker image pull registry.hub.docker.com/fedora:23
docker image pull server1.example.com:5000/bcroft/proj_red:v2



docker diff www1 # распечатать содержимое "песочницы" - измененные файлы

# закоммитить текущий RW-слой контейнера в image tar-layer
docker container commit -a "Author" -m "Add service" mega_app:latest
docker commit -c 'CMD ["python", "app2.py"]' -c 'ENV ver=2'



Хост  имеет  дефолтный  бридж  docker0,  контейнер  получает  индивидуальный
интерфейс подключенный к docker0, в подсети бриджа.

Контейнер имеет прямую связь с другими контейнерами, и выход во внешнюю сеть
через роутинг+маскарадинг

   docker0            172.17.0.1/16
      container1:eth0    172.17.0.2/24
      container12:eth0   172.17.0.13/24

brctl show docker0

docker inspect -f '{{ .NetworkSettings.IPAddress }}' web1 # адрес контейнера

/etc/sysconfig/docker-network # IP docker0, диапазон IP для контейнеров
DOCKER_NETWORK_OPTIONS=
 --bip=172.17.0.1/16          IP бриджа docker0
 --fixed-cidr=172.17.0.0/16   диапазон IP для раздачи контейнерам
 --ip=0.0.0.0                 внешние порты контейнеров при пробросе биндить на этот IP



#   управление /etc/hosts, resolv.conf
 -h|--hostname=       Set container hostname
 --add-host=[]        Add extra entries to /etc/hosts
 --dns=[]             Specify DNS server for /etc/resolv.conf
 --dns-search=[]      DNS search path for resolv.conf

#   управление пробросом портов
 -p 8000:80           проброс контейнерного порта 80 на хостовой 8000
 -p 8000:IPaddress:80 проброс порта на внешний    IP:8000      /* не работает */
 -p :80               проброс порта на какой получится внешний порт
 -p 7514:514/udp      проброс контейнерного UDP-порта
 -P                   проброс всех экспознутых портов "куда-нибудь"

docker container port web1      # узнать куда пробрасываются порты
 443/tcp -> 0.0.0.0:32768
 80/tcp -> 0.0.0.0:32769

#   управление файрволлом и роутингом контейнеров во всем dockerd
dockerd \
 --iptables=true      Включать штатные iptables для контейнеров
 --icc=true           Inter-Container traffic is permitted
 --ip-forward=true    Роутить контейнер наружу
 --ip-masq=true       Маскарадить контейнерный IP
 --ip=0.0.0.0         IP хоста для биндинга пробрасываемых publish-портов


docker container run --net=bridge         nginx     # подцепиться в docker0
docker container run --net=none           nginx     # только localhost
docker container run --net=host     nginx    # работать с хостовым интерфейсом
docker container run --net=container:web1 nginx    # сеть другого контейнера

docker network create net1 # создать кастомный бридж

 --driver [bridge|overlay|macvlan]
 --scope  [swarm|local] кто может пользоваться этой сетью
 --ingress             дефолтная ingress-сетка для балансировщика в swarm
 --internal            не роутить overlay-сеть в интернет
 --subnet              задать подсеть бриджа
 --gateway             ip-бриджа
 --ip-range            диапазон, в котором назначаются IP контейнерам

docker network create \
 --subnet=192.168.50.0/24 --gateway=192.168.50.1   \
 --ip-range 192.168.50.128/27  \
 -o com.docker.network.driver.mtu=1400 \
 -о com.docker.network.bridge.host_binding_ipv4=0.0.0.0 \
 -o com.docker.network.bridge.name=docker_private01     \
 -o com.docker.network.bridge.enable_icc=true           \
 -o com.docker.network.bridge.enable_ip_masquerade=false \
 private01

# запустить контейнер, воткнув в кастомную сеть
docker container run --net=net1 --name web1   nginx
# прицепить к уже запущенному контейнеру web2 дополнительный интерфейс
docker network connect    net1  --ip 192.168.50.45  web2
docker network disconnect net1                      web2   # отцепить



В firewall на всех нодах кластера должны быть открыты порты:

tcp:2377        swarm-API
tcp,udp:7946    overlay-control-communication
udp:4789        overlay-transport

docker network create -d overlay --attachable my-overlay
      [ --opt encrypted ] добавить чтоб транспорт шифровался IPSEC

# пересоздание docker_gwbridge
docker network create \
 --subnet 10.200.0.0/16 \
 --opt com.docker.network.bridge.name=docker_gwbridge \
 --opt com.docker.network.bridge.enable_icc=false \
 --opt com.docker.network.bridge.enable_ip_masquerade=true \
 docker_gwbridge

# пересоздание ingress-сетки
docker network rm ingress
docker network create  --driver overlay --ingress \
  --subnet=10.11.0.0/16 --gateway=10.11.0.2 \
  --opt com.docker.network.driver.mtu=1200 \
  my-ingress



docker swarm init      # --advertise-addr 10.100.0.254:2377 чтоб слушать конкретный IP
docker swarm join-token worker        # показать токен для входа в swarm как worker
docker swarm join-token manager -q    # показать токен для входа в swarm как manager
# присоединение в swarm
docker swarm join --token токен... server1:2377 # управлялка swarm'oм садится на :2377
docker swarm leave                    # покинуть swarm
docker swarm init --force-new-cluster # оживить swarm, потерявший кворум

docker node ls            # список нод в swarm
docker node rm node-id    # удалить ноду из swarm
docker node demote  station12.example.com    # разжаловать в воркер'ы
docker node promote station12.example.com    # повысить в manager'ы

docker node update --avalability active      # можно запускать тут контейнеры
docker node update --avalability pause       # не запускать         (АКА quarantine)
docker node update --avalability drain       # не запускать и убить (AKA maintance)

docker service create -p 8080:80 --replicas 4 -name www3  apache
docker service rm www3


Популярность: 16, Last-modified: Wed, 07 Sep 2022 13:02:53 GMT