해당 포스팅은 이성미 강사님의 따라 배우는 도커(따배도, https://www.youtube.com/@ttabae-learn)를 보고 공부한 내용을 정리한 블로그입니다.

아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
오늘은 고통스럽다.
내일은 더 고통스럽다.
그리고 내일 모래는 아름다울 것이다.
Mǎ Yún(알리바바 그룹 창업자 겸 회장)

Container 통신


컨테이너 네트워크 도식화

  • docker daemon이 start하게 되면 docker0라는 도커 네트워크 인터페이스가 생김.
    • virtual ethernet bridge: 172.17.0.0/16
      • bridge network: 컨테이너의 IP와 실제 물리 장비가 가지고 있는 IP연결
    • L2 통신기반
    • container 생성 시 veth 인터페이스 생성
    • 모든 컨테이너는 외부 통신을 docker0를 통해 진행(컨테이너가 생성되면 가상 IP가 +1씩 되면서 생성)
    • container running 시 172.17.X.Y로 IP 주소할당(IP 주소 변경 및 포트포워딩 기능 제공)
    • 컨테이너가 통신하게되면 bridge network가 gateway의 역할을 하므로 호스트의 IP로 변환(NAT 지원)해서 외부로 통신할 수 있도록 도와줌.
ip addr #docker0 ip 확인
brctl show #bridge interface 확인

docker run -it --name c1 busybox # 첫번째 컨테이너 아마도 docker0 ip + 1
ip addr

docker run --it --name c2 busybox # 두번째 컨테이너
docker run -d -p 80:80 --name web1 nginx

curl 172.17.0.4 # => nginx 연결.

# docker0 가 NAT 서비스 지원
iptables -t nat -L -v

Container 포트 외부 노출


  • port-forwarding
    • container port를 외부로 노출시켜 외부 연결 허용
    • iptables rule을 통한 포트 노출
      • -p hostPort:containerPort
      • -p containerPort => 랜덤 포트:containerPort 매핑
      • -P => 랜덤 포트 자동 생성
    • docker run --name web -d -p 80:80 nginx:1.14
    • iptables -t nat -L -n -v
      • 도커 IP와 외부 IP 테이블 확인
docker run --name web -d -p 80:80 --name web1 nginx:1.14
curl localhost:80 # 연결 가능.

docker run --name web -d -p 80 --name web2 nginx:1.14
docker ps # 외부에서 들어올 수 있는 포트 확인. 현재는 29154 -> 80

docker run --name web -P --name web3 nginx:1.14 # 도커 파일에 정의된 EXPOSE 80(만약 이게 90이였다면)
docker ps # 외부에서 들어올 수 있는 포트 확인. 현재는 29154 -> 80(얘가 90이 될 것)

Container 네트워크 추가


네트워크 추가

  • docker0에 ip static으로 부여 X
  • user-defined bridge network(myent) 생성
    • --subent을 생략하게 되면 172.18.X.Y로 자동생성
    • --gateway를 고정할 수도 있지만 생략하면 172.18.X.1
    • --ip: static ip 설정 가능
    • --net <bridge networkName>하면 해당 bridge 네트워크에 파생된 컨테이너 생성
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet
docker network ls

docker run -d --name web -p 80:80 nginx:1.14
curl local host

docker run -d --name appjs --net mynet --ip 192.168.100.100 -p 8080:8080 smlinux/appjs # --net mynet. mynet을 사용하겠다.
curl localhost:8080

Container 간 통신


컨테이너간 통신

  • --link: 두 컨테이너 연결<containerName>:<aliasName>
docker run -d --name mysql -v /dbdata:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=wordpress 
-e MYSQL_PASSWORD=wordpress mysql:5.7

docker ps
cd /dbdata

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

 

 

'CICD > docker' 카테고리의 다른 글

[Docker] 빌드에서 운영까지  (0) 2024.06.19
[Docker] Container Storage  (0) 2024.06.18
[Docker] Container 관리  (0) 2024.06.17
[Docker] Container 사용하기  (0) 2024.06.17
[Docker] Container Registry  (0) 2024.06.17

+ Recent posts