docker-compose를 이용해서 DB 하나, 웹 서비스 3개, 백그라운드 서비스 1개까지 총 컨테이너 5개를 돌리는 작업을 하고 있다. 당연히 네트워크도 "space_network"라는 이름으로 별도로 설정 했고 아무 문제없이 잘 됐다. (Docker의 볼륨, 네트워크 같은 내부 객체 이름들은 대부분 해당 명령어가 실행된 폴더명을 prefix로 붙인다. 즉, 예를 들어 D:\Docker 폴더에서 실행되는 docker-compose.yml 안에 네트워크 이름을 "space_network"라고 쓰면 실제 네트워크 이름은 "docker_space_network"가 된다.)

그런데, 어느 순간 갑자기, 백그라운드 서비스 하나만(!) DB에 접속하지 못하는 희한한 상황이 발생했다.

뭐지? 그럴 리가 없는데... DB 서버 이름을 컨테이너 이름(mariadb)으로 했는데,
백그라운드 서비스에서만 갑자기 그걸 찾지 못하게 된 건가? 하면서 좀 찾아봤다.

먼저, Docker 환경(리눅스)에서는 ifconfig 같은 리눅스 기본 명령어를 쓸 수 없다. (경량화로 삭제?)

그대신 훨씬 더 강력하고 간편한 명령어를 제공한다.

호스트 환경에서 docker network inspect {네트워크 이름} 이라고 치면 전체 컨테이너의 네트워크 상태가 쭉 출력된다.

D:\Docker> docker network inspect docker_space_network

 

하나만 확인하고 싶을 때는 해당 컨테이너로 접속해서 ip addr show 명령어를 써도 같은 결과를 얻을 수 있다.

D:\Docker> docker exec -it mariadb /bin/bash
root@@1ba1222dcac6:/# 
root@@1ba1222dcac6:/# ip addr show

 

혹시나 컨테이너 이름이 문제인가 싶어 이렇게 확인된 IP 주소를 컨테이너 이름 대신 넣어봤다.

 

...

 

결과는 동일. 역시 안될 때는 안 된다.

뭐지??????

하다가, 그제서야 생각이 났다.

컨테이너 실행 순서!

DB 컨테이너보다 DB에 접속할 클라이언트 컨테이너가 먼저 실행되면 당연히 에러가 나는 것...

그 순간, 예전에 docker-compose 학습할 때 봤던,
Docker 컨테이너 실행 순서를 조정할 때 쓰는 무슨 대기하는 쉘 스크립트 명령어가 떠올랐다.

그런데, 그것보다 더 간단한 방법이 있었다!

>> 참조: https://docs.docker.com/compose/compose-file/#depends_on

 

Compose file version 3 reference

Reference and guidelines These topics describe version 3 of the Compose file format. This is the newest version. Compose and Docker compatibility matrix There are several versions of the Compose...

docs.docker.com

 

depends_on: 옵션을 걸어주면, 대상 컨테이너가 실행 상태(running)가 된 이후에 실행된다.

DB는 이 정도만으로 충분하다.

간단하게 해결!

 

 

그 밖에 다른 이유로 다른 컨테이너나 다른 서비스 포트가 확실히 오픈된 이후에 실행되도록 하려면 아래 링크를 참조하면 된다. wait-for-it.sh 스크립트 사용으로 대기하게 하는 건데... 살짝 귀찮지만 언젠가 쓸 일이 있을 지도.

>> 참조: https://docs.docker.com/compose/startup-order/

 

Control startup and shutdown order in Compose

You can control the order of service startup and shutdown with the depends_on option. Compose always starts and stops containers in dependency order, where dependencies are determined by depends_on, links,...

docs.docker.com

 

끝.

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]