Использование статического IP адреса в docker-compose
Docker – очень крутое решение для создание отдельных контейнеров для каждого из приложений.
Docker-compose — это утилита для работы с docker контейнерами, которая позволит вам построить лучшую оркестровку с ними (например иметь статический IP-адрес в контейнере(ах) ). Но в данной статье «Использование статического IP адреса в docker-compose» речь пойдет о том как создавать статические IP для контейнера(ов).
Почитав документацию, я нашел следующее решение:
networks:
bridge:
driver: bridge
ipam:
config:
- subnet: 172.10.0.0/16
gateway: 172.10.5.254
aux_addresses:
nginx: 172.10.1.2
php: 172.10.1.3
db: 172.10.1.4
И это позволяет мне указать статические адреса для моих контейнеров с помощью docker-compose.yaml файла.
Вот мой полный пример этого файла:
version: "2"
services:
nginx:
image: nginx:latest
environment:
NGINX_SERVER_NAME: docker_machine.local
container_name: lemp_nginx
restart: always
links:
- php
volumes:
- ./DATA/html:/var/www/html/:ro
- ./DATA/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./DATA/nginx/conf.d:/etc/nginx/conf.d:ro
ports:
- 80:80
- 443:443
networks:
- bridge
php:
image: php:latest
container_name: lemp_php
restart: always
volumes:
#- ./DATA/php-fpm/site.conf:/usr/local/etc/php-fpm.d:ro
- ./DATA/html:/var/www/html
depends_on:
- db
links:
- db
networks:
- bridge
environment:
- DB_NAME=lemp_magento
- TABLE_PREFIX=lemp_
- DB_HOST=lemp
- DB_PASSWORD=magento
- PHP_HOST_NAME=localhost:9000
db:
image: mariadb:latest
container_name: lemp_mariadb
restart: always
volumes:
#- ./DATA/mariadb/my.cnf:/etc/mysql/my.cnf:ro
- db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root666PW
networks:
- bridge
volumes:
db-data:
driver: local
networks:
bridge:
driver: bridge
ipam:
config:
- subnet: 172.10.1.0/16
gateway: 172.10.1.1
aux_addresses:
nginx: 172.10.1.10
php: 172.10.1.20
db: 172.10.1.30
Покажу еще один пример использования:
version: '2'
services:
app:
image: busybox
command: ping linux-notes.org
networks:
app_net:
ipv4_address: 10.0.0.10
webapp:
image: busybox
command: ping www.linux-notes.org
network_mode: service:app
networks:
app_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.0.0.0/24
gateway: 10.0.0.1
Можно создать бридж и вручную, а об этом я расскажу ниже.
Создать новой Docker Bridge Network
Посмотрим имеющиеся сети:
# docker network ls
Вывод:
┌(vagrant@vagrant-ansible)─(✗)─(03:46 pm Sun Feb 05) └─(~/magento2)─(5 files, 8.0Kb)─> sudo docker network ls NETWORK ID NAME DRIVER SCOPE fdbe53a6094b bridge bridge local 75f532ba432e host host local b704f856d986 none null local ┌(vagrant@vagrant-ansible)─(✓)─(03:47 pm Sun Feb 05) └─(~/magento2)─(5 files, 8.0Kb)─>
Докер создает три сети для каждого хоста автоматически:
- bridge — Сеть по умолчаянию для подключения контейнеров — это docker0 сеть (network) во всех docker установках.
- none — Container-specific networking stack
- host — Добавляет контейнер на hosts networking стек. Сетевая конфигурация идентична хосту.
Создаем новую сеть (network) для нашего докера:
# docker network create -d bridge NetWork
aa5d365b8a6efae6d6f704e17565f1db890e96f47356e4931a9bab80d972d6cd
Где, NetWork — это название сети.
Еще раз смотрим список сетей:
$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE aa5d365b8a6e NetWork bridge local fdbe53a6094b bridge bridge local 75f532ba432e host host local b704f856d986 none null local
Как видно с вывода, NetWork — создалась и ее можно использовать. В моем случае это — bridge ( мост).
Проверяем созданную сеть с помощью:
$ sudo docker network inspect NetWork
И, получаем вывод:
[
{
"Name": "NetWork",
"Id": "aa5d365b8a6efae6d6f704e17565f1db890e96f47356e4931a9bab80d972d6cd",
"Created": "2017-02-05T15:58:34.705436228Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Как можно было увидеть из моего вывода, что ни один контейнер не назначен для этой сети. Я описывал как это сделать. Но под руку попался еще один пример, я сейчас расскажу о нем.
Открываем:
# vim docker-compose.yml
Прописываем:
version: "2"
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
volumes:
- ./DATA/html:/var/www/html/:ro
- ./DATA/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./DATA/nginx/conf.d:/etc/nginx/conf.d:ro
ports:
- 80:80
- 443:443
networks: ${NETWORK}
И чтобы запустить, выполняем:
NETWORK=NetWork docker-compose up -d
Вот и все, тема «Использование статического IP адреса в docker-compose» завершена.