[따배도] 9-2. Container간의 Network (실전)

( 참고 : 따배도 https://www.youtube.com/watch?v=NLUugLQ8unM&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi )


Contents

  1. container network 사용하기
  2. container 포트를 외부로 노출
  3. user-defined network 구성하기
  4. container 간 통신 ( wordpress, mysql 컨테이너 서비스 구축 )


Q1. container는 어떻게 통신하나요?

  • docker0에서 만들어진 container는 기본적으로 “순차적으로” ip가 할당된다

  • 모든 컨테이너는 docker0를 통해서 외부와 통신한다

    ( 이 docker0를 bridge network라고 한다 )


ip addr

figure2

  • docker0의 ip address는 172.17.0.1이다


( sudo apt-get install -y bridge-utils )

brctl show

figure2

  • docker0가 bridge interface임을 확인할 수 있다


아래를 통해, 순차적으로 ip address 가 할당됨을 알 수 있다

( 172.17.0.3 ~ 172.17.0.5 차례로 )

docker run -it --name c1 busybox

figure2


docker run -it --name c2 busybox

figure2


docker run -d -p 80:80 --name web1 nginx

figure2


( c1 컨테이너 ) ping -c 3 8.8.8.8

  • 외부(구글)와 잘 통신이 됨을 알 수 있다.
  • docker0가 gateway 역할을하여 역할을 해준다.

figure2


docker inspect c1

  • c1 컨테이너의 ip와
  • network 연결을 해주고 있는 gateway의 ip를 확인해본다

figure2


모든 컨테이너를 제거해주고…

docker rm -f $(docker ps -aq)

figure2


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!


docker run --name web1 -d -p 80:80 nginx:1.14

figure2


docker run --name web2 -d -p 80 nginx:1.14

figure2


docker run --name web3 -d -P nginx:1.14

figure2


docker ps

figure2


다시 모든 컨테이너를 제거해주고…

docker rm -f $(docker ps -aq)


Q3. user-defined network 구성하기

mynet이라는 네트워크를 하나 만들어 볼 것이다.

그 전에, 기본적으로 도커가 동작될 때, 동작되는 네트워크를 확인해보자.

  • 여기서 birdge 네트워크가 docker0 (default 네트워크)이다

figure2


1) mynet 네트워크 만들기

docker network create --driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.254 \
mynet

figure2


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 지정

    figure2


다시 모든 컨테이너를 제거해주고…

docker rm -f $(docker ps -aq)


Q4. container 간 통신 ( wordpress, mysql 컨테이너 서비스 구축 )

figure2


[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

figure2


[2] mysql의 관리 db들이 생성됨을 알 수 있다

  • 아직 wordpress 관련된 것들은 X ( 아직 연동 X )
ls /dbdata/

figure2


[3] wordpress 컨테이너 실행

  • link를 사용하여, wordpress를 mysql과 연동
docker run -d --name wordpress --link mysql:mysql -e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4

figure2

figure2