개발/Docker

Docker - Link ( + Scripts)

잇(IT) 2022. 6. 1. 14:38
728x90

목차

1. Link
2. Link 설정

2.1 link 설정
2.2 컨테이너 명 변경
2.3 컨테이너 IP 변경

3. Script를 이용한 link 파일 생성


1. Link

- 컨테이너가 통신하려면 IP를 알아야 한다.

- link 옵션은 같은 호스트 내에 컨테이너 간 연결을 할 때 사용한다.

- 컨테이너끼리는 private ip를 기반으로 통신한다. 그런데 컨테이너가 재시작되면 ip가 변경되는 경우도 있다. 

- link를 사용하게 되면 ip가 아닌 컨테이너 이름을 기반으로 통신 할 수 있다.


2. Link 설정

 

2.1 link 설정

 

- centos:7 이미지를 실행시켜 c1 컨테이너를 생성한다.

- c1 컨테이너의 IP 주소는 172.17.0.2다

 

- centos:7 이미지를 또 한번 실행시켜 c2 컨테이너를 생성한다.

- 이번에는 --link 옵션을 이용하여 c1 컨테이너를 link로 연결한다.

 

- c2 컨테이너에서 c1으로 통신이 되는 것을 볼 수 있다.

 

- centos:7 이미지를 이용하여 c3 컨테이너를 생성하고 이번에는 c1, c2 컨테이너를 link로 연결한다.

 

- c3 컨테이너에서 c2, c1으로 통신이 되는 것을 확인 할 수 있다.

 

- link는 반대로 통신하는 것은 불가능하다.

 

- link로 다른 컨테이너를 연결할 경우 /etc/hosts 파일에 해당 컨테이너의 이름과 ip 주소가 입력되면서 해당 경로를 알기 때문에 c1 컨테이너에서 c3 컨테이너로 통신을 시도하게 되면 link로 연결하지 않았기 때문에 /etc/hosts 파일에 c3의 정보가 없기 때문에 통신이 불가능 한 것이다.

 

- c4 컨테이너도 마찬가지로 생성하여 c1, c2, c3 컨테이너를 link로 연결시킨다.

- /etc/hosts 파일에 c1, c2, c3 컨테이너 및 IP 주소가 저장된 것을 볼 수 있고, 해당 컨테이너들에게 통신이 가능하다.


2.2 컨테이너 명 변경

 

- rename 명령어를 이용하여 c1 컨테이너의 이름을 c11로 변경한다.

 

- /etc/hosts 파일에는 여전히 c1이라는 컨테이너와 해당 IP 주소가 저장되어 있기 때문에 c1으로 통신이 가능하다.

 

- 하지만 바뀐 이름으로 통신은 되지 않는다.

- link 생성시 c1의 이름으로 연결했기 때문에 /etc/hosts 파일에 이름을 변경하기 전의 정보가 담겨있기 때문이다.


2.3 컨테이너 IP 변경

 

- 컨테이너 자원을 해제하는 방법으로 stop 명령어를 사용하여 해당 컨테이너에 저장된 자원을을 해제한다.

- c2의 컨테이너의 자원을 해제하고 h1의 이름을 가진 httpd 컨테이너를 생성한다.

 

- c2 컨테이너의 자원을 해제하고 새롭게 컨테이너를 생성했기 때문에 DHCP를 통해 자동으로 IP 주소가 부여되는데 앞에 c2에게 주어졌던 IP가 h1 컨테이너에 부여된 것을 볼 수 있다.

 

- 다시 c2의 이름을 가진 컨테이너를 생성하게 되면 해당 컨테이너의 IP 주소가 172.17.0.3 -> 172.17.0.6으로 변경된 것을 볼 수 있다.

 

- 하지만 c3 컨테이너에서 c2 컨테이너로 ping이 보내지는 것을 확인 할 수 있다.

 

- 즉, link 명령어를 사용하여 컨테이너를 연결하게 되면 IP 주소는 변경되어도 해당 컨테이너와 통신이 가능하다는 것을 알 수 있다. 하지만 이름이 바뀌게 되면 통신이 되지 않는다는 것을 알 수 있다.


 

3. Script를 이용한 link 파일 생성

 

- 위에서 알아봤던 link 설정들을 script 파일로 생성하는 작업을 해 볼 것이다.

 

* 시나리오

   1. c1 컨테이너 생성

   2. c2 컨테이너 생성 및 c1 컨테이너 link로 연결

   3. c1 컨테이너 자원 해제

   4. c3 컨테이너 생성

   5. c1 컨테이너 재시작

   6. c2 컨테이너에서 IP가 변경된 c1 컨테이너로 통신 확인

 

 

#! /bin/bash



systemctl restart docker



docker run -itd --name c1 centos:7

docker run -itd --name c2 --link c1 centos:7

docker exec c2 ping -c 4 c1

docker stop c1

docker run -itd --name c3 centos:7

docker start c1

docker exec c2 cat /etc/hosts

docker exec c2 ping -c 4 c1

docker inspect c1 | grep '"IPAddress"' | tail -1

 

728x90

'개발 > Docker' 카테고리의 다른 글

Docker - Word Press + MYSql  (0) 2022.06.02
Docker - PHP, MYSql 설치 및 실행  (0) 2022.06.01
Docker - Image 생성  (0) 2022.05.31
Docker - Scripts  (0) 2022.05.31
Docker - HAProxy, Network, Port Forwarding  (0) 2022.05.30