https://habr.com/ru/companies/domclick/articles/566224/
https://beget.com/ru/kb/how-to/vps/kak-obojti-blokirovku-docker-hub
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
Обходим блокировку на docker-hub (3 способа)
### 1. /etc/systemd/system/docker.service
Environment="HTTP_PROXY=http://proxy-example.com:3128"
Environment="HTTPS_PROXY=http://proxy-example.com:3128"
### 2. /etc/docker/daemon.json # альтернативные реестры
"registry-mirrors": [
"https://dockerhub.timeweb.cloud",
"https://dockerhub1.beget.com",
"https://mirror.gcr.io"
]
### 3. Локальный прокси-registry
docker run -d -p 5000:5000 \
-e REGISTRY_PROXY_REMOTEURL=https://dockerhub.timeweb.cloud \
-e REGISTRY_PROXY_REMOTEURL="https://mirror.gcr.io" \
-v /var/lib/registry:/var/lib/registry \
--restart always --name registry registry:2
/etc/docker/daemon.json :
,"insecure-registries": ["192.168.1.0/24","127.0.0.1"]
,"registry-mirrors": [ "127.0.0.1:5000" ]
-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 # стартованные контейнеры [ long format ]
docker container ps -a # стартованные и остановленные контейнеры
docker container ps -aq # компактная выдача имен контейнеров
docker container ps -l # вывести последний контейнер
docker container ps -n 3 # вывести 3 последних контейнера
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 exec -ti www1 /bin/sh # старт shell'a в запущенном контейнере
docker container attach -ti nginx # подключиться к консоли контейнера
^P^Q # отключение от терминала
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 library # имаджи в репозитории "library"
docker search строка # искать по строка
docker search -s 3 ssh # искать image ssh с 3 звездами
# список имаджей в registry
curl -X GET http://192.168.1.4:5000/v2/_catalog
# Списки версий (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
# экспорт/импорт контейнера в image в однослойном формате
docker container export container42 > container42.tar
docker image import - myapp:latest < container42.tar
docker container export container42 | tar x
tar c . | docker image import - myapp:v2.1 # текущую директорию в image
# выгрузка/загрузка image со всеми слоями
docker image save agentapp:v47 | gzip > agent47.tgz
docker image load -i agent47.tgz
# отгрузка image в registr
docker image tag app_dev server1:5000/bcroft/app_prod:myver # проименовать
docker login server1:5000 # залогиниться эккаунтом bcroft
docker image push bcroft/app_prod
docker diff www1 # распечатать содержимое "песочницы" - измененные файлы
# закоммитить текущий RW-слой контейнера c1 в image
docker container commit -c 'CMD ["python", "app2.py"]' -c 'ENV ver=2' c1 mm:v2
docker container commit -a "Author" -m "Add service" c1 mydev:v1
# отгрузить зафиксированный image в registry в repo-studentX
docker image tag mydev:v1 server1:5000/studentX/mydev:v1
docker image push server1:5000/studentX/mydev:v1
Хост имеет дефолтный бридж 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
Сетевые опции для container run
# управление /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
# Локальный registry в режиме proxy
docker run -d -p 5000:5000 \
-e REGISTRY_PROXY_REMOTEURL=https://dockerhub.timeweb.cloud \
-e REGISTRY_PROXY_REMOTEURL=https://dockerhub1.beget.com \
-e REGISTRY_PROXY_REMOTEURL=https://mirror.gcr.io \
-e REGISTRY_PROXY_REMOTEURL=https://cr.yandex/mirror \
--restart always --name registry registry:2
# Registry запущенный в режиме "proxy" не может принимать push имаджей.
# гасим proxy, запускаем persist, пушим в него имаджи, гасим, запускаем proxy
# run proxy registry persisting images with VOLUME on local host
docker stop registry ; docker rm registry
docker run -d -p 5000:5000 -v /var/lib/registry:/var/lib/registry \
--restart always --name registry registry:2
docker push localhost:5000/your-image:your-tag
# re-run the registry as proxy, re-mounting VOLUME with the images
docker stop ; docker rm registry
docker run -d -p 5000:5000 -v /var/lib/registry:/var/lib/registry \
-e MIRROR_SOURCE=https://registry.example.net \
-e REGISTRY_PROXY_REMOTEURL=https://registry.example.net \
-e REGISTRY_PROXY_USERNAME="${REGISTRY_USER}" \
-e REGISTRY_PROXY_PASSWORD="${REGISTRY_PASSWORD}" \
--restart always --name registry registry:2
Популярность: 28, Last-modified: Wed, 31 Dec 2025 17:16:29 GmT