쿠버네티스/docker

8-1. 컨테이너간 통신(네트워크)

몽자비루 2024. 5. 3. 19:54
  1. 컨테이너 통신 방법
    1. Container Network Model
    2. docker0
      • virtual ethernet bridge:172.17.0.0/16 값을 가지는 bridge network 가 docker 0.
      • 이 대역대 안에서 docker 0는 172.17.0.1 ip를 가지고 gateway 역할을 함.
      • L2 통신기반
      • container 생성 시 veth 인터페이스 생성(sandbox)
      • 모든 컨테이너는 외부 통신을 docker0을 통해 진행
      • container running 시 172.17.X.Y로 IP 주소 할당.
    3. container 통신 방법
      • docker host system 에서 docker deamon이 실 행되면 docker 0 라고 하는 docker network interface가 생김 
      • docker 0은 virtual ethernet bridge network 를 지원해주는 가상 네트워크
      • 컨테이너의  ip대역대와 docker host 가 가지고 있는 network를 연결해주는 bridge 역할을 함.
      • bridge network 역할을 위해 network adression translation 과 port forwarding 을 지원함 (ip tables를 통해)
  2. 컨테이너 포트 외부 노출
    1. port-forwarding
      • container port를 외부로 노출시켜 외부 연결 허용
      • iptables rule을 통한 포트 노출
        • -p hostPort:containerPort
        • -p containerPort : hostport 는 rondom port 가 열리게 됨
        • -P : 랜덤포트가 자동으로 만들어지게 됨.
      • docker run --name web -d -p 80:80 nginx:1.14
        ㄴ -p 호스트 포트:컨테이너 포트 
      • iptables -t nat -L -n -v
  3. 컨테이너 네트워크 추가
    1. static ip 를 정하는 방법.
      • ip는 일반적으로 순차적으로 할당됨.
      • 기본적으로 docker 0 인터페이스 내 네트워크는 static ip 할당 불가능.
      • 단, docker 0 networkl interface 대역대를 변경하거나 user define network를 만들 수 있음.
    2. user-defined bridge network 생성
      • $ docker network create --drive bridge \  > 드라이브를 선택할 수 있는데, bridge가 default 값임.
        --subnet 192.168.100.0/24 \                     > subnet 대역대는 정해줄 수 있고, 생략할 수 있음
        --gateway 192.168.100.254 \                   > gateway 주소를 지정하여 고정할 수 있음.
        mynet                                                       > network 이름을 지정할 수 있음.
      • $ docker network ls                                 > 만들어진 네트워크 확인
      • $ docker run -d --name web -p 80:80 \ nginx:1.14
        $ curl localhost
      • $ dicjer run -d --name appjs \
        --net mynet --ip 192.168.100.100 \          > user define network 의 경우, static network 설정 가능.
        -p 8080:8080 \smlinux/appjs
      • $ curl localhost:8080
  4. 컨테이너간의 통신 방법
    1. 컨테이너를 이용한 server &  client 서비스 운영
      • # docker run -d --name mysql -v /dbdata:/var/lib/mysql -e      > /var/lib/mysql 의 컨텐츠를 /dbdata 에 저장
        MYSQL_ROOT_PASSWORD=wordpress -e                        
        MYSQL_PASSWORD=wordpress mysql:5.7                          > wordpress 가 사용하는 password
      • # docker run -d --name wordpress --link mysql:mysql -e
                                                 
        > link 를 통해 2개의 conainer 연결 (컨테이너 이름 : 원하는 이름)
        WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:4
                                                 > wordpress 동작 후 만들어지는 데이터는 mysql의 db 형태로 저장됨

출처 : https://youtu.be/jOX80bXND2w