Page History
도커 이미지는 보통 응용소프트웨어 별로 생성한다.소프트웨어별로 이미지를 응용 소프트웨어 별로 생성하고 컨테이너를 생성하게 실행하게 되면,
서로간의 통신이 많아지고 데이터를 주고 받아야 한다.
도커 링크(link) 는 같은 호스트에 있는 컨테이너들끼리 통신할 수 있는 방법중 하나..
컨테이너간의 통신은 내부 도커 네트워크를 통해서 이루어짐.
즉, 통신은 호스트의 네트워크로는 노출되지 않는다는것을 의미.
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
링크(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 규칙을 설정 후 명시적 설정된 포트를 통하여 컨테이너가 통신할 수 있다.
링크는 컨테이너가 재시작 되더라도 그대로 유지 되지 않으며, 링크 컨테이너가 대체되면 갱신이 되지 않는다.
마스터 컨테이너가 시작되기 전에 링크 컨테이너가 시작되어야 하며 양방향 링크가 불가능하다.