Docker 네트워크 설정 변경하기
지난 포스팅에서 Docker 네트워크를 잡아주지않고 default설정으로 올렸더니
localhost로 DB접근이 불가능했었다. 결국 내 IP를 입력하여 문제를 해결하긴 했지만, 네트워크설정을 변경하여 문제를 해결하는 방법이 있다고 해서 시도해보려고한다.
우선 Docker 네트워크 종류부터 알아보자
- bridge : docker0라는 네트워크 브릿지에 각 컨테이너마다 고유한 네트워크 영역이 하나씩 생성되며, docker0브릿지에 컨테이너의 네트워크가 하나씩 바인딩 되는 구조
- host : 컨테이너가 독립적인 네트워크 영역을 갖지 않고 호스트와 네트워크를 함께사용하게 된다.
- overlay : 네트워크 안에 있는 여러개의 docker daemon간의 통신을 관리하는 가상의 네트워크
내 컨테이너가 bridge 네트워크로 구성되어 있어서 localhost를 입력해도 docker0의 ip가 바인딩된 것 같다.
그렇다면 docker의 네트워크를 host로 변경하면 localshost로도 연결이 될까??
우선 컨테이너들의 네트워크를 확인해보자
역시나 airflow는 bridge로 연결되어 있다.
단일 컨테이너면 --network옵션을 포함시켜서 명령어로 치면되는데 내 컨테이너들은 docker-compose로 구성되어있어서 다른 설정이 필요했다.
compose 파일 상단 환경 설정 부분에 해당 명령어를 추가했다.
network_mod : host
네트워크 모드를 단순히 bridge에서 host로 바꾸는 거라 잘 작동할 거라 생각했는데 에러가 발생했다.
"airflow-webserver Published ports are discarded when using host network mode "
네트워크가 호스트임에도 포트포워딩을 해줘서 그런것 같아서 각 컨테이너의 포트 포워딩부분을 주석처리한 후 진행했다. 이번에는 위 에러가 발생하지는 않았지만 airflow-init 단계에서 진행되지 않았고 sqlalchemy쪽에서 에러가 발생한 것 같았다.
네트워크를 host로 바꾸면서 각각의 컨테이너들이 연결되는 것이 아닌 독립적으로 host네트워크에 연결되어서
컨테이너간 통신이 원활하게 진행되지 않았던 것 같다.
당장 docker-compose파일을 수정하기는 어려울 것 같아서 단일 컨테이너로 network 설정을 바꿔봤다.
docker run --network host --name test python:3.8
우선 컨테이너를 만들어주고 이 컨테이너의 network 연결을 확인해봤다.
docker container inspect test
정상적으로 host로 잡혀있다. compose로 컨테이너를 올릴때는 컨테이너를 한꺼번에 올리고 같은 네트워크로 묶어줘서 편리했지만 네트워크 설정을 바꿔주는 건 다소 복잡한 것 같다.
마치며
이번에 네트워크 설정을 하면서 centos이미지나 python이미지로 컨테이너를 만들면 바로 종료될까? 란 의문이 들었는데
알고보니 컨테이너는 Virtual Machine같은 한 서버환경이 아니라 명령을 실행하는 한 환경이고 명령을 이행시켜줄 뿐이라는걸 알게되었다... 여태까지 컨테이너에 대해 다르게 생각하고있었고, 여전히 모르는게 많다는걸 느끼게되었다.