Использование статического IP адреса в docker-compose

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

Докер создает три сети для каждого хоста автоматически:

  1. bridge — Сеть по умолчаянию для подключения контейнеров — это docker0  сеть (network)  во всех docker установках.
  2. none — Container-specific networking stack
  3. 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» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.