Docker - Container Network

우야·2021년 8월 12일
0

Container간 network통신을 하려고 할때, 어떻게 해야 할까?

이 부분은 하나의 앱이 있는데, Server 역할로 실제 비지니스 로직을 담은 A Container와 이 Container가 사용하는 DB Container가 있다고 가정할 수 있다.

이 때, Todo App과 MySQL Container는 하나의 Network안에 있게 하며, 통신을 할 수 있어야 한다.

  1. Network을 생성
$ docker network create todo-app
  1. MySQL Container 실행
    • 이 때 network로 todo-app을 사용하는것으로 지정하고,
    • 해당 todo-app network안에서 MySQL Container의 이름은 network-alias로 인해서 mysql로 지정된다.
 docker run -d \
     --network todo-app --network-alias mysql \
     -v todo-mysql-data:/var/lib/mysql \
     -e MYSQL_ROOT_PASSWORD=secret \
     -e MYSQL_DATABASE=todos \
     mysql:5.7
  1. 다른 Container를 띄워서 MySQL의 Network 상태를 확인할 수 있다.
    • nicolaka/netshoot은 dig를 사용하여 host 이름에 대한 ip주소를 조회할 수 있는 Container이다.
    • 아래와 같이 dig mysql을 실행하면 172.23.0.2로 mysql의 ip주소를 조회할 수 있다.
$ docker run -it --network todo-app nicolaka/netshoot
... 접속

$ dig mysql

... 결과
 ; <<>> DiG 9.14.1 <<>> mysql
 ;; global options: +cmd
 ;; Got answer:
 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162
 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

 ;; QUESTION SECTION:
 ;mysql.				IN	A

 ;; ANSWER SECTION:
 mysql.			600	IN	A	172.23.0.2

 ;; Query time: 0 msec
 ;; SERVER: 127.0.0.11#53(127.0.0.11)
 ;; WHEN: Tue Oct 01 23:47:24 UTC 2019
 ;; MSG SIZE  rcvd: 44
  1. todo App을 실행하여 mysql에 접속할 수 있다.
    • App Container에서는 MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB라는 환경변수를 기반으로 MySQL에 접속하는 로직이 있다.
    • 이때, --network todo-app의 명령어로 MySQL과 같은 network를 사용하게 되며, MYSQL_HOST=mysql를 활용하여 MySQL의 network alias인 mysql로 접속 할 수 있는것이다.
$  docker run -dp 3000:3000 \
   -w /app -v "$(pwd):/app" \
   --network todo-app \
   -e MYSQL_HOST=mysql \
   -e MYSQL_USER=root \
   -e MYSQL_PASSWORD=secret \
   -e MYSQL_DB=todos \
   node:12-alpine \
   sh -c "yarn install && yarn run dev"
profile
Fullstack developer

0개의 댓글