Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

도커 이미지는 보통 응용소프트웨어 별로 생성한다.소프트웨어별로 이미지를 응용 소프트웨어 별로 생성하고 컨테이너를 생성하게 실행하게 되면,

서로간의 통신이 많아지고 데이터를 주고 받아야 한다.

도커 링크(link) 는 같은 호스트에 있는 컨테이너들끼리 통신할 수 있는 방법중 하나..

컨테이너간의 통신은 내부 도커 네트워크를 통해서 이루어짐.

즉, 통신은 호스트의 네트워크로는 노출되지 않는다는것을 의미.


draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramName컨테이너link
simpleViewerfalse
width
diagramWidth481482
revision12


링크(link)는 같은 호스트에 있는 컨테이너들끼리 통신할 수 있는 방법이다.

컨테이너 간의 통신은 내부 도커 네트워크를 통해서 이루어지며, 

통신은 호스트의 네트워크로 노출되지 않는다는것을 의미.


--link CONTAINER:ALIAS 로 설정, CONTAINER 는 링크컨테이너(연결되는 컨테이너), ALIAS는 마스터 컨테이너(시작되는 컨테이너),

내부에서 링크 컨테이너를 참조할 때 사용하는 로컬 이름을 설정 한다.

■ Redis 컨테이너 연결

Code Block
[root@localhost ~]# docker run -d --name myredis redis
9f28a7ae2eaa9453d665249b0b198c4ca85cf6ab...
[root@localhost ~]# docker run --link myredis:redis debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0524ffd6c542
REDIS_PORT=tcp://172.17.0.3:6379
REDIS_PORT_6379_TCP=tcp://172.17.0.3:6379
REDIS_PORT_6379_TCP_ADDR=172.17.0.3
REDIS_PORT_6379_TCP_PORT=6379
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_NAME=/modest_mestorf/redis
REDIS_ENV_GOSU_VERSION=1.10
REDIS_ENV_REDIS_VERSION=4.0.8
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.8.tar.gz
REDIS_ENV_REDIS_DOWNLOAD_SHA=ff0c38b8c156319249fec61e5018cf5b5fe63a65b61690bec798f4c998c232ad
HOME=/root

링크 컨테이너로부터 환경변수를 참조하는데, 해당 환경변수는 REDIS_ENV로 시작하게 된다.


기본적으로 링크의 구성여부와 상관없이 컨테이너들은 서로 통신이 가능하다.

컨테이너가 링크되면, 

도커는 Iptables 규칙을 설정 후 명시적 설정된 포트를 통하여 컨테이너가 통신할 수 있다.

Warning

링크는 컨테이너가 재시작 되더라도 그대로 유지 되지 않으며, 링크 컨테이너가 대체되면 갱신이 되지 않는다.

마스터 컨테이너가 시작되기 전에 링크 컨테이너가 시작되어야 하며 양방향 링크가 불가능하다.



컨테이너를 연결하기 위해서 먼저, 컨테이너이름을 DB로 설정하여 생성한다.

Code Block
[root@localhost example]# docker run --name db -d mongo
latest: Pulling from library/mongo
d2ca7eff5948: Pull complete
29f0c7020f3a: Pull complete
Digest: sha256:5556a788263cf8326897f2f58e63e970103fa06aa6bb15c2ffca18e374aa84c6
Status: Downloaded newer image for mongo:latest
870d766763a636be519945d55603a14a039e82f83ea992fb65051e44bca88d6a


이후 WEB 컨테이너를 생성한 후 db 컨테이너와 연결 한다.

Code Block
[root@localhost example]# docker run --name web -d -p 80:80 --link db:db nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
8176e34d5d92: Pull complete
5b19c1bdd74b: Pull complete
Digest: sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
Status: Downloaded newer image for nginx:latest
c1bd71a08a820ae9c87c938316e16ad46c8bd5c911759f43f6ed80c488ac0c59

--link <컨테이너이름>:<이름> 형식으로 생성하였다.

컨테이너 목록을 출력하게 되면, 다음과 같이 두개의 컨테이너가 생성 되었다.

Code Block
[root@localhost example]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                           NAMES
c1bd71a08a82        nginx               "nginx -g 'daemon of..."   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp              web
870d766763a6        mongo               "docker-entrypoint.s..."   4 minutes ago        Up 4 minutes        27017/tcp                       db

이제 db 컨테이너와 web 컨테이너가 연결되었다.

링크는 docker run 실행 후 

--link CONTAINER:ALIAS 로 설정 초기화하면,

CONTAINER에는 링크컨테이너의 이름을 ALIAS 에서는 마스터 컨테이너 내부에서 링크 컨테이너를 참조할때 사용하는 부모 이름을 설정한다.

다음은 Redis 컨테이너를 생성하고 연결하는 방법이다.

Code Block
[root@localhost ~]# docker run -d --name myredis redis
9f28a7ae2eaa9453d665249b0b198c4ca85cf6ab...
[root@localhost ~]# docker run --link myredis:redis debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0524ffd6c542
REDIS_PORT=tcp://172.17.0.3:6379
REDIS_PORT_6379_TCP=tcp://172.17.0.3:6379
REDIS_PORT_6379_TCP_ADDR=172.17.0.3
REDIS_PORT_6379_TCP_PORT=6379
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_NAME=/modest_mestorf/redis
REDIS_ENV_GOSU_VERSION=1.10
REDIS_ENV_REDIS_VERSION=4.0.8
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.8.tar.gz
REDIS_ENV_REDIS_DOWNLOAD_SHA=ff0c38b8c156319249fec61e5018cf5b5fe63a65b61690bec798f4c998c232ad
HOME=/root

링크 컨테이너로부터 환경변수를 참조하는데, 해당 환경변수는 REDIS_ENV로 시작하게 된다.

기본적으로 링크의 구성여부와 상관없이 컨테이너들은 서로 통신이 가능하다.

컨테이너가 링크되면, 

도커는 Iptables 규칙을 설정 후 명시적 설정된 포트를 통하여 컨테이너가 통신할 수 있다.

Warning

링크는 컨테이너가 재시작 되더라도 그대로 유지 되지 않으며, 링크 컨테이너가 대체되면 갱신이 되지 않는다.

마스터 컨테이너가 시작되기 전에 링크 컨테이너가 시작되어야 하며 양방향 링크가 불가능하다

.