docker 컨테이너끼리 연결하는 방법이 궁금하신가요? 예전에는 컨테이너 간의 연결을 위해 docker –link 옵션을 이용했습니다. 하지만 이제는 docker network를 이용하셔야 합니다. 왜 그런지 그 이유를 살펴보고 docker network 사용방법을 알아보도록 하겠습니다.
목차
개요
Docker는 컨테이너를 구동할 때 내부 IP 주소를 사용하는데, 내부 아이피를 지정해서 사용하지 않으면 계속 변동되기 때문에, 컨테이너 간에 접근할 때 IP 주소를 사용하면, 해당 IP를 사용할 때에는 접속이 됩니다. 하지만 추후에 컨테이너를 다시 띄웠을 때 다른 IP 주소가 할당되면 접근할 수 없습니다. 따라서 컨테이너 이름을 호스트 이름으로 사용하는 편이 편리합니다.
docker –link 옵션
과거에는 docker –link 옵션을 사용해서 컨테이너를 서로 연결해 주었습니다. 이제는 docker network가 그 기능을 대신하고 있으므로 이제 –link 옵션은 deprecated 상태로 레거시(lagacy)입니다. docker 공식문서 (Lagacy) Container links에서 관련 내용에 대한 경고문을 띄워 놓았습니다.
언젠가 완전히 사라질 것이겠지만, 혹시나 과거 docker –link 옵션이 필요한 분을 위해 사용법을 적어두겠습니다.
docker run -d -P --name web --link db:db apps/webapp python app.py
ShellScript아래와 같이 –link <name or id>:alias의 형식으로 사용하면 됩니다. 이렇게 하면 새로 생성되는 web 컨테이너에서 db 컨테이너에 접근할 수 있습니다. web 컨테이너에서 db라는 호스트이름으로 접근할 수 있게 되는 거죠.
docker network 명령어
이제는 docker –link 옵션을 이용하기 보다는 docker network 명령어를 사용해서 user-defined network을 생성하고 이를 활용합니다. 마치 윈도우에서 WORKGROUP 이름을 지정하는 것과 비슷한 개념이라고 생각을 하시면 되겠습니다. 같은 WORKGROUP 내의 호스트끼리 서로 접근할 수 있는 것과 같은 개념입니다.
당연히 이렇게 만들게 되는 network는 docker compose에서 설정한 network 이름으로 지정해 주면 간단히 해결됩니다. 이와 관련한 예시는 docker-compose WordPress 세팅 – 1부. mariadb 설정 문서에 적어두었으니, docker compose 이용과 관련해서 궁금한 분들은 확인해 보시면 되겠습니다. 단, docker-compose.yml에서 네트워크를 설정하더라도 사용할 network는 반드시 만들어야 합니다. docker network 생성하는 방법 살펴보겠습니다.
docker network create: 도커 네트워크 생성
네트워크 설정을 위해서 우선 docker network를 생성해야 합니다. 그 후에 컨테이너를 띄울 때 해당 네트워크를 사용하도록 설정해 주면 됩니다. 특정 네트워크를 사용하는 컨테이너에서 접근하고자 하는 대상 컨테이너 이름을 호스트 이름을 통해서 접근할 수 있게 됩니다.
우선 도커 네트워크를 생성할 이름과 함께 아래와 같이 입력해서 네트워크를 생성합니다. 명령어는 docker network create 뒤에 생성할 네트워크 이름을 적어주면 됩니다. 저는 sample이라는 네트워크 이름을 만들어 보겠습니다.
docker network create sample
ShellScript네트워크 생성 명령을 내리면 아래와 같이 생성된 네트워크 id를 알려줍니다.
docker network ls: 도커 네트워크 리스트(목록)
현재 생성돼 있는 모든 네트워크 목록을 확인하는 방법으로 docker network ls 명령어가 있습니다. 새로 추가된 sample 네트워크가 있는지 확인해 보겠습니다.
docker network ls
ShellScript네트워크 목록 최하단에 새로 생성된 네트워크 sample을 확인할 수 있으며, 위에서 생성된 network id의 앞 12자리와 동일한 것을 볼 수 있습니다.
생성한 docker network 지정하기
이제는 특정 컨테이너를 실행할 때 사용할 네트워크를 지정해 주면 됩니다. mysql과 php-fpm을 컨테이너로 사용한다고 가정하고 아래와 같이 –network 옵션을 설정해 줍니다.
먼저 sample 네트워크를 이용해서 mysql 컨테이너를 띄워줍니다.
docker run ..... --name mysql --network sample mysql:5.x.x
ShellScript이제 sample 네트워크를 이용해서 php-fpm 컨테이너를 띄워줍니다.
docker run ..... --name php --network sample php:7.2-fpm
ShellScript이제 두 컨테이너는 서로의 호스트 이름을 이용할 수 있습니다. mysql의 경우에는 사용자를 추가할 때 php 컨테이너로부터의 접근만 허용하게 할 수 있으며, php 컨테이너는 mysql이라는 호스트명으로 DB에 연결할 수 있습니다.
그리고 이렇게 하면 해당 컨테이너의 해당 포트로 바로 접근 가능하므로 굳이 port를 호스트로 노출시켜가면서 힘들게 이용하지 않아도 됩니다.
ping 명령어로 연결 확인
이제 ping 명령어를 사용해서 mysql 컨테이너에 호스트 이름 mysql로 접근이 가능한지 확인해 보겠습니다. 응답이 잘 오고 있습니다.
Nginx 설정 예시
예를 들면, NGINX 컨테이너를 하나 더 띄워서 nginx.conf 에서 fastcgi를 설정하는 경우라면 php-fpm은 보통 9000번 포트를 사용하니 아래와 같이 설정해 주면 됩니다. 해당 서버 설정 구간에 다음과 같이 호스트명으로 잡아주면 됩니다. 바뀌는 IP 주소에 불안해 할 필요가 없습니다.
fastcgi_pass php:9000;
Nginx불필요한 네트워크 삭제
생성한 네트워크를 삭제할 때에는 docker network remove 명령어를 사용하면 됩니다. sample 네트워크를 제거해 보도록 하겠습니다.
docker network remove sample
ShellScript참고자료
도커 공식 문서 (Lagacy) Container links를 참고하시면 정말 Lagacy 버전의 도커를 사용해야만 하는 분들께는 도움이 될 것 같습니다.
그리고 Docker Networking 페이지에 가시면 docker에서의 network 이용과 관련된 상세한 내용을 확인할 수 있습니다.