본문 바로가기
Docker

Docker Network

by 손영진 2023. 8. 3.
728x90

#1 CNM : Container Network Model

   1. CNM

  • Container를 사용하는 환경에서 사용자가 Network 설계를 쉽게 하기 위한 것
  • 복잡한 물리 환경의 고려 필요없이 추상적 개념만을 이용하여 Network 설계
  • 구성요소
    • Sandbox
      • 하나의 Container의 Network stack 설정 포함
      • Container의 Network Interface, 라우팅 테이블 및 DNS 설정관리
    • Endpoint
      • Sandbox를 Network에 연결
      • Endpoint의 구현은 veth pair 일 수 있음
      • 생성되어 있는 container 당 하나의 veth pair를 가짐 (veth : virtual ethernet)
      • 이러한 veth pair는 docker0라는 bridge network에 연결
    • Network
      • 네트워크는 직접적으로 통신 할 수 있는 엔드포인트의 모임

          

   2. Docker Network - Bridge

  • Container Test : Container 생성 시 부여되는 IP
  • veth : virtual ethernet으로 docker0의 포트번호에 연결
  • docker0 : gateway, bridge의 역할
    • 3 -> 4로 넘어갈 시 IPtables라는 NAT를 사용하여 IP 변경
  • eth0 : 서버의 인스턴스 IP

 

#2 Docker Network

   1. Bridge 네트워크 

<servera>
docker network ls		// 현재 네트워크 방식의 bridge가 있는지 확인

docker network create --driver bridge \
> --subnet 172.16.1.0/16 --ip-range 172.16.1.0/24 \
> --gateway=172.16.1.1 vswitch01
			// bridge 네트워크 안에 해당 subnet, gateway ip-range를 가지는 vswitch01 이름을 가진 network를 생성
            
docker run --name centos1 --hostname centos1 \
> --network vswitch01 -itd centos
			// 생성한 vswitch01의 네트워크에 centos Image로 centos1 이라는 이름을 가진 container 생성
 docker run --name centos2 --hostname centos2 \
> --network vswitch01 -itd centos
			// 동일한 방법으로 centos2 생성

docker exec -it centos1 /bin/bash		// 생성한 centos1의 container에 접속

<centos1>
ip a			// centos1의 IP 확인
ping -c 4 centos2	// 다른 container로 ping 확인

=> container 생성 시 network를 host로 만들 시 servera 와 네트워크를 공유

=> 따라서, 혼란을 방지하기 위해 host로 network를 만들지 않음

 

   2. 연습문제

  • nginx-network라는 container 생성 ( vswitch01의 network 할당)
  • 8000:80 포트 사용, 임의의 index.html 파일 생성 후 container에 복사하여 웹브라우저 확인
  • servera 공인IP:8000 을 웹브라우저에 작성 시 index 파일 내용 뜸
    • servera 인스턴스의 보안그룹이 8000번 포트를 허용하였는지 확인
<servera>
docker run --name nginx-network -d -p 8000:80 --network vswitch01 ngnix
echo 'network test' > index.html
docker cp index.html nginx-network:/usr/share/nginx/html/index.html
			// 복사될 container의 경로에 유의
curl localhost:8000

 

   3. 생성한 container의 IP 주소 확인

docker container inspect centos1 | grep IPAddress
docker container inspect centos2 | grep IPAddress

 

   4.  LINK

  • link를 이용한 container 연동
    • container의 IP는 언제든 변할 수 있는 유동적인 성격을 지니고 있음
    • container 중지 뒤 재시작하면 Process가 죽었다 살아나는 것이기에 IP 변동
    • 따라서, container 사이를 연동
docker run --name centos3 --hostname centos3 --link centos1 -itd centos
			// --link centos1 : 이를 통해 centos1과 연동

docker exec -t centos3 cat /etc/hosts
			// centos3 의 hosts에 누가 있는지 확인
            
docker exec -t centos3 ping -c3 centos1
			//위의 방법으로 centos1이 있다면 ping을 통해 연결 확인

 

#3 Docker Compose

   1. docker-compose 설치 및 설정

curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
			// 경로 및 띄어쓰기에 유의
chmod +x /usr/local/bin/docker-compose
			// 다운받은 docker-compose에 권한 부여
cp /usr/local/bin/docker-compose /usr/bin/

docker-compose version	//docker-compose 버전 확인

 

   2. docker-compose.yml 문법 설명

더보기

version: '3'

services:
 db:
   image: postgres
   volumes:
     - ./docker/data:/var/lib/postgresql/data
   environment:
     - POSTGRES_DB=sampledb
     - POSTGRES_USER=sampleuser
     - POSTGRES_PASSWORD=samplesecret
     - POSTGRES_INITDB_ARGS=--encoding=UTF-8
 django:
   build:
   context: .
   dockerfile: ./Dockerfile
   environment:
     - DJANGO_DEBUG=True
     - DJANGO_DB_HOST=db
     - DJANGO_DB_PORT=5432
     - DJANGO_DB_NAME=sampledb
     - DJANGO_DB_USERNAME=sampleuser
     - DJANGO_DB_PASSWORD=samplesecret
     - DJANGO_SECRET_KEY=dev_secret_key
   ports:
     - "8000:8000"
   command: 
     - python manage.py runserver 0:8000
   volumes:
     - ./:/app/

  • service : Compose에서는 container 대신 service라는 개념을 사용
  • db : postgres 서비스의 이름을 db로 정의
  • image : docker 이미지
  • volumes : db를 상대경로로 지정한 곳에 저장
  • environment : docker run 명령어의 -e 옵션의 변수들과 동일
  • django : 앱 서비스 이름
  • build : 앱 서비스는 특정 이미지 대신 build 옵션을 추가하여 Dockerfile 지정
  • environment : docker run 명령어의 -e 옵션으로 자세하게 기록
  • ports : 포트번호

 

   3. Jenkins container 생성

mkdir jenkins
cd jenkins
mkdir /jenkinsdata/
vim docker-compose.yml
<더보기 참조>

 docker-compose up -d
 			// 생성한 container를 up을 통해 업로드 시킴
  • docker-compose.yml
더보기

version: '3.3'

services:

   jenkins:

     image: yallalabs/jenkins:centos

     environment:

       - JAVA_OPTS=-Djenkins.install.runSetupWizard=false -Dhudson.footerURL=http://yallalabs.com

       - JENKINS_USER=admin

       - JENKINS_PASS=admin1234

     ports:

       - 8000:8080

       - 50000:50000

     volumes:

       - jenkins_data:/var/jenkins_home

       - /var/run/docker.sock:/var/run/docker.sock

volumes:

   jenkins_data:

     driver: local

     driver_opts:

       type: "none"

       o: "bind"

       device: "/jenkinsdata"

=> 웹브라우저에 servera공인ip:8000 검색 후 jenkins 브라우저 확인

 

   4. Django container 생성

  • Dockerfile 및 Django를 생성하기 위한 txt 생성
  • Dockerfile 
    더보기
    FROM python:3
    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED=1
    WORKDIR /code
    COPY requirements.txt /code/
    RUN pip install -r requirements.txt
    COPY . /code/
  • requirements.txt
더보기

Django>=3.0,<4.0
psycopg2>=2.8

  • docker-compose.yml
더보기

version: "3.9"

 

services:

   db:

     image: postgres

     volumes:

       - ./data/db:/var/lib/postgresql/data

     environment:

       - POSTGRES_DB=postgres

       - POSTGRES_USER=postgres

       - POSTGRES_PASSWORD=postgres

   web:

     build: . 

     command: python manage.py runserver 0.0.0.0:8000

     volumes: - .:/code

     ports:

       - "8000:8000"

     environment:

       - POSTGRES_NAME=postgres

       - POSTGRES_USER=postgres

       - POSTGRES_PASSWORD=postgres

     depends_on: 

       - db

 

 

mkdir django
cd django

vim Dockerfile
<더보기 참조>

vim requirments.txt
<더보기 참조>
vim docker-compose.yml
<더보기 참조>

 docker-compose run web django-admin startproject composeexample . 
 			// 마지막 ' . ' 을 통해 바로 실행해준다.

vim composeexample/settings.py
<사진 참조>
			// run을 통해 생성된 .py 안의 내용 수정
docker-compose up -d
			// 생성한 container 업로드
            
docker container ls
docker-compose ps		// 두 명령어로 web_1과 db_1이 모두 있는지 확인 후 웹브라우저 확인

=> 웹브라우저에 servera공인IP:8000 검색 후 django 브라우저 확인

'Docker' 카테고리의 다른 글

Docker 최종 연습  (1) 2023.08.06
Docker Swarm & Monitoring & Podman  (0) 2023.08.06
Docker Registry  (0) 2023.08.02
다양한 Container 생성  (0) 2023.08.01
Docker의 기본개념  (1) 2023.07.31