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
depends_on: 옵션을 걸어주면, 대상 컨테이너가 실행 상태(running)가 된 이후에 실행된다.
DB는 이 정도만으로 충분하다.
간단하게 해결!
그 밖에 다른 이유로 다른 컨테이너나 다른 서비스 포트가 확실히 오픈된 이후에 실행되도록 하려면 아래 링크를 참조하면 된다. wait-for-it.sh 스크립트 사용으로 대기하게 하는 건데... 살짝 귀찮지만 언젠가 쓸 일이 있을 지도.
>> 참조: https://docs.docker.com/compose/startup-order/
끝.
'Tech: > Server·IIS' 카테고리의 다른 글
ARR: URL 재작성(rewrite) 팁 (0) | 2020.12.15 |
---|---|
ASP.NET Core의 JsonSerializer(System.Text.Json) 사용 관련 (0) | 2020.08.14 |
Docker 컨테이너 시간을 UTC+09:00로 설정하기 (0) | 2020.08.11 |
Windows Server Core 유용한 팁 (0) | 2020.07.09 |
Exchange EdgeSync 인증서 교체 (0) | 2020.06.25 |