
Использование статического 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» завершена.