Docker - 컨테이너 통신

Docker

컨테이너가 통신하는 방법

docker daemon이 start되면 docker0이라는 docker network interface가 생성된다.
- virtual ethernet bridge : bridge를 지원해주는 network
- container의 ip대역과 실제 물리 호스트 장비의 network를 연결시켜주는 bridge이다
- docker0는 bridge network를 지원하기 위해서 내부적으로 NAT(network address translation)와 port forwarding 기능을 지원해준다.
- ip tables를 통해서 지원한다.
- 172.17.0.0/16 대역 안에서 docker0는 172.17.0.1 ip를 갖고 container의 gateway 역할, L2 통신 지원
- container 생성 -> docker 0를 통해 통신, container run 하면 172.17.0.1,2,3 순으로 가상 ip를 받고, docker0와 host 이더넷을 통해 외부로 통신한다.


1. 컨테이너 포트 외부 노출

웹 기반의 컨테이너 서비스를 동작하고 있으면 외부에서 웹 서버 컨테이너로 연결을 시켜주려면 포트포워딩이 필요하다

client는 이더넷(eth0) 인터페이스를 들어올 수 있는데, eth0를 통해 container로 접근하려면 포트포워딩이 필요하다.

규칙

  • docker host 백엔드 안에 iptables가 생성이되며 방화벽 rule이 저장된다.
    • iptables -t nat -L -n -v로 iptable을 확인할 수 있다.
  • host의 포트번호는 중복될 수 없다.
  • container는 생성될 때마다 할당받는 주소가 달라지기 때문에 동일한 포트번호로 포워딩을 받을 수 있다.

-p hostPort:containerPort

코드에서 -p hostPort:containerPort는 hostPort로 접근 시 containerPort로 포트를 포워딩 시켜준다는 의미이다.

-p containerPort

추가로 -p containerPort와 같이 사용할 수 있는데, hostPort는 랜덤으로 배정된다

-P

-P만 사용하면 컨테이너 내부에서 Dockerfile 내부에서 EXPOSE로 선언한 포트에 맞춰서 정의된다.


2. 컨테이너 네트워크 추가

기본적으로 docker0 인터페이스 내부에 있는 network에 직접적으로 static ip를 할당할 수 없다.
하지만 network 대역을 바꾸거나 user-define network을 생성하여 내부에서 static ip를 할당하면 된다.

1
2
3
4
$ docker network create --drive bridge \
--subnet 192.168.100.0/24 \
--gateway 102.168.100.254 \
mynet
  • driver : bridge, host, none-base 중 선택
    • default = bridge
  • subnet : user가 원하는 대로 할당할 수 있다.
    • default : 172.18.x.x, 172.19.x.x와 같이 점진적으로 증가하여 할당한다.
  • gateway : gateway도 임의로 할당할 수 있다.
    • default : 192.168.100.1과 같이 할당된다.
  • mynet : user가 설정한 network 이름

만들어진 network 확인

1
docker network ls

실행

1
2
3
4
docker run -d --name appjs \
--net mynet --ip 192.168.100.100 \
-p [hostPort:containerPort] \
[container image]
  • network : –net을 통해 user가 생성한 network을 사용할 수 있다.
    • default : docker0의 network
  • ip : --ip를 통해서 static ip를 할당할 수 있다.
    • default : 192.168.100.1, 192.168.100.2와 같이 점진적으로 할당

3. 컨테이너 간의 통신

프론트를 담당하는 컨테이너와 백을 담당하는 컨테이너 간의 통신을 통해 데이터를 주고 받을 수 있다.

MySQL(back)과 wordpress(front)를 연결해보는 예시를 진행해 볼 것이다.

MYSQL 컨테이너

1
2
3
4
5
6
7
8
9
# 일반 OS
$ docker run -d --name mysql -v /Users/InwooJeong/dbtest:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=wordpress
-e MYSQL_PASSWORD=wordpress mysql:5.7

# Mac OS (M1)
$ docker run -d --name mysql -v /Users/InwooJeong/dbtest:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=wordpress
-e MYSQL_PASSWORD=wordpress --platform linux/amd64 mysql:5.7

Volume mount를 해주고 환경변수로 password를 설정해준다.
- MYSQL_ROOT_PASSWORD : DB에 접근할 때 필요한 비밀번호
- MYSQL_PASSWORD : wordpress가 사용하는 비밀번호

WORDPRESS 컨테이너

1
2
$ docker run -d --name wordpress --link mysql:mysql  
-e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4

--link를 통해서 컨테이너를 연결해준다.
- 콜론(:) 왼쪽 : 컨테이너 이름
- 콜론(:) 오른쪽 : 유저가 원하는 이름

--link를 통해 mysql

Author

Inwoo Jeong

Posted on

2022-01-14

Updated on

2022-01-14

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글