Menu
Docker - первый опыт

Docker - первый опыт

 

Установка Windows server 2019.

 

Сразу после установки сконфигурировать основные параметры системы (имя, адрес, RDP и тд)

> sconfig

Быстро установить IP и тд можно из PS:

>netsh interface ipv4 show config
>netsh interface ipv4 set address name="vEthernet (Ethernet)" static 10.10.10.145 255.255.255.0 10.10.10.1
>netsh interface ip set dns "vEthernet (Ethernet)" static 8.8.8.8

, где "vEthernet (Ethernet)"  - интерфейс вывода netsh interface ipv4 show config

Для управления через WWW можно установить WAC

PS> Start-BitsTransfer -Source http://10.10.10.5/soft/WindowsAdminCenter2009.msi -Destination C:\Windows\Temp\wac.msi
PS> msiexec /i C:\Windows\Temp\wac.msi /qn /L*v log.txt SME_PORT=443 SSL_CERTIFICATE-OPTION=generate

Можно отключить firewall на время эксперементов

PS>  Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled false

И дефолтный антивирус

PS>  Uninstall-WindowsFeature Windows-Defender

Добавить нового пользователя "ork" и завести его в группу администраторов

PS> New-LocalUser -Name "ork"
PS> Add-LocalGroupMember -Group “Administrators” -Member ork

И перезапустить сервер по завершении конфигурации

PS> Restart-Computer

Если установка выполняется на WM под HYPER-V, то необходимо включить вложенную виртуализацию скриптом:

#replace with the virtual machine name
$vm = ""

#configure virtual processor
Set-VMProcessor -VMName $vm -ExposeVirtualizationExtensions $true -Count 2

#disable dynamic memory
Set-VMMemory -VMName $vm -DynamicMemoryEnabled $false

#enable mac spoofing
Get-VMNetworkAdapter -VMName $vm | Set-VMNetworkAdapter -MacAddressSpoofing On

 

 

Установка docker 

 

Документ:  https://docs.microsoft.com/ru-ru/virtualization/windowscontainers/deploy-containers/deploy-containers-on-server

Установить роли: hyper-V, контейнеризации

PS>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
PS>Enable-WindowsOptionalFeature -Online -FeatureName containers

 

Установить сам docker 

PS>Install-PackageProvider -Name nuget -force
PS>Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
PS>Install-Package -Name docker -ProviderName DockerMsftProvider
PS>Restart-Computer

Установить docker-compose

PS>[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

PS>Invoke-WebRequest "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFiles\Docker\docker-compose.exe
-test
PS>docker-compose --version

Настроить дефолтную сеть NAT, чтобы ее адресаци не прыгала при перезапуске сервера (полезно, если контейнерам присваиваются IP)

PS>stop-service docker
В ветке реестра  HKEY_LOCAL_MACHINE - SYSTEM - CurrentControlSet - Services - Tcpip - Parameters - Interfaces найти по текущему IP и удалить сеть дефолтного NAT. (Get-ContainerNetwork  | Remove-ContainerNetwork - на моей версии уже не работает )

Создать, если отсутствует, файл C:\ProgramData\docker\config\daemon.json с минимальным наполнением, указав желаемую адресацию сети nat:

{
"fixed-cidr": "10.10.10.1/24",
}

Перезапуститься

PS>Restart-Computer

 

Основные примеры работы с docker

 

Версия docker 

>docker -v

Показать список имиджей

>docker images

Загрузить определенный имидж определенной версии

>docker pull mcr.microsoft.com/windows/nanoserver:1903

Посмотреть список запущеных контейров (-a   - всех контейнеров)

>docker ps   

Запустить контейнер

>docker run microsoft/iis

Запустить контейнер с имененм container2, пробросом порта 82 наружу,запуском после перезагрузки хоста, установленным IP 10.10.10.102 и включить в сеть nat

>docker run -itd --name container2 -p 82:80 --net nat --restart always --ip 10.10.10.102 microsoft/iis ping -t localhost 

Подключиться к запущенному контейнеру container2  (выходить желательно вводя exit)

>docker exec -i -t container2 cmd

Узменить настройки контейнера

>docker update container2 --net nat --ip 10.10.10.202

Посмотреть настройки контейнера

>docker inspect container2 

Запустить контейнер

>docker start container2 

Остановить контейнер

>docker stop container2 

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

>dcoker rm container2 

Удалить имидж

docker rmi microsoft/iis

 

Сети в docker

 

Контейнерные сети в windows и linux НЕ ПОХОЖИ, поэтому рассматриваются отдельно

Windows

Документ: https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/network-drivers-topologies

Есть сети nat, transparent, overlay, L2Bridge, L2Tunnel.

Nat - дефолтная сеть. Пакеты натируются через интерфейс хоста.

>docker network create -d nat --subnet=10.10.10.0/24 docker-lan-nat

Transparent - прозрачная

>docker network create -d transparent --subnet 10.10.50.0/24 --gateway 10.10.50.1 -o com.docker.network.windowsshim.vlanid=7 -o com.docker.network.windowsshim.dnsservers="10.10.50.3" docker-lan-transparent

и так далее.

Стоит отметить, что после перезагрузки хоста мы с удивлением и негодованием отмечам пропадания всех созданных сетей, кроме дефолтной nat, overlay сетей и недокументированных private сетей, а также смену subnet IP у дефолной сети nat. Как это исправить описано выше.

 

Overlay сеть будет рассмотрена в рамках раздела SWARM.

Linux

Всё проще и понятней (без подводных камней).

# (Default. Сеть автономных контейнеров, которые должны взаимодействовать)
docker network create -d bridge --subnet=10.10.20.0/24 docker-lan-bridge
# (сеть автономных контейнеров, без доступа к хосту)
docker network create -d host --subnet=10.10.30.0/24 docker-lan-host
# (как bridge + связь нескольких докеров и их контейнеров. swarm)
docker network create -d overlay --subnet=10.10.40.0/24 docker-lan-overlay
# (сеть с назначенными MAC контейнерам. Можно выставлять в физическую сеть как хост)
docker network create -d macvlan --subnet=10.10.50.0/24 docker-lan-macvlan
# (сеть без сетевого взаимодействия)
docker network create -d none --subnet=10.10.60.0/24 docker-lan-none

Подключение контейнера к сети
>docker network connect --alias host1 --ip 10.10.10.202 nat container2
Отключение контейнера
>docker network disconnect nat container2

 

SWARM (рой)

Кластеризация контейнеров.

Понятие контейнера как такового отсутствует. Есть сервисы и их таски.

Сети внутри роя - типа overlay (для всех операционных сетей). 

Создание роя.

>docker swarm init --advertise-addr=10.10.10.145 --listen-addr 10.10.10.145:2377

, при создании появится подсказка для подключения ноды в рой:

>docker swarm join --token SWMTKN-1-2q421at8pal8xg73dwlozqeehfvw7xcduei484w67r813eireq-e51nr07hc2im6zi8xcjbq3p8b 10.10.10.145:2377

Список swarm нод и статусов
>docker node ls
Сделать ноду менеджером управления
>docker node update --role manager
вывод ноду из роя
>docker swarm leave

Создание сервиса

>docker service create --name service1 --network docker-lan-overlay -p 81:80  microsoft/iis

По умолчанию при создании роя создается сеть ingress для внутриройного управления сервисами и тд.

Можно создать собственную overlay сеть для взаимодействия между сервисами, в том числе, расположенными на разных нодах.

>docker network create -d overlay --attachable --subnet 100.10.40.0/24 docker-lan-overlay

Отдельно нужно отметить, что если Вы мечтаете идентифицировать сервисы внутри оверлэй сети на ноде под управлением Windows server, то будьте готовы к тому, что после перезагрузки встроенный DNS превращается в тыкву - неверно резослвит имя сервиса в IP запущенного таска. Возможно со временем это пофиксят.

 

Portainer

 

Иструмент управления docker из WEB интерфейса.

По прежнему не всё радостно в windows королевстве.

Устанавливать portainer пришлось так

Создание volume:

>docker volume create portainer_data

Выкачивание имиджа -ce:
>docker pull portainer/portainer-ce

Перезапуск хоста:

PS>Restart-Computer

Запуск контейнера:
>docker run -d -p 9000:9000 --name portainer --network docker-lan-nat --restart always -v  \\.\pipe\docker_engine:\\.\pipe\docker_engine' --isolation hyperv -v portainer_data:C:\data portainer/portainer

В противном случае, докер пытается выкачать не тот образ и portainer не запускается с ошибкой несовместимости хостовой системы.

В режиме роя требуется запуск агента portainer и самого portainer, но сделать это корректно из-за вышеописанной проблемы мне не удалось.

 

 

 

 

Текущие проблемы.

 

Сравнение организации сетей на Wind Server 2019 и Linux

  Windows Linux
Сохранение сетей нет (кроме дефолт.NAT и overlay да
Доступность контейнера
с хоста по IP
только дефолтный nat да
Сохранение ip контейнера
(не overlay) после reboot
нет (сети пропадают) да (не overlay)
Корректная работа
DNS в overlay
нет да

Отработка смешанного windows + linux SWARM, где win19 server был leader и был перезапущен, приводит в смещению лидера на Linux и дальнейшему разрушению кластера.

 

..to be continued 

 

 

Надеюсь кому-то это всё будет полезным.

[tags]docker,windows,linux,hyper-V,swarm,portainer,container[/tags]

 Lisolog (C) / 2021