2015-10-08 2 views
20

Я использую docker-compose для создания полного стека разработки.Как обращаться с IP-адресами при соединении контейнеров-докеров друг с другом с помощью компоновки докеров?

Для работы приложения требуется сервер mysql.

Сервер MySQL является внешней установкой контейнера с помощью докер-композа:

mysql: 
    image: mysql:5.6 
    volumes: 
     - /data/mysql:/var/lib/mysql 
     - ./docker/mysql.d:/etc/mysql/conf.d 
    ports: 
     - "3306:3306" 
    environment: 
     MYSQL_ROOT_PASSWORD: password 

Приложения имеет свой собственный Докер-compose.yml и ссылается на MySQL контейнер:

my-application: 
    build: . # the Dockerfile resides in the current folder 
    ports: 
     - "9180:80" 
     - "9543:443" 
    external_links: 
     - mysql_mysql_1:mysql 
environment: 
    DOCKER_ENVIRONMENT: dev 
    DB_NAME: local_db 
    DB_PASS: password 
    DB_USER: root 
    DB_HOST: # how to set the mysql's IP address? 

Я не могу пройти их в докер-сочинении, так как он динамичен.

Я знаю, что приложение знает о IP-адрес MySQL, поскольку у меня есть определенные переменные, заданные:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241 

Но это не моя требуется DB_HOST.

Могу ли я сопоставить переменную как-то с DB_HOST или установить ее по-другому?

+1

Почему ваш сервер mysql находится на внешнем файле docker-composer.yml? Это действительно требуется? Обычно, если у вас есть контейнеризованные приложения, которые нужно запускать вместе, вам нужно настроить только один файл docker-composer.yml. – nessuno

+0

@nessuno Я хочу использовать этот контейнер mysql для нескольких проектов. Мне не нужны 12 серверов mysql.Кроме того, я сопоставляю данные mysql с большим жестким диском, расположенным в '/ data/mysql', поскольку база данных mysql может стать довольно массивной. Если у вас несколько экземпляров mysql, сопоставленных с одной и той же папкой, приведет к проблемам с блокировкой файловой системы. – k0pernikus

+1

Вы можете поместить конфигурацию контейнера mysql вместе с вашим приложением, вам нужно всего лишь запустить docker-compose с флагом '--no-rereate', я думаю. После этого у вас есть только один контейнер mysql, и вы можете ссылаться на этот контейнер непосредственно в файле docker-compose.yml, используя свое имя. Таким образом, сделайте 'DB_HOST: mysql'. – nessuno

ответ

24

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

Это означает, что вы действительно можете установить DB_HOST внутри docker-compose.yml, либо с links (рекомендуется) или external_links:

your_application: 
    build: . 
    ports: 
     - "9180:80" 
     - "9543:443" 
    external_links: 
     - mysql_mysql_1:docker-mysql 
    environment: 
     DB_HOST: docker-mysql 

Как и при подключении к Docker контейнера, вы можете подключиться к тузд контейнера:

application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360 

Он работает так же, когда вы связываете контейнер с тем же докере-composer.yml.

Это также documented:

Ссылка на контейнеры в другую службу. Либо укажите имя службы и псевдоним ссылки (SERVICE: ALIAS), либо просто имя службы (которое также будет использоваться для псевдонима).

links: 
- db 
- db:database 
- redis 

Запись с именем псевдонимом будет создан в/и т.д./хостов внутри контейнеров для данной услуги, например: также будет создан

172.17.2.186 db 
172.17.2.186 database 
172.17.2.187 redis 

Переменные среды - см environment variable reference подробности ,

+2

Будьте осторожны. На сегодняшний день с версией 2 файла-файла для док-станции ссылка на переменную окружения больше не создается. см. https://docs.docker.com/compose/link-env-deprecated/ –

+0

@MartinGOYOT Это правда. В версии 2 контейнеры должны иметь возможность подключаться друг к другу из коробки, хотя из-за изменения сети. Я проверю, могу ли я добавить пример версии 2. Если вы сейчас только создаете его, вы также можете опубликовать новый ответ для версии 2. – k0pernikus

+0

хорошо ваш ответ хорошо работает на версии 2. Я только говорил об этом в отношении «Переменные среды также будут созданы - подробнее см. ссылку на переменную окружения ». –

Смежные вопросы