2015-10-08 12 views
20

Używam funkcji docker-compose do budowania kompletnego stosu programistycznego.Jak obsługiwać adresy IP podczas łączenia kontenerów dokerów ze sobą za pomocą funkcji dokowania?

Aplikacja wymaga do działania serwera mysql.

serwera MySQL jest zewnętrznym Konfiguracja pojemnika przez Döcker-Compose:

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 

Aplikacja posiada własną Döcker-compose.yml i odwołuje się do kontenera 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? 

nie mogę przejść je w docker-compose, ponieważ jest dynamiczny.

wiem, że aplikacja jest świadomy adres IP mysql, jak mam pewne zmienne Zestaw:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241 

Jednak to nie jest mój wymagane DB_HOST.

Czy mogę zmapować zmienną w jakiś sposób na DB_HOST lub ustawić inaczej?

+1

Dlaczego twój serwer mysql znajduje się w zewnętrznym pliku dokowanego-composer.yml? Czy to naprawdę jest wymagane? Zwykle, jeśli masz aplikacje kontenerowe, które muszą działać razem, musisz skonfigurować tylko jeden plik dokowany-composer.yml. – nessuno

+0

@nessuno Chcę użyć tego kontenera mysql dla wielu projektów. Nie potrzebuję 12 latających serwerów mysql.Co więcej, mapuję dane mysql na mój duży dysk twardy znajdujący się na '/ data/mysql', ponieważ baza danych mysql może stać się całkiem masywna. Jeśli masz wiele instancji mysql zmapowanych do tego samego folderu, może to prowadzić do problemów z systemem plików. – k0pernikus

+1

Możesz umieścić konfigurację kontenera mysql razem ze swoją aplikacją, po prostu musisz tylko uruchomić kompilację dockera z flagą '--no-recreate', jak sądzę. Po tym czasie masz tylko jeden kontener mysql i możesz odwołać się do tego kontenera bezpośrednio w pliku docker-compose.yml, używając jego nazwy. W ten sposób utwórz 'DB_HOST: mysql'. – nessuno

Odpowiedz

24

Nie musisz ustawiać adresu IP, ale możesz odwoływać się do wirtualnej nazwy hosta kontenera , która ma tę samą wartość, co nazwa połączonego kontenera.

Oznacza to, że można rzeczywiście ustawić DB_HOST od wewnątrz docker-compose.yml, albo z links (zalecane) lub external_links:

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

Jak po podłączeniu do pojemnika Döcker, można podłączyć do pojemnika mysql:

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

Działa to samo, gdy łączysz kontener z tego samego pliku docker-composer.yml.

Jest również documented:

Link do pojemników w innej usługi. Podaj zarówno nazwę usługi , jak i alias łącza (SERVICE: ALIAS) lub nazwę usługi (która będzie również używana dla aliasu).

links: 
- db 
- db:database 
- redis 

Wpis z nazwą aliasu zostanie utworzony w katalogu/etc/hosts wewnątrz pojemników dla tej usługi, np:

172.17.2.186 db 
172.17.2.186 database 
172.17.2.187 redis 

Zmienne środowiskowe również zostaną utworzone - patrz environment variable reference szczegóły .

+2

Należy zachować ostrożność, Od dzisiaj w wersji 2 pliku do tworzenia dokowanego, odniesienie do zmiennej środowiskowej nie jest już tworzone. zobacz https://docs.docker.com/compose/link-env-deprecated/ –

+0

@MartinGOYOT To prawda. W wersji 2 kontenery powinny być w stanie połączyć się ze sobą po wyjęciu z pudełka, ale z powodu zmienionej sieci. Sprawdzę, czy mogę dodać przykład w wersji 2. Jeśli jesteś w trakcie jego tworzenia właśnie teraz, możesz też opublikować nową odpowiedź dla wersji 2. – k0pernikus

+0

Dobrze, że twoja odpowiedź działa dobrze w wersji 2. Mówiłem to tylko w odniesieniu do "Zmienne środowiskowe również zostaną utworzone - zobacz szczegóły zmiennej środowiskowej. " –

Powiązane problemy