[따배도] 9-2. Container간의 Network (실전)
( 참고 : 따배도 https://www.youtube.com/watch?v=NLUugLQ8unM&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi )
Contents
- container network 사용하기
- container 포트를 외부로 노출
- user-defined network 구성하기
- container 간 통신 ( wordpress, mysql 컨테이너 서비스 구축 )
Q1. container는 어떻게 통신하나요?
-
docker0에서 만들어진 container는 기본적으로 “순차적으로” ip가 할당된다
-
모든 컨테이너는 docker0를 통해서 외부와 통신한다
( 이 docker0를 bridge network라고 한다 )
ip addr
- docker0의 ip address는 172.17.0.1이다
( sudo apt-get install -y bridge-utils
)
brctl show
- docker0가 bridge interface임을 확인할 수 있다
아래를 통해, 순차적으로 ip address 가 할당됨을 알 수 있다
( 172.17.0.3 ~ 172.17.0.5 차례로 )
docker run -it --name c1 busybox
docker run -it --name c2 busybox
docker run -d -p 80:80 --name web1 nginx
( c1 컨테이너 ) ping -c 3 8.8.8.8
- 외부(구글)와 잘 통신이 됨을 알 수 있다.
- docker0가 gateway 역할을하여 역할을 해준다.
docker inspect c1
- c1 컨테이너의 ip와
- network 연결을 해주고 있는 gateway의 ip를 확인해본다
모든 컨테이너를 제거해주고…
docker rm -f $(docker ps -aq)
Q2. container 포트를 외부로 노출
port forwarding
- container port를 외부로 노출시킴으로써 외부 연결을 가능케한다
- iptables rule을 통한 포트 노출
-p hostPort:containerPort
-p containerPort
-P
- example)
docker run --name web1 -d -p 80:80 nginx:1.14
- local host 80번으로 접속하면, container 80 포트로 연결해줘!
docker run --name web2 -d -p 80 nginx:1.14
- host port를 생략한다 ( container port만 !)
- 임의의 host port를 만들어준다
docker run --name web3 -d -P nginx:1.14
- nginx의 도커파일을 확인해보면,
EXPOSE 80
이라고 적혀있다 - container port도 지정하지 않고, 도커 파일에 적혀있는 곳으로 forwarding!
- nginx의 도커파일을 확인해보면,
docker run --name web1 -d -p 80:80 nginx:1.14
docker run --name web2 -d -p 80 nginx:1.14
docker run --name web3 -d -P nginx:1.14
docker ps
다시 모든 컨테이너를 제거해주고…
docker rm -f $(docker ps -aq)
Q3. user-defined network 구성하기
mynet이라는 네트워크를 하나 만들어 볼 것이다.
그 전에, 기본적으로 도커가 동작될 때, 동작되는 네트워크를 확인해보자.
- 여기서 birdge 네트워크가 docker0 (default 네트워크)이다
1) mynet 네트워크 만들기
docker network create --driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.254 \
mynet
2) container 만들기
-
docker run -it --name c1 busybox
- docker 0 ( default 네트워크 ) 사용
- 고정 IP 불가 (순차적)
-
docker run -it --name c1 --net mynet busybox
- mynet 네트워크 사용
-
docker run -it --name c1 --net mynet --ip 192.168.100.100 busybox
- mynet 네트워크 사용 + 고정 IP 지정
다시 모든 컨테이너를 제거해주고…
docker rm -f $(docker ps -aq)
Q4. container 간 통신 ( wordpress, mysql 컨테이너 서비스 구축 )
[1] mysql 컨테이너를 시행
- (+ wordpress 가 사용할 PW 정의 & volume mount )
docker run -d --name mysql -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_PASSWORD=wordpress mysql
[2] mysql의 관리 db들이 생성됨을 알 수 있다
- 아직 wordpress 관련된 것들은 X ( 아직 연동 X )
ls /dbdata/
[3] wordpress 컨테이너 실행
link
를 사용하여, wordpress를 mysql과 연동
docker run -d --name wordpress --link mysql:mysql -e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4