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 | docker network create --drive bridge \ |
- driver : bridge, host, none-base 중 선택
- default = bridge
- subnet : user가 원하는 대로 할당할 수 있다.
- default :
172.18.x.x
,172.19.x.x
와 같이 점진적으로 증가하여 할당한다.
- default :
- gateway : gateway도 임의로 할당할 수 있다.
- default : 192.168.100.1과 같이 할당된다.
- mynet : user가 설정한 network 이름
만들어진 network 확인
1 | docker network ls |
실행
1 | docker run -d --name appjs \ |
- network : –net을 통해 user가 생성한 network을 사용할 수 있다.
- default : docker0의 network
- ip :
--ip
를 통해서 static ip를 할당할 수 있다.- default :
192.168.100.1
,192.168.100.2
와 같이 점진적으로 할당
- default :
3. 컨테이너 간의 통신
프론트를 담당하는 컨테이너와 백을 담당하는 컨테이너 간의 통신을 통해 데이터를 주고 받을 수 있다.
MySQL(back)과 wordpress(front)를 연결해보는 예시를 진행해 볼 것이다.
MYSQL 컨테이너
1 | 일반 OS |
Volume mount를 해주고 환경변수로 password를 설정해준다.
- MYSQL_ROOT_PASSWORD : DB에 접근할 때 필요한 비밀번호
- MYSQL_PASSWORD : wordpress가 사용하는 비밀번호
WORDPRESS 컨테이너
1 | docker run -d --name wordpress --link mysql:mysql |
--link
를 통해서 컨테이너를 연결해준다.
- 콜론(:) 왼쪽 : 컨테이너 이름
- 콜론(:) 오른쪽 : 유저가 원하는 이름
--link
를 통해 mysql
Docker - 컨테이너 통신
install_url
to use ShareThis. Please set it in _config.yml
.