일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PCA
- ChatGPT
- 딥러닝
- LG Aimers
- OpenAI
- 오블완
- supervised learning
- LG
- gpt
- 해커톤
- GPT-4
- deep learning
- 지도학습
- 분류
- 회귀
- Machine Learning
- AI
- 머신러닝
- LG Aimers 4th
- LLM
- 티스토리챌린지
- regression
- Classification
- Today
- Total
SYDev
[Docker & Kubernetes] 3주차 정리 (1) 본문
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 프로젝트를 컨테이너 이미지로 빌드하는 과정은 다음과 같다.
- directory 정리
- requirements.txt 파일 작성
- Dockerfile 파일 작성
- 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 이미지 빌드
- django 디렉터리 정리
- django 이미지 빌드
- Nginx 디렉터리 정리
- Nginx 이미지 빌드
- 컨테이너 실행
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
'KHUDA 6th > Study' 카테고리의 다른 글
[Docker & Kubernetes] Port Forwarding이란? (1) | 2024.08.06 |
---|---|
[Docker & Kubernetes] 3주차 정리 (2) - Chapter 6. 도커를 활용한 Flask 실행 (0) | 2024.08.05 |
[핸즈온 AWS] 1주차 실습 (0) | 2024.07.31 |
[핸즈온 AWS] Chapter 3. AWS 네트워킹 서비스 (0) | 2024.07.31 |
[Docker & Kubernetes] 2주차 정리 (0) | 2024.07.30 |