본문 바로가기
INFRA/DevOps

[Docker] Container간 통신 (네트워크)

by BTC_프로틴 2022. 7. 18.

Docker0 란?

  • virtual ethernet bridge : 172.17.0.0/16
  • L2 통신 기반
  • container 생성 시 veth 인터페이스 생성(sandbox)
  • 모든 container는 외부 통신을 docker0를 통해 진행
  • container running 시 172.17.X.Y로 IP 주소 할당
  • static IP 할당 불가능
  • iptables를 통해 NAT, Port-forwarding 지원
  • ip addr command로 확인 가능

 

Docker port-forwarding

  • conatiner port를 외부로 노출시켜 외부 연결 허용
  • iptables rule를 통한 port 노출
    • -p hostPort:containerPort
    • -p containerPort : host에는 random port가 지정
    • -P :: dockerfile에서 expose되어 있는 port가 지정
  • iptables -t nat -L -n -v 통해 확인 가능

 

User-define bridge network 생성 예시

  • static IP 할당 가능
docker network create --driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.254 \
mynet

docker network ls

 

[ Hands - on ]

Container network 사용하기

  • docker0가 bridge network인 것을 확인
apt-get install -y bridge-utils
brctl show

  • sandbox를 통해서 container의 network 환경을 구성 (docker inspect를 통해 확인 가능)

 

Container port 외부로 노출하기

  • -p hostPort:containerPort의 경우
    • host port : 80 port
    • container port : 80 port
docker run -d -p 80:80 --name web1 nginx

  • -p containerPort 의 경우
    • host port : random port
    • container port : 80 port
docker run -d -p 80 --name web2 nginx

  • -P 의 경우
    • host port : random port
    • container port : dockerfile에 expose로 설정된 port
docker run -d -P --name web3 nginx

 

User-defined network 구성하기

  • driver의 default는 bridge
  • subnet의 default는 172.18.0.0/24
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet
  • user-defined network 확인
docker network ls

docker inspect mynet

  • user-defined network와 static ip를 사용하는 container 생성
docker run -it --name c1 --net mynet --ip 192.168.100.100 busybox

 

Container service 운영 - 1

  • Mysql dbserver container 구축
docker run -d --name mysql -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_PASSWORD=wordpress mysql:5.7
  • Wordpress container 구축
    • --link 경우 link할 container 이름 : alias
docker run -d --name wordpress --link mysql:mysql -e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4
  • http://localhost 로 생성 확인

  • host에 wordpress 연동 database 생성 확인

 

Container service 운영 - 2

  • 실습할 디렉토리 생성 및 이동
mkdir genid
cd genid
  • rig, boxex command를 통한 메세지를 작성하는 container 생성
cat >> genid.sh << EOF
#!/bin/bash
mkdir -p /webdata
while true
do
  /usr/bin/rig | /usr/bin/boxes -d boy > /webdata/index.html
  sleep 5
done
EOF
cat >> dockerfile << EOF
FROM ubuntu:latest
RUN apt-get update ; apt-get -y install rig boxes
ADD genid.sh /bin/genid.sh
RUN chmod +x /bin/genid.sh
ENTRYPOINT ["/bin/genid.sh"]
EOF
docker build -t genid:latest .
docker run -d -v /webdata:/webdata --name genid genid:latest
  • nginx container 생성
docker run -d -v /webdata:/usr/share/nginx/html -p 80:80 --name nginx nginx:latest
  • service 확인
curl localhost

 

 

참고 : 

https://www.youtube.com/watch?v=jOX80bXND2w&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=21
https://www.youtube.com/watch?v=CXrrkl4Zamc&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=22

댓글