Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

[Docker & Kubernetes] 3주차 정리 (1) 본문

KHUDA 6th/Study

[Docker & Kubernetes] 3주차 정리 (1)

시데브 2024. 8. 5. 01:14

5.1. 추가 실습 환경 구축

5.1.1. pyenv 설치

brew install pyenv pyenv-virtualenv

 

pyenv 사용하기 위해 .zshrc 파일 내용 변경

# ~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

 

5.1.2. pyenv를 활용한 파이썬 가상 환경 구축

pyenv install 3.11.6

 

-> 파이썬 3.11.6 버전을 활용해 py3_11_6이라는 가상 환경 생성

 

pyenv activate py3_11_6
  • 가상 환경 실행

 

pip install django
pip install gunicorn
pip install psycopg2-binary
  • gunicorn -> 웹 서버와 통신하기 위한 라이브러리
  • psycopg2 -> 파이썬에서 postgreSQL 활용하기 위한 라이브러리

-> 가상환경에서 python 실행 후 각 라이브러리 버전 확인

-> 파이썬 종료 후 가상 환경 종료

 

5.1.3. tree 설치

  • tree: 리눅스 시스템에서 파일 시스템 구조를 시각적으로 쉽게 확인할 수 있음
tree [경로]

-> 해당 경로를 포함한 하위 디렉터리 및 파일 구조를 쉽게 확인

 

5.1.4. django를 실행하기 위한 네트워크 설정

 

5.2. YAML 기초

5.2.1. YAML의 개념

  • YAML: "YAML Ain't Markup Language(YAML은 마크업 언어가 아니다)"의 줄임말
  • Docker compose, Kubernetes를 활용할 때 YAML 파일 사용
  • YAML 파일의 확장자: .yaml과 .yml -> 기능 차이 X

 

5.2.2. pyyaml 설치

pyenv activate py3_11_6
pip install pyyaml

-> 가상 환경에서 pyyaml 설치

 

python
>>> import yaml
>>> quit()
source deactivate

-> 파이썬 가상 환경에서 파이썬 실행 후, yaml 라이브러리 import, 이후 모두 종료

 

5.2.3. YAML 문법

  • yaml_practice.yml 생성
  • YAML 파일은 기본적으로 {key: value} 구조 사용
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
  - name: ubuntu
    image: ubuntu:latest

 

-> 위와 같이 yaml 라이브러리를 통해서 파일 구조를 살펴볼 수 있음

-> '-'로 시작하는 줄은 한 요소의 시작, '-'로 시작하지 않는 줄은 '-'로 시작하는 줄의 다음 요소로 추가됨

 

5.3. Docker를 활용한 django 활용

pyenv activate py3_11_6
django-admin startproject myapp
tree./

-> 프로젝트 myapp 생성

 

-> myapp 내부의 settings.py의 세부 내용 변경

 

python manage.py migrate
  • migrate: 실제 데이터베이스에 변경사항을 저장하는 명령어
python manage.py runserver
  • runserver: django 프로젝트 실행 
  • 0.0.0.0:8000 -> 8000번 포트를 활용하겠다는 의미

5.3.2. django 이미지 빌드

django 프로젝트를 컨테이너 이미지로 빌드하는 과정은 다음과 같다.

  1. directory 정리
  2. requirements.txt 파일 작성
  3. Dockerfile 파일 작성
  4. Image build

1. directory 정리

cp -r ex02 ex03
cd ex03
tree ./ -L 3

-> ex02 복사한 ex03 생성

 

 

2. requirements.txt 파일 작성

django==4.2.7

-> myapp과 같은 위치에 requirements 작성

 

3. Dockerfile 파일 작성

FROM python:3.11.6

WORKDIR /usr/src/app

COPY . .

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt

WROKDIR ./myapp

CMD python manage.py runserver 0.0.0.0:8000
EXPOSE 8000
  • FROM: 베이스 이미지 -> 우리가 생성할 이미지 파일의 베이스가 python:3.11.6
  • WORKDIR: 리눅스의 cd와 비슷한 명령어 -> 해당 작업 directory로 전환할 때 사용
  • COPY <호스트 파일 경로>:<이미지 파일 경로>: 호스트에 존재하는 파일을 Docker Image의 파일 시스템 경로로 복사하는 명령어 -> myDjango01 디렉터리 내부에 존재하는 파일을 이미지 파일 경로인 /usr/src/app 디렉터리로 복사한다는 의미
  • RUN: 이미지 빌드 시 실행하고 싶은 명령어가 있을 때 사용 -> requirements.txt 파일 내부에 존재하는 프로그램 설치
  • CMD -> 서비스 실행
CMD와 RUN의 차이
- RUN: 이미지 빌드 시 실행되는 명령어를 입력하는 명령어
- CMD: 컨테이너 실행 시 실행되는 명령어를 입력
  • EXPOSE -> 8000번 port open

 

4. Image building

  • build: 도커 이미지 생성 -> .(current directory를 이미지로 빌드하겠다는 의미), -t(이미지 태그를 정할 때 사용하는 옵션)
docker image build . -t myweb01

 

-> 이미지를 성공적으로 생성

 

5.3.3. django 컨테이너 실행

docker container run -d -p 8000:8000 myweb01

-> 생성한 docker image를 바탕으로 container 형태로 배포

-> -d: 백그라운드 실행 옵션, -p <도커 호스트 포트>:<컨테이너 포트>: 포트포워딩하는 옵션

 

 

docker network inspect bridge | grep IPv4Address

-> inspect 명령어로 실행중인 컨테이너의 IP 주소 확인

 

-> Host에서 웹 브라우저 주소창에 127.0.0.1:8000을 입력 -> 포트포워딩을 통해 django가 실행 중인 10.0.2.4:8000과 통신하여 해당 서비스를 이용

 

5.4. Ngix, django 연동 후 실행

도커를 이용해 Ngix 컨테이너 배포

FROM nginx:1.25.3
CMD ["nginx", "-g", "daemon off;"]
  • FROM: 이미지 빌드 시 필요한 베이스 이미지 선정
  • CMD: []를 사용할 시에 명령어 전체가 문자열로 인식됨 -> json 형태로 전달됨
  • 컨테이너를 활용해 Ngix를 실행할 때는 daemon off 옵션을 활용해  foreground로 실행
docker image build . -t myngix01

-> 이미지 생성

 

docker container run -p 80:80 -d myngix01

-> 컨테이너 실행 -> host port 80, container port 80

 

docker container exec -it 131da0eb620f /bin/bash
cd /etc/nginx//conf.d/
cat default.conf

-> 위 작업을 통해서 ngix 내부 설정 파일 확인

 

 

5.4.2. gunicorn을 통한 연동

앞서 생성한 django와 Nginx 연동

  • django와 Nginx를 연동하기 위해서는 -> 중간에 gunicorn 필요

 

5.4.3. django 이미지 빌드

  1. django 디렉터리 정리
  2. django 이미지 빌드
  3. Nginx 디렉터리 정리
  4. Nginx 이미지 빌드
  5. 컨테이너 실행

 

1. django directory 정리

mkdir ex05
cp -r ex03 ex04 ex05
cd ex05
mv ex03 myDjango02
mv ex04 myNginx02

-> ex03과 ex04를 ex05 내부에 복사 붙여넣기

-> mv 명령어로 파일명 변경

 

 

 

django==4.2.7.
gunicorn==20.1.0
FROM python:3.11.6

WORKDIR /usr/src/app

COPY . .

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt

WORKDIR ./myapp
CMD gunicorn --bind 0.0.0.0:8000 myapp.wsgi:application

EXPOSE 8000

-> myDjango02의 requirements.txt와 Dockerfile 수정

 

2. django 이미지 빌드

docker image build . -t myweb02

 

3. Nginx 디렉터리 정리

upstream myweb{
    server djangotest:8000;
}

server{
    listen 80;
    server_name localhost;

    location /{
        proxy_pass http://myweb;
    }
}

-> myNginx02에 default.conf 생성

-> djangotest: django를 이용해 생성하게 될 컨테이너 이름

-> Nginx는 80번 포트로 받은 요청을 djangotest 컨테이너의 8000번 포트로 전송한다는 의미

 

FROM nginx:1.25.3
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]

-> Dockerfile 수정

-> Nginx에서 사용하는 설정 파일 default.conf를 삭제

-> 앞서 생성한 default.conf 파일을 이미지 내부의 /etx/nginx/conf.d/ 경로로 복사

 

4. Nginx 이미지 빌드

docker image build . -t mynginx02

 

5. django와 Nginx 연동 후 container 실행

-> docker network 생성

 

 

docker container run -d --name djangotest --network mynetwork02 myweb02
docker container run -d --name nginxtest --network mynetwork02 -p 80:80 mynginx02

  • -d: 백그라운드 실행, --name: 컨테이너 이름 djangotest, --network: 사용할 네트워크는 mynetwork02
  • -p: 호스트의 80번 포트와 컨테이너의 80번 포트 연결

 

5.5. Nginx, django, PostgreSQL 컨테이너 연동

5.5.1. PostgreSQL 컨테이너 실행

파일명: Dockerfile

FROM postgres:15.4

-> 기본 베이스 이미지 postgres:15.4

 

docker image build . -t mypostgres03

docker volume create myvolume03

docker container run -e POSTGRES_PASSWORD=mysecretpassword --mount type=volume,source=myvolume03,target=/var/lib/postgresql/data -d mypostgres03

-> PostgreSQL과 연동할 volume 생성

-> container 실행할 때, --mount 옵션으로 도커 볼륨과 관련된 내용 설정

 

5.5.2. django, Nginx, PostgreSQL 연동

 

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'mysecretpassword',
        'HOST': 'postgrestest',
        'PORT': 5432,
    }
}

-> myDjango03의 myapp/myapp/settings.py 파일의 DATABASES 부분 수정

-> 'HOST' 항목에는 postgreSQL 컨테이너 이름

 

-> requirements.txt에 psycopg2==2.9.9 추가

 

이대로 이미지 빌드

 

5.5.4. Nginx 이미지 빌드

기존과 동일하게 빌드

 

5.5.5. django, Nginx, PostgreSQL 연동 후 컨테이너 실행

  • 호스트에서 웹 브라우저 실행 후 127.0.0.1:80에 접속 -> 포트포워딩을 통해 10.0.2.4:80으로 트래픽 전달 
  • nginxtest 컨테이너를 거쳐 djangotest 컨테이너에 접속 가능 -> djangotest 컨테이너는 postgrestest 컨테이너를 통해 DB 활용
docker container run --name postgrestest \
--network mynetwork03 \
-e POSTGRES_PASSWORD=mysecretpassword \
--mount type=volume,source=myvolume03,target=/var/lib/postgresql/data \
-d mypostgres03

docker container run -d --name djangotest --network mynetwork03 myweb03

docker container run -d --name nginxtest --network mynetwork03 -p 80:80 mynginx03

 

성공적으로 접속

 

  • docker container exec -> djangotest 컨테이너 내부에 접속해서 셀 실행
  • 데이터베이스 연결 상태를 확인하기 위해 inspectdb, makemigrations, migrate 명령어 입력

 

5.6. Nginx, django와 로컬 PostgreSQL 연동

Nginx와 django는 컨테이너 형태로 실행, PostgreSQL은 로컬에 설치한 후 연동

 

5.6.1. PostgreSQL

brew install postgresql

-> 설치

 

brew services start postgresql
psql postgres

-> 서비스 시작

-> postgresql 접속

 

\list
\password
\q
  • \list: 데이터베이스 목록 확인
  • \password: 암호 설정
  • \q: postgresql 종료

 

cd /opt/homebrew/var/postgresql@14

 

파일명: pg_hba.conf

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             0.0.0.0/0               scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 trust

-> 외부 접근을 허용하기 위해 pg_hba.conf 수정

 

파일명: postgresql.conf

 

brew services restart postgresql

-> postgresql 재시작

 

5.6.2. django 이미지 빌드

  • user는 \list에서 나타난 owner와 같게 입력해야 함
  • 로컬 DB 이용 -> myapp/myapp/settings.py의 DATABASE의 HOST 부분을 내 ip 주소로 변경 (public이 아닌 local ip 사용해야 함!!)
  • port는 ''
  • 나머지는 수정 없이 image building

 

5.6.3. Nginx 이미지 빌드

-> 수정 없이 빌드

 

5.6.4. django, Nginx, PostgreSQL 연동

docker container run -d --name djangotest --network mynetwork04 myweb04
docker container run -d --name nginxtest --network mynetwork04 -p 80:80 mynginx04

 

성공적으로 접속

 

docker container exec -it [container id] /bin/bash

 

 

5.7. Docker compose를 활용한 컨테이너 실행

5.7.1. Docker compose 개념

  • Docker compose: 도커를 활용해 다수의 컨테이너 형태의 application을 실행할 수 있는 도구
  • 실행하고자 하는 application의 설정 -> YAML 파일로 작성하는 방식

 

5.7.2. Docker compose 설치

brew install cask docker-compose

 

5.7.3. 디렉토리 설정

ex07과 동일하게 진행

 

5.7.4. docker-compose.yml 파일 작성

파일명: docker-compose.yml

version: "3"	

services:	
  djangotest:	
    build: ./myDjango03	
    networks:		
      - composenet01
    depends_on:	
      - postgrestest
    restart: always

  nginxtest:		
    build: ./myNginx03
    networks:
      - composenet01
    ports:	
      - "80:80"
    depends_on:
      - djangotest
    restart: always

  postgrestest:	
    build: ./myPostgres03
    networks:
      - composenet01
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: postgres
    volumes:	
      - composevol01:/var/lib/postgresql/data
    restart: always	

networks:
  composenet01:

volumes:	
  composevol01:

 

  • depends_on -> 컨테이너 실행 순서 설정 -> postgrestest가 입력되어 있다면 postgrestest 먼저 실행한 후 djangotest 나중에 실행
  • restart: always -> 컨테이너가 정지되면 재실행

 

5.7.5. 빌드 및 실행

docker-compose.yml을 엉뚱한 곳에 생성해서 옮겨야 할 일이 생겨 terminal 명령어를 찾아봤다.
mv "옮길 파일 혹은 폴더" "옮길 경로"


mv docker-compose.yml /Users/sangyeong_park/ce/study/DockerKuber/work/ch05/ex09

 

docker-compose up -d --build

-> docker-compose.yml에 포함된 모든 컨테이너 실행

 

docker-compose down

-> container 한 번에 정지

 


참고자료

  • "한 권으로 배우는 도커 & 쿠버네티스", 장철원, 한빛미디어, 2024.04.29