๐ก ๊ฐ์
Waytothem ์ด๋ผ๋ Django ๋ฐฑ์๋ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌ๋ ๋ธ๋ก๊ทธ๊ฐ ํ๋ ์๋ค.
ํด๋น ๋ธ๋ก๊ทธ์ ๊ฒฝ์ฐ Lightsail 5๋ฌ๋ฌ Plan ์ง๋ฆฌ ์ธ์คํด์ค ์์์ ๊ฑฐ์ 1๋ 6๊ฐ์ ๊ฐ ์ด์ ์ค์ ์๊ณ ํ๋์ ์ธ์คํด์ค์ ๋์ปค ์ปดํฌ์ฆ๋ก Nginx + Certbot + DB(Postgresql) + App์ด ๊ธฐ๋๋๋ค.
ํ์ฌ ํด๋น ๋ธ๋ก๊ทธ์ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ์ ๋ง ๋จ์ํ๋ค.
- ๋ก์ปฌ์์ ์์ค์ฝ๋ ์
๋ฐ์ดํธ ํ ๊นํ๋ธ์ ์
๋ก๋ (
git push
) - Lightsail ์ธ์คํด์ค์ SSH ์ ์ ํ ๋ณ๊ฒฝ๋ ์ฝ๋ ์
๋ฐ์ดํธ (
git pull
) docker-compose up -d --build
(Re-building)
์ ๋จ๊ณ๋ก ์ง์ "์๋"์ผ๋ก ๊ฐ๋ฐ์(๋)๊ฐ ์๋น์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
์ด๋ ์๊ฐ, ์ด ๊ณผ์ ์ด ๋๋ฌด ๊ท์ฐฎ๊ฒ ๋๊ปด์ง๋๋ผ. ํ์ง๋ง ์๋ ๊ฑฐ๋ผ๊ณค ์๋ ๋ฐฐํฌ๋ฐ์ ํ ์ค ๋ชฐ๋ผ์ ๋ฐฐํฌ ์๋ํ์ ๋ํด ๊ณ์ ๊ณต๋ถํ๊ธฐ ์์ํ๋ค.
Travis CI, Jenkins ๋ฑ์ ๊ณต๋ถํด๋ดค๋๋ฐ ๋ํํ
๋ Github Actions ๋งํผ ๊ฐํธํ๊ณ ์ฌ์ด๊ฒ ์๋๋ผ.
ํ์ง๋ง ํด๋น ํ๋ก์ ํธ์ ๋จ์ ํ
์คํธ ์ฝ๋๋ ์์ฑํ์ง ์์์ด์ ํ
์คํธ ํ์ดํ๋ผ์ธ์ ์์ฑํ ์๋ ์์๋ค.
1์ธ ๊ฐ๋ฐ์ด๊ธฐ๋ ํ๊ณ ํด์ ์กฐ๊ธ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌ ์๋ํ ํ์ดํ๋ผ์ธ์ ๋์
ํ๋ ค๊ณ ํ๋ค.
์์ค์ฝ๋ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด ์๋์ผ๋ก ๋ฐฐํฌํ๋ ์์ผ๋ก ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด์!
๐ Container Topology
๐ ๊นํ๋ธ ์์ค์ฝ๋
https://github.com/JaehyoJJAng/Python_Web_Development_2022
๐ ์ฌ์ ์ค๋น
1. SSH Key ์์ฑ
Github Actions์์ SSH๋ก Lightsail์ ์ ์ํ๊ธฐ ์ํด์๋ ๋ก์ปฌ์ SSH Key๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
์์๋ ์๋์ ๊ฐ๋ค.
- 1.
ssh-keygen
๋ช ๋ น์ด๋ก ๋ก์ปฌ~/.ssh
๊ฒฝ๋ก์ 'github_id_rsa' ๋ผ๋ ์ด๋ฆ์ ssh key pair๋ฅผ ์์ฑํ๋ค. - 2. ์์ฑ๋ ํค ํ์ด ์ค 'github_id_rsa' Private key ํ์ผ์ ๋ด์ฉ์
cat
์ปค๋งจ๋๋ก ์ฝ์ ํ ๋ณต์ฌํ์ฌ [https://github.com/JaehyoJJAng/Python_Web_Development_2022] ๋ ํฌ์งํ ๋ฆฌ์ secret ํ๊ฒฝ ๋ณ์๋ก ๋ฃ์ด์ค๋ค.
๋จผ์ ๋ก์ปฌ์ ssh key๋ฅผ ์์ฑํ์.
ssh-keygen -t rsa -b 4096 -C "github actions" -f ~/.ssh/github_id_rsa
๐บ authorized_keys
Lightsail ์๋ฒ์
~/.ssh/authorized_keys
ํ์ผ์ 'github_id_rsa' Private Key ํ์ผ์ ๋ด์ฉ์ด ์ถ๊ฐ๋์ด ์์ด์ผ ํ๋ค.
2. github secret ๋ฑ๋ก
์์ฑ๋ github_id_rsa.pub ํ์ผ์ ๋ด์ฉ์ ๋ณต์ฌํ ํ https://github.com/JaehyoJJAng/Python_Web_Development_2022์ Settings - Security - Secrets and variables - Actions๋ก ์ด๋ํ์ฌ 'New repository secret'์ ํด๋ฆญํ์.
'SSH_PRIVATE_KEY' ๋ผ๋ ์ด๋ฆ์ผ๋ก ํค ๋ค์์ ์ ํ๊ณ 'secret' ํญ๋ชฉ์๋ ์์์ ๋ณต์ฌํ๋ 'github_id_rsa' ๊ฐ์ธ Private key ํ์ผ์ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๊ธฐ ํ์.
๊ทธ๋ฆฌ๊ณ Lightsail ์ธ์คํด์ค์ Public IP, SSH๋ก ์ ์ํ Username๋ช
, ๋ก์ปฌ์ SSH known_host ํ์ผ ๋ด์ฉ์ secret์ผ๋ก ๋ง๋ค์ด์ค ํ ๊ฐ์ ๋ฃ์ด์ฃผ์.
๊ทธ๋ฆฌ๊ณ github actions์์ Docker hub์ ๋ก๊ทธ์ธ๋ ํด์ผํ๋ฏ๋ก docker hub ๋ก๊ทธ์ธ ๊ด๋ จ ์ ๋ณด๋ ์์ฑํด์ฃผ์.
3. Django Allowed hosts
๊ฐ๋น์ ๋๋ฉ์ธ์ lightsail ์ธ์คํด์ค์ ์ฐ๊ฒฐํ์์ผ๋ฏ๋ก Django ํ๋ก์ ํธ์ ALLOWED_HOSTS์ ํด๋น ๋๋ฉ์ธ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
vi ./Python_Web_Development_2022/WTT/.env.prod
...
# ํด๋น ๋ณ์์ ๋๋ฉ์ธ๋ช
์ถ๊ฐ
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] 3.x.x.x. waytothem.store www.waytothem.store
...
4. .dockerignore
์ปจํ ์ด๋ ์ด๋ฏธ์ง์ .env ๊ฐ์ ํ๊ฒฝ ๋ณ์๊ฐ ํฌํจ๋ ์ฑ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ Public registry์ ๋ฐฐํฌ ๋๋ ๊ฒฝ์ฐ ์ฌ๊ฐํ ๋ณด์ ์ํ์ ๋นํ ์ ์๊ฒ๋๋ค.
๊ทธ๊ฑธ ๋ฐฉ์งํ๊ณ ์ Dockerfile์ด ์กด์ฌํ๋ WTT/ ๋๋ ํ ๋ฆฌ ๋ด์ .dockerignore๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
vi ./WTT/.dockerignore
.env.prod
.env.dev
.env.prod.db
Dockerfile
django_ํ๋ก์ ํธ์์ฑ.txt
๐ docker compose ์์
๊ธฐ์กด docker-compose.yaml์ ๊ฒฝ์ฐ ํ๋ก์ ํธ ๋ด์ Dockerfile์ ์ฐธ์กฐํ์ฌ ์ด๋ฏธ์ง๊ฐ ๋น๋๋๋๋ก ์ค์ ๋์ด์๋ค.
version: '3.2'
services:
nginx:
build: ./nginx
...
web:
build:
context: ./WTT
dockerfile: Dockerfile
...
db:
image: postgres:12.0-alpine
...
db ์ปจํ ์ด๋๋ฅผ ์ ์ธํ nginx, web ์ปจํ ์ด๋๊ฐ ํ์ฌ ํ๋ก์ ํธ ๋ด์ Dockerfile์ ์ฐธ์กฐํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์๋ค.
์ถํ์ Github Actions๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋น๋/๋ฐฐํฌํ๊ณ ๋ฐฐํฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋์ปค ํ๋ธ์์ ๋ฐ์์ฌ ๊ฒ์ด๊ธฐ์ ์๋์ฒ๋ผ ๋ฏธ๋ฆฌ ์์ ํด์ฃผ์.
version: '3.2'
services:
nginx:
image: <YourDockerUserName>/wtt-nginx:latest # ๋์ปค ํ๋ธ์ ๋ฐฐํฌ๋ ์ด๋ฏธ์ง ์ฌ์ฉ
...
web:
image: <YourDockerUserName>/wtt-web:latest # ๋์ปค ํ๋ธ์ ๋ฐฐํฌ๋ ์ด๋ฏธ์ง ์ฌ์ฉ
...
db:
image: postgres:12.0-alpine
...
๐ ๋ฐฐํฌ
๋ฐฐํฌ ์ ์ฌ์ฉ๋๋ ํ๋ก์ ํธ๋ ๊นํ๋ธ ์์ค์ฝ๋์ ๋งํฌ๋ ๊นํ๋ธ ์ฃผ์์ ์ ๋ก๋ ๋์ด์๋ค.
1. workflow
ํ์ฌ ํ๋ก์ ํธ ๊ฒฝ๋ก(~/Python_Web_Development_2022)์ .github/workflows/BlogDeploy.yaml
ํ์ผ์ ๋ง๋ค์.
mkdir -p .github/workflows && touch .github/workflows/BlogDeploy.yaml
2. workflow ์์ฑ
BlogDeploy.yaml ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๊ธฐ ํ์.
name: BlogDeploy
on:
push:
branches:
- "main"
jobs:
deploy_job:
runs-on: ubuntu-22.04
steps:
- name: "[Checkout] 1. Checkout repository"
uses: actions/checkout@v3
- name: "[Docker Login] 2. Dockerhub Login"
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: "[Build] 3. nginx image build & push"
uses: docker/build-push-action@v2
with:
context: ./nginx # Dockerfile์ด ์๋ ๋๋ ํ ๋ฆฌ ์ง์
push: true
tags: |
<YourDockerUserName>/wtt-nginx:latest
- name: "[Build] 4. WTT image build & push"
uses: docker/build-push-action@v2
with:
context: ./WTT
push: true
tags: |
<YourDockerUserName>/wtt-web:latest
- name: "[Deploy] 5. Set up SSH"
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" | tee -a ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
- name: "[Deploy] 6. Set up Known hosts"
run: |
echo "${{ secrets.SSH_KNOWN_HOST }}" | tee -a ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
- name: "[Deploy] 7. SSH and Deploy"
run: |
ssh -i ~/.ssh/id_rsa ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_PUBLIC_IP }}"
cd Python_Web_Development_2022
docker-compose -f docker-compose.yml up -d --build
"
3. workflow ๋ฐฐํฌ
workflow ์์ฑ์ด ๋ค ๋๋ฌ๋ค๋ฉด commit & push๋ฅผ ํ์.
git add .
git commit -m "Update BlogDeploy Workflow"
git push -u origin main
https://github.com/JaehyoJJAng/Python_Web_Development_2022 ๋ ํฌ์งํ ๋ฆฌ์ Actions ํญ์ผ๋ก ์ด๋ํ์ฌ workflow๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํ์.
๋ฐฐํฌ๋ ์ฑ๊ณต์ ์ผ๋ก ๋ ๊ฒ ๊ฐ๋ค!
์ด๋ฒ์๋ ๋๋ฌธ ํ์ด์ง์ ํ ์คํธ๋ฅผ ์๋์ฒ๋ผ ๋ณ๊ฒฝํ๊ณ ๋ค์ push ํด๋ณด์.
$ vi ./WTT/single_pages/templates/landing.html
<section id="body-wrapper">
<div class="container">
<div class="row justify-content-between">
<div class="col-lg-6 text-muted">
<h1 class="mt-5 text-center text-dark text">IT</br>์ฝ๋ฉ ๋ธ๋ก๊ทธ</h1>
<div class="card mt-1">
<div class="card-body">
<p class="text-center" style="font-size: 150%;">
</br>ํ์ด์ฌ๊ณผ ๋์ปค</br>๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋
์ค์ ์
ธ ์คํฌ๋ฆฝํ
์</br>๋ง์ ๊ด์ฌ์ด ์์ต๋๋ค!
</br>
<span style="font-size: 80%;">
</br>ํด๋น ๋ธ๋ก๊ทธ๋ IT ์ค์ต ๊ด๋ จํ์ฌ</br>๋ง์ ๊ธ์ด ์ฐ์ฌ์ง ์์ ์
๋๋ค.
</span>
</p>
</div>
</div>
</div>
...
</section>
git add .
git commit -m "landing ํ์ด์ง ๋๋ฌธ ๊ธ ์์ "
git push -u origin main
๋ฐฐํฌ๋ ์ ์์ ์ผ๋ก ๋ ๊ฒ ๊ฐ๋ค.
http://www.waytothem.store
๋ก ์ ์ํด ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฉ ๋๋์ง ํ์ธํ์.
์ ์ ์ฉ๋๋ค!
4. HTTPS ์ ์ฉ
๋ง์ง๋ง์ผ๋ก ์๋น์ค์ HTTPS๋ฅผ ์ ์ฉํด๋ณด๋๋ก ํ์.
๋ฌด๋ฃ SSL ์ธ์ฆ์์ธ Let's Encrypt๋ฅผ ์ด์ฉํ ๊ฑฐ๊ณ ์คํ ์์ค์ธ certbot์ ์ฌ์ฉํ์ฌ SSL ์ธ์ฆ์๋ฅผ ์๋์ผ๋ก ๋ฐ๊ธ ๋ฐ์ ๊ฒ์ด๋ค.
๋จผ์ Let's Encrypt๋ฅผ nginx + ๋์ปค ํ๊ฒฝ์์ ์๋์ผ๋ก ์ธ์ฆ ๋ฐ์ ์ ์๋๋ก ๋์์ฃผ๋ ์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์์ผ ํ๋ค.
(nginx-certbot(github))
curl -L -O https://github.com/wmnnd/nginx-certbot/raw/master/init-letsencrypt.sh
๋ค์ด๋ก๋ ๋ฐ์์ผ๋ฉด init-letsencrypt.sh ๋ด์ฉ ์ค ์ผ๋ถ๋ถ์ ์๋์ฒ๋ผ ์์ ํด์ค์ผ ํ๋ค.
#!/bin/bash
if ! [ -x "$(command -v docker-compose)" ]; then
echo 'Error: docker-compose is not installed.' >&2
exit 1
fi
domains=(waytothem.store www.waytothem.store) # ๋ณธ์ธ ๋๋ฉ์ธ ์ฃผ์ ์
๋ ฅ
rsa_key_size=4096
data_path="./data/certbot" # ์ธ์ฆ์๋ฅผ ์ ์ฅํ ๊ฒฝ๋ก ๊ธฐ์
(ํ์๋ ๊ธฐ๋ณธ ์
๋ ฅ๋ ๊ฒฝ๋ก ๊ทธ๋๋ก ์ฌ์ฉํจ.)
email="๋ด ์ด๋ฉ์ผ ์ฃผ์ ๊ธฐ์
"
... // ๊ทธ ์ธ์ ์ค์ ์ ๊ฑด๋๋ฆด๊ฒ ์์. ๋ํดํธ๋ก ๋
๋๊ธฐ
๊ธฐ์กด docker-compose.yaml ํ์ผ์ ์ถ๊ฐ ๋ฐ ์์ ํด์ค์ผ ํ ๊ฒ์ด ์๋ค.
version: "3.3"
services:
nginx:
image: yshrim12/wtt-nginx:latest
volumes:
- type: volume
source: "static_volume"
target: "/usr/src/app/_static"
- type: volume
source: "media_volume"
target: "/usr/src/app/_media"
- "./data/certbot/conf:/etc/letsencrypt"
- "./data/certbot/www:/var/www/certbot"
ports:
- "80:80"
- "443:443"
depends_on:
- "web"
container_name: nginx
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: always
volumes:
- "./data/certbot/conf:/etc/letsencrypt"
- "./data/certbot/www:/var/www/certbot"
container_name: certbot
depends_on:
- "nginx"
networks:
- "web-net"
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
# ... My Apps (web, db)...
web:
...
db:
...
- nginx ์ปจํ
์ด๋์ volumes์ certbot ์ธ์ฆ์๊ฐ ์์ฑ๋ ๊ฒฝ๋ก๋ฅผ ์ก์์ฃผ์๋ค.
- volumes์ ๊ฒฝ์ฐ init-letsencrypt.sh์์ ์์ ํ data_path ๊ฒฝ๋ก์ ๋์ผํด์ผ ํ๋ค.
- nginx ์ปจํ ์ด๋์ command ์ต์ ์ ์ถ๊ฐํ์๋ค.
- certbot ์ปจํ ์ด๋๋ฅผ ์์ ๊ฐ์ด ๋ง๋ค์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด nginx.conf ํ์ผ๋ ์๋์ฒ๋ผ ์์ ํด์ค์ผ ํ๋ค.
๊ธฐ์กด nginx.conf ๋ด์ฉ
upstream greedy_jaehyo {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://greedy_jaehyo;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /usr/src/app/_static/;
}
location /media/ {
alias /usr/src/app/_media/;
}
}
์์ ๋ nginx.conf ๋ด์ฉ
upstream wtt {
server web:8000;
}
server {
listen 80;
server_name waytothem.store;
location / {
return 301 https://$host$request_uri;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name waytothem.store;
location / {
proxy_pass http://wtt;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /usr/src/app/_static/;
}
location /media/ {
alias /usr/src/app/_media/;
}
ssl_certificate /etc/letsencrypt/live/waytothem.store/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/waytothem.store/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
์ด์ ๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ๋ค.
๋จผ์ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ์๋ init-letsencrypt.sh
ํ์ผ์ ์คํ ๊ถํ์ ๋ถ์ฌํ์.
chmod +x ./init-letsencrypt.sh
์ด์ sudo
๊ถํ์ผ๋ก ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ๋๋ค.
sudo bash ./init-letsencrypt.sh
[Other Projects] ๐ฅ [Docker] certbot + nginx๋ก SSL ์ธ์ฆ์ ๋ฐ๊ธํ๊ธฐ - ๋ด๊ฐ ๋ง๋ ์ฌ์ดํธ์ HTTPS ์ค์ ํ๊ธฐ
๐บ ๋ณด์ ์ด์
tree -L 2 .
.
โโโ WTT
โ โโโ Dockerfile
โ โโโ _media
โ โโโ _static
โ โโโ accountapp
โ โโโ blog
โ โโโ board
โ โโโ django_ํ๋ก์ ํธ์์ฑ.txt
โ โโโ do_it_django_prj
โ โโโ manage.py
โ โโโ profileapp
โ โโโ requirements.txt
โ โโโ single_pages
โ โโโ .env.prod
โ โโโ .env.prod.db
โ โโโ .env.dev
โ โโโ templates
โโโ docker-compose.dev.yml
โโโ docker-compose.yml
โโโ migrate.sh
โโโ nginx
โ โโโ Dockerfile
โ โโโ nginx.conf
โโโ venv
โโโ bin
โโโ include
โโโ lib
โโโ lib64 -> lib
โโโ pyvenv.cfg
16 directories, 10 files
ํ์ฌ ํ๋ก์ ํธ ๊ฒฝ๋ก์ธ WTT/ ๋๋ ํ ๋ฆฌ ํ์์ .env ํ๊ฒฝ ๋ณ์๋ค์ด ์์นํด์๋ค.
.dockerignore์ ํด๋น ํ๊ฒฝ ๋ณ์ ํ์ผ๋ค์ ๋ฃ์์์๋ ์ปจํ ์ด๋์ ๋ฐ์์ด ๋๊ธธ๋ ๋ฌด์จ ์ด์ ์ธ์ง ํ์ธํด๋ณด๋ ์๋ ์ด์ ๋๋ฌธ์ด์๋ค!
version: '3.2'
services:
nginx:
image: yshrim12/wtt-nginx:latest
web:
image: yshrim12/wtt-web:latest
...
volumes:
...
- type: bind
source: "./WTT"
target: "/usr/src/app"
env_file:
- "./WTT/.env.prod"
...
db:
image: postgres:12.0-alpine
volumes:
- type: volume
source: "postgres_data"
target: "/var/lib/postgresql/data"
env_file:
- "./WTT/.env.prod.db"
container_name: postgresql
...
web ์ปจํ
์ด๋์ volumes๋ฅผ ํ์ธํด๋ณด์. bind ๋งตํ์ผ๋ก ./WTT:/usr/src/app
๊ฒฝ๋ก๋ก ๋ง์ดํธ๊ฐ ์กํ์๋ค.
์๋ ๊ธ์ GPT์ ๋ต๋ณ์ด๋ค.
-
.dockerignore ํ์ผ์ Docker ๋น๋ ์ปจํ ์คํธ ๋ด์์ Docker์ ์ํด ์ฌ์ฉ๋๋ฉฐ, ์ด ํ์ผ์ ๋ช ์๋ ํจํด์ ๋ฐ๋ผ ๋น๋ ์ปจํ ์คํธ์ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๊ฐ Docker ๋น๋ ํ๋ก์ธ์ค์ ์ํด ์ ์ธ๋ฉ๋๋ค. ์ด ํ์ผ์ Docker ๋น๋ ๋จ๊ณ์์๋ง ์ํฅ์ ๋ฏธ์น๋ฉฐ, ์ด๋ฏธ์ง๊ฐ ์คํ ์ค์ธ ์ปจํ ์ด๋์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
-
์ฆ, .dockerignore ํ์ผ์ Dockerfile์์ COPY ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํธ ํ์ผ ์์คํ ์์ ์ด๋ฏธ์ง๋ก ๋ณต์ฌํ ๋๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ฏธ์ง๊ฐ ์คํ ์ค์ธ ์ปจํ ์ด๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ปจํ ์ด๋ ๋ด์ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ ์ ๊ทผ ๊ถํ ๋ฐ ๊ตฌ์ฑ์ ํด๋น ์ปจํ ์ด๋์ ์ค์ ๋ฐ ์คํ ํ๊ฒฝ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
-
๋ฐ๋ผ์ .dockerignore ํ์ผ์ ๋ช ์๋ ๋ด์ฉ์ด ์ปจํ ์ด๋์ ์ ์ฉ๋์ง ์์ ์ ์์ต๋๋ค. ์ปจํ ์ด๋์์ ํน์ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธํ๋ ค๋ฉด Dockerfile์ด๋ ์ปจํ ์ด๋ ์คํ ๋ช ๋ น์์ ํด๋น ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํด์ผ ํฉ๋๋ค.
-
์๋ฅผ ๋ค์ด, Dockerfile์์ COPY ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ .dockerignore ํ์ผ์ ๋ช ์๋ ํ์ผ์ด ๋ณต์ฌ๋์ง ์๋๋ก ํ๊ธฐ ์ํด์๋ COPY ๋ช ๋ น์ด์์ ํด๋น ํ์ผ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ฑฐ๋, Dockerfile ๋ด์์ ์ด ํ์ผ๋ค์ ์ญ์ ํ๋ ์์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
-
์ปจํ ์ด๋์์ ํน์ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธํ๋ ค๋ฉด Dockerfile ๋ด์์ ์ด์ ๋ํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํฉ๋๋ค. .dockerignore ํ์ผ์ Docker ๋น๋ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋๋ ๊ฒ์ด๋ฉฐ, ๋น๋ ์ปจํ ์คํธ ๋ด์ ํ์ผ์ Docker ์ด๋ฏธ์ง๋ก ๋ณต์ฌํ ๋๋ง ํด๋น ํ์ผ์ด ๋ฌด์๋๋๋ก ํ๋ ์ญํ ์ ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ./WTT ๋๋ ํ ๋ฆฌ ํ์์ ์๋ .env ํ๊ฒฝ ๋ณ์ ํ์ผ๋ค์ ๋ถ๋ชจ ๋๋ ํ ๋ฆฌ๋ก ๋นผ๋ด์์ผ ํ๋ค. ๋นผ๋ด์ค๊ธฐ ์ ์ .env ๋ผ๋ ์๋ก์ด ํด๋๋ฅผ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ์์ฑํ์.
$ pwd
/home/ubuntu/Python_Web_Development_2022
$ mkdir .env
$ mv ./WTT/.env* .env/
๊ทธ๋ฆฌ๊ณ docker-compose.yaml์์ web ์ปจํ
์ด๋์ db ์ปจํ
์ด๋์ env_file
์ต์
๋ ์๋์ฒ๋ผ ์์ ํ์.
...
web:
...
env_file:
- ".env/.env.prod"
db:
...
env_file:
- ".env/.env.prod.db"
๐บ ๊ทธ๋ผ ์ด์ ์ปจํ ์ด๋์ .env ํ๊ฒฝ ๋ณ์ ํ์ผ๋ค์ด ๊ฐ์ด ์ฌ๋ผ๊ฐ๋ ์ผ์ ์์ ๊ฒ์ด๋ค!