#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
- 네트워크는 직접적으로 통신 할 수 있는 엔드포인트의 모임
- Sandbox
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 |