본문 바로가기
Docker

Docker : Link

by Nirah 2022. 12. 9.

Container간의 통신에 사용되는 --link옵션에 대해서 실습한다.

 

 

Docker : Link

 

필요성

 - Container는 IP를 동적(DHCP)으로 받아오기 때문에 항상 동일한 IP를 사용한다는 보장이 없다.

 - 서로 다른 두 개 이상의 Container 통신에서 문제가 발생할 수 있음.

 - link는 Container의 IP가 변경되어도 통신이 유지되도록 하는 기능.

 - Container 내부의 /etc/hosts에 기록

 - Container의 이름에 따른 IP가 변경되어도 추적 가능

 - Container의 이름이 변경되는 경우에는 추적 불가

 

 

 

 

link 실습

 

a1~3 컨테이너를 만들어 본다.

docker run -itd --name a1 alpine

docker run -itd --name a2 alpine

docker run -itd --name a3 alpine

 

당연하게도 a1에서 a3이라는 컨테이너 이름으로 지정해서는 인식 못하니까 ping이 안간다.

docker exec a1 ping a3

 

대신 이렇게 ip로 지정하면 알아내서 간다

 docker exec a1 ping 172.17.0.4

 

 

Link 명령어

 

이번엔 a4 컨테이너를 실행시킬 때 a1과 a2에 링크를 거는 옵션을 쓴다.

아까와는 다르게 a4에서 a2로 컨테이너 이름을 지정하여 ping이 가는 것을 확인할 수 있다.

 

docker run -itd --name a4 --link a1 --link a2 alpine

docker exec a4 ping a2

 

 a4는 링크가 안된 a3과는 통신 불가능하며

 

반대로 링크의 역방향인 a1에서 a4로의 통신도 불가능 한 것을 확인할 수 있다.

 

 

 

Link 별칭

 

도커 링크에 별칭 붙여주기도 가능하다

docker run -itd --name a5 --link a1:babo1 --link a2:babo2 alpine

 

별칭으로 지정해서 통신이 가능하다!

docker exec a5 ping babo1

 

 

 

Link 정보 위치

 

과연 Link를 연결하는 것이 어떻게 적용되길래 이름을 지정해서 통신이 가능해진 것일까?

아래와 같이 a4 컨테이너에 접속해보면 /etc/hosts에 a1과 a2 에 대해 매핑되어있는게 보인다.

참고로 이 링크는 a1과 a2의 ip가 변경되면 자동으로 여기서도 변경되기 때문에 편리하다.

 

docker attach a4

cat /etc/hosts

 

별칭을 등록해 놨던 a5는 다음과 같이 별칭도 보인다.

docker attach a5

cat /etc/hosts

 

 

 

 

Link된 컨테이너 장애 시

 

docker run -itd --name a1 alpine

docker run -itd --name a2 alpine

docker run -itd --name a3 --link a2 alpine

docker run -itd --name a4 --link a1 alpine

 

컨테이너 자원 반납

(stop은 pause와 달리 완전히 ip든 뭐든 자원 싹 반납한다)

docker stop a2

 

 

컨테이너 순서에 따라 ip가 할당되고 달라지므로,

순서에 따라 a4가 a3이 원래 가지고있던 ip를 가져갔다(172.17.0.4  -> 172.17.0.3)

docker inspect a4

 

a2는 재실행 하고 나면  ip 172.17.0.5로 배정 됨

docker start a2

docker inspect a2

 

이렇게 IP가 뒤죽박죽 바뀌었음에도 불구하고 a3은 link된 a2를 변경된 ip 주소로 알아서 찾아간다.

172.17.0.5로 ping을 보내는 것을 알 수 있다.

docker exec a3 ping a2

 

docker attach a3

cat /etc/hosts

a2 컨테이너의 변경된 ip 주소가 자동 반영 되어있는 것을 확인할 수 있다.

 

 

 

 

 

/etc/hosts 직접 수정

 

Link 없이 host 주소를 직접 입력하여 컨테이너에 넣어줄 수도 있다!

docker run -itd --name a1 --add-host a2:172.17.0.3 --add-host a3:172.17.0.4 alpine

docker run -itd --name a2 --link a1 --add-host a3:172.17.0.4 alpine

docker run -itd --name a3 --link a1 --link a2 alpine

 

docker exec a2 ping a1

docker exec a1 ping a2

docker exec a3 ping a1

 

 

 

 

 

 

첫 번째 Container Link

 

첫번째로 만드는 Container는 link 걸 대상이 없기 때문에 link 사용이 불가한 문제가 있다.

여러 컨테이너를 모두 다 link로 통신을 하고 싶다면

 

docker run -itd --add-host a2:172.17.0.3 --add-host a3:172.17.0.4 --name a1 alpine

 

이렇게 첫 컨테이너 시작할 때, 미리 이후 만들어줄 다른 컨테이너 정보를 예비해서 넣어주면 된다.

etc/hosts에 넣어주는 원리이다.

단, 앞선 경우들과 다르게 상대 컨테이너들이 주소가 변경됐을때 자동으로 바뀌진 않는다.

 

 

'Docker' 카테고리의 다른 글

LXC (개인 프로젝트)  (0) 2022.12.19
HAProxy - Multi LoadBalancing  (0) 2022.12.13
Docker : Network  (0) 2022.12.09
Volume / bind mount ( Container Data 공유)  (0) 2022.12.09
Docker : MySQL:5.7 +php 설치  (0) 2022.12.09