도커/개념 및 실습

05장-2, 컨테이너의 통신

Jaden Park 2021. 6. 2. 18:06

링크(--link)

  • 컨테이너끼리 서로 통신하려면 기본적으로 같은 bridge 드라이버 네트워크를 사용
  • 종종 컨테이너 간 이름 또는 별칭으로 통신해야하는 경우도 있는데 이런 경우에 링크 기능을 사용

링크를 사용하여 os1 컨테이너가 web1 와 통신할 때 링크를 사용

[root@docker ~]# docker rm -f $(docker ps -aq)

[root@docker ~]# docker run --name web1 -d httpd
886997eb2e59ce48989f047e48a90571060b8449a8ffc3f202fa0ec84d69fd8d

[root@docker ~]# docker run -itd --name os1 --link web1 centos
7a3fd6f0c1da1b693d710307e238376952f59f859138ca2d3c04be3aa17c15e1

[root@docker ~]# docker exec os1 curl web1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0  22500      0 --:--:-- --:--:-- --:--:-- 22500
<html><body><h1>It works!</h1></body></html>

[root@docker ~]# docker exec os1 cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    web1 886997eb2e59
172.17.0.3    7a3fd6f0c1da
  • os1 컨테이너가 web1 이라는 이름으로 통신할 수 있는 이유는 /etc/hosts 파일에 정의되어 있기 때문

--link 옵션으로 os10에서 web1을 apache로 별칭 사용

[root@docker ~]# docker run --name os10 -itd --link web1:apache centos
5a3f9fd3f9c8f0cb75bfb2387e88fba206eb8e5d008e93bc2ec72763b9b48408

[root@docker ~]# docker exec os10 curl apache
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45  100    45    0     0  45000      0 --:--:-- --:--:-- --:--:-- 45000
<html><body><h1>It works!</h1></body></html>

[root@docker ~]# docker exec os10 cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    apache 886997eb2e59 web1
172.17.0.4    5a3f9fd3f9c8

포트 포워딩 (docker run -p)

  • Bridge 네트워크를 사용하는 모든 컨테이너는 외부에서 접근할 때 포트포워딩을 해야 한다.
  • 포트 포워딩을 하려면 컨테이너를 실행할 때 -p 옵션을 사용한다.

web2 컨테이너를 실행하면서 호스트의 8080 포트로 접근했을 때 컨테이너의 80번 포트로 전달하는 포트포워딩 설정

[root@docker ~]# docker run -d --name web2 -p 8080:80 httpd
829d5645592c6e2c998a100b828d9c200828d091e3d04a349cd29a7aea01c08d

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                                   NAMES
829d5645592c   httpd     "httpd-foreground"   8 seconds ago   Up 8 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web2

[root@docker ~]# cat > index.html
This is 8080 -> 80
[root@docker ~]# docker container cp index.html web2:/usr/local/apache2/htdocs/
[root@docker ~]# docker inspect web2 | grep IPAaddress
                    "IPAddress": "172.17.0.5",

[root@docker ~]# curl 172.17.0.5:8080
curl: (7) Failed connect to 172.17.0.5:8080; Connection refused

[root@docker ~]# curl localhost:8080
This is 8080 -> 80
  • docker ps 에서 PORTS 필드 값이 0.0.0.0 은 호스트 IP 를 나타내며 :8080 은 호스트의 포트를 나타냄.
  • 포트포워딩이 설정되면 로컬호스트 뿐만 아니라 이 호스트에 접근할 수 있는 모든 시스템에서 접근 가능.

'도커 > 개념 및 실습' 카테고리의 다른 글

06장-2, Dockerfile  (0) 2021.06.04
06장-1, 이미지 제작 및 업로드  (0) 2021.06.03
05장-1, 도커 네트워크 유형  (0) 2021.06.02
04장, 도커 볼륨  (0) 2021.06.02
1, 2, 3장 연습문제  (0) 2021.06.02