Ver5.0 ๐ณ Docker ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ, ์น๊ตฌํํ ์ค๋ช ํ๋ฏ ์์ ์ ๋ณตํ๊ธฐ

๐ณ Docker ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ, ์น๊ตฌํํ ์ค๋ช ํ๋ฏ ์์ ์ ๋ณตํ๊ธฐ
์ผ, ๋ ํน์ ์ด๋ฐ ๊ฒฝํ ์์ด?
๋ก์ปฌ์์๋ ์ ๋๋ ์ฑ์ ์ปจํ
์ด๋์ ๋ฃ์๋๋ ๊ฐ์๊ธฐ "DB ์ฐ๊ฒฐ ์คํจ"๊ฐ ๋จ๋ ๊ฑฐ. ์๋๋ฉด ๋ ๋ฌด์์ด ๊ฑฐ, ๊นํ๋ธ์ ์ฌ๋ฆฐ ์ด๋ฏธ์ง ์์ DB ๋น๋ฐ๋ฒํธ๊ฐ ๊ทธ๋๋ก ๋ฐํ ์๋ ๊ฑฐ. ๐ฑ
์ด ๋ ์ฌ๊ณ ์ ๊ณตํต์ ์ ๋ฑ ํ๋์ผ. ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ๋ฅผ ๋์ถฉ ํ๋ค๋ ๊ฒ. ์ค๋์ Docker์์ ํ๊ฒฝ๋ณ์๋ฅผ ์ด๋์, ์ด๋ป๊ฒ, ์ด๋ค ์์๋ก ๋ฃ๊ณ , ๋น๋ฐ๊ฐ์ ์ด๋ป๊ฒ ์จ๊ธฐ๋์ง ์ปคํผ ํ ์ ํ๋ฉด์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๋ฆฌํด๋ณผ๊ฒ. ์ง์ง ์ค๋ฌด์์ ๋ฐ๋ก ์จ๋จน์ ์ ์๋ ๊ฒ๋ง ๊ณจ๋ผ์์ด. โ
๐ค 1. ์ ๊ตณ์ด ํ๊ฒฝ๋ณ์๋ก ์ค์ ์ ๋ฃ์ด์ผ ํด?
์ด๊ฑด The Twelve-Factor App์ด๋ผ๋ ์ ๋ช ํ ๋ฐฉ๋ฒ๋ก ์์ ๋์จ ์์น์ด์ผ. 3๋ฒ์งธ ํญ๋ชฉ "Config"์์ "์ค์ ์ ์ฝ๋์ ๋ถ๋ฆฌํด์ ํ๊ฒฝ(environment)์ ์ ์ฅํ๋ผ"๊ณ ๋งํ๊ฑฐ๋ .
Docker๋ ์ด๊ฒ ์ฐฐ๋ก์ธ ์ด์ ๋ ๊ฐ๋จํด. ๋์ปค ์ด๋ฏธ์ง๋ ํ ๋ฒ ๋น๋ํ๋ฉด ๋ถ๋ณ(immutable)์ด์ผ. ๊ทธ๋ฐ๋ฐ ๊ฐ๋ฐยท์คํ ์ด์งยท์ด์ ํ๊ฒฝ๋ง๋ค DB ์ฃผ์, API ํค, ๋ก๊ทธ ๋ ๋ฒจ์ด ๋ค ๋ค๋ฅด์์? ํ๊ฒฝ๋ง๋ค ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ก ๋น๋ํ๋ฉด "์คํ ์ด์ง์์ ํ ์คํธํ ๊ทธ ์ด๋ฏธ์ง"๊ฐ ์ด์ ์ด๋ฏธ์ง๋ ๋ฌ๋ผ์ง๋ ๊ฑฐ์ผ. ๊ทธ๋ผ ํ ์คํธํ ์๋ฏธ๊ฐ ์์ง.
"์ด๋ฏธ์ง๋ ํ๋๋ง ๋น๋ํ๊ณ , ํ๊ฒฝ๋ณ์๋ง ๊ฐ์ ๋ผ์์ ์ด๋์๋ ์คํํ๋ค." ์ด๊ฒ Docker ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ์ ๋์ ์ ์ผ.
๐งฐ 2. ํ๊ฒฝ๋ณ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ ์ด์ ๋ฆฌ
Docker์์ ํ๊ฒฝ๋ณ์๋ฅผ ๋ฃ๋ ๊ธธ์ ์๊ฐ๋ณด๋ค ๋ง์. ํ๋์ฉ ๋ณด์.
โ Dockerfile์ ENV
FROM node:20-alpine
ENV NODE_ENV=production \
PORT=3000
WORKDIR /app
COPY . .
CMD ["node", "server.js"]
ENV๋ก ์ค์ ํ ๊ฐ์ ์ด๋ฏธ์ง ์์ ์ ์ฅ๋ผ์, ์ด ์ด๋ฏธ์ง๋ก ๋ง๋ ๋ชจ๋ ์ปจํ
์ด๋์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ค์ด๊ฐ. ๋น๋ ์ค๊ฐ์ RUN ๋ช
๋ น์์๋ ์ธ ์ ์๊ณ , ๋ฐํ์์๋ ๋จ์ ์์ด.
๊ทธ๋์ ๋น๋ฐ๋ฒํธ ๊ฐ์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ENV์ ๋ฃ์ผ๋ฉด ์ ๋ ์ ๋ผ. docker history๋ docker inspect๋ก ๋๊ตฌ๋ ๋ณผ ์ ์๊ฑฐ๋ .
โก Dockerfile์ ARG (๋น๋ ํ์ ์ ์ฉ)
ARG APP_VERSION=1.0.0
FROM node:20-alpine
ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
docker build --build-arg APP_VERSION=2.1.0 -t myapp .
ARG๋ ๋น๋ํ ๋๋ง ์กด์ฌํ๋ ๋ณ์์ผ. ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋๋ ์ฌ๋ผ์ ธ. ์ ์์ ์ฒ๋ผ ENV๋ก ์ฎ๊ฒจ ๋ด์์ผ ๋ฐํ์์์๋ ์ธ ์ ์์ง.
์ฌ๊ธฐ์ ์์ฃผ ํ๋ ์ฐฉ๊ฐ์ด ํ๋ ์์ด. "ARG๋ ๋น๋ ํ์ ์ฌ๋ผ์ง๋๊น ๋น๋ฐ๊ฐ ๋ฃ์ด๋ ๋๊ฒ ์ง?" โ ๋
ธ๋
ธ. ๊ณต์ ๋ฌธ์์์๋ ARG ๊ฐ์ docker history๋ก ๋
ธ์ถ๋ ์ ์์ผ๋ ๋น๋ฐ๊ฐ์ ์ฐ์ง ๋ง๋ผ๊ณ ๊ฒฝ๊ณ ํด. ๊ทธ๋ฆฌ๊ณ FROM ์์ ์ ์ธํ ARG๋ FROM ์ดํ์์ ์ฐ๋ ค๋ฉด ์์ฒ๋ผ ๋ค์ ARG APP_VERSION์ผ๋ก ์ ์ธํด์ผ ํด. ์๊ทผ ํท๊ฐ๋ฆฌ๋ ํฌ์ธํธ!
--build-arg๋ก ์ฃผ์
๋ฐํ์ ์ปจํ ์ด๋์ ์์
๋ฒ์ ยท๋น๋ ์ต์ ์ฉ
์ด๋ฏธ์ง์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ฅ
-e๋ก ๋ฎ์ด์ฐ๊ธฐ ๊ฐ๋ฅ์ฑ ๊ธฐ๋ณธ ์ค์ ์ฉ
โข docker run -e / --env-file
# ํ๋์ฉ ๋ฃ๊ธฐ
docker run -e DB_HOST=db.local -e LOG_LEVEL=debug myapp
# ํธ์คํธ์ ์ด๋ฏธ ์๋ ๋ณ์ ๊ทธ๋๋ก ์ ๋ฌ (๊ฐ ์๋ต)
export API_TOKEN=abc123
docker run -e API_TOKEN myapp
# ํ์ผ๋ก ํ ๋ฒ์
docker run --env-file ./prod.env myapp
-e VAR์ฒ๋ผ ๊ฐ์ ์๋ตํ๋ฉด ํธ์คํธ ์
ธ์ ๊ฐ์ ์ด๋ฆ ๋ณ์๋ฅผ ๋๊ฒจ์ค. ์ด ๋ฐฉ์์ ์
ธ ํ์คํ ๋ฆฌ์ ๊ฐ์ด ์ ๋จ๋๋ค๋ ์์ํ ์ฅ์ ๋ ์์ด.--env-file ํ์ผ์ KEY=VALUE ํ ์ค์ฉ ์ฐ๊ณ , #์ผ๋ก ์์ํ๋ ์ค์ ์ฃผ์์ด์ผ. ์ฃผ์ํ ์ ์ ๋ฐ์ดํ๊ฐ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ฒ๊ฒจ์ง์ง ์๊ณ ๊ฐ์ ๊ทธ๋๋ก ํฌํจ๋ ์ ์๋ค๋ ๊ฒ. PASSWORD="abc"๋ผ๊ณ ์ฐ๋ฉด ๋ฐ์ดํ๊น์ง ๊ฐ์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋, docker run์ฉ env ํ์ผ์์๋ ๋ฐ์ดํ ์์ด ์ฐ๋ ๊ฒ ์์ ํด.
โฃ Docker Compose์ environment / env_file
services:
api:
image: myapp:latest
environment:
NODE_ENV: production
DB_HOST: db
env_file:
- ./common.env
- ./api.env
db:
image: postgres:16
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_pw
secrets:
- db_pw
secrets:
db_pw:
file: ./secrets/db_password.txt
์ค๋ฌด์์ ๊ฑฐ์ ์ด๊ฑธ ์ฐ๊ฒ ๋ ๊ฑฐ์ผ. env_file์ ์ฌ๋ฌ ๊ฐ ๋์ดํ๋ฉด ์๋์ชฝ ํ์ผ์ด ์์ชฝ ๊ฐ์ ๋ฎ์ด์จ. ๊ณตํต ์ค์ + ์๋น์ค๋ณ ์ค์ ์ผ๋ก ๋๋๊ธฐ ์ข์ง.
โ ๏ธ 3. ๋ค๋ค ํ ๋ฒ์ฉ ๋นํ๋ ํจ์ : .env ํ์ผ์ ์ ์ฒด
์ฌ๊ธฐ๊ฐ ์ค๋์ ๊ฟํฌ์ธํธ์ผ. Compose ์ธ ๋ ํ๋ก์ ํธ ํด๋์ .env ํ์ผ๊ณผ env_file:๋ก ์ง์ ํ ํ์ผ์ ์ญํ ์ด ์์ ํ ๋ฌ๋ผ.
์:
image: myapp:${TAG}์ TAG๋ฅผ ์ฑ์์ปจํ ์ด๋ ์์ผ๋ก ์๋ ์ ๋ฌ๋์ง ์์
์ฑ์ด
process.env ๋ฑ์ผ๋ก ์ฝ์YAML ์นํ์๋ ์ฐ์ด์ง ์์
๊ทธ๋ฌ๋๊น .env์ DB_PASSWORD=1234 ์จ๋๊ณ "์ ์ปจํ
์ด๋์์ ์ ์ฝํ์ง?" ํ๊ณ ํ ์๊ฐ ๋ ๋ฆฌ๋ ๊ฑฐ, ์ง์ง ๊ตญ๋ฃฐ์ด์ผ. ๐ ์ปจํ
์ด๋์ ๋ฃ๊ณ ์ถ์ผ๋ฉด environment: DB_PASSWORD: ${DB_PASSWORD}์ฒ๋ผ ๋ช
์์ ์ผ๋ก ์ฐ๊ฒฐํ๊ฑฐ๋, env_file: .env๋ก ์ง์ ํด์ผ ํด.
# .env ๋ด์ฉ์ด ์ ๋๋ก ์นํ๋๋์ง ํ์ธํ๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ
docker compose config
docker compose config๋ ๋ณ์ ์นํ๊น์ง ๋๋ ์ต์ข
์ค์ ์ ๋ณด์ฌ์ค. ๋๋ฒ๊น
ํ ๋ ์ด๊ฑฐ ํ๋๋ฉด ๋ฐ์ ํด๊ฒฐ๋ผ.
์ฐธ๊ณ ๋ก Compose์ ๋ณ์ ์นํ ๋ฌธ๋ฒ๋ ์ธ๋ชจ๊ฐ ๋ง์. ${VAR:-default}๋ ๊ฐ์ด ์๊ฑฐ๋ ๋น์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ, ${VAR:?์๋ฌ๋ฉ์์ง}๋ ๊ฐ์ด ์์ผ๋ฉด ์คํ ์์ฒด๋ฅผ ๋ง์์ค. ํ์ ๋ณ์์ :? ๋ถ์ฌ๋๋ฉด ์ค์ ๋๋ฝ ์ฌ๊ณ ๋ฅผ ๋ฏธ๋ฆฌ ๋ง์ ์ ์์ง.
๐ฅ 4. ๋๊ฐ ์ด๊ธฐ๋? ํ๊ฒฝ๋ณ์ ์ฐ์ ์์
๊ฐ์ ๋ณ์๊ฐ ์ฌ๋ฌ ๊ณณ์ ์ค์ ๋ผ ์์ผ๋ฉด ๋ญ๊ฐ ์ด๊ธธ๊น? Docker ๊ณต์ ๋ฌธ์ ๊ธฐ์ค Compose์์ ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ์ฐ์ ์์๋ ์ด๋ (์๊ฐ ๊ฐ์ฅ ๊ฐํจ).
์ฆ Dockerfile์ ENV๋ "๊ธฐ๋ณธ๊ฐ", ์คํํ ๋ ๋ฃ๋ ๊ฐ์ด "์ต์ข
๊ฒฐ์ ๊ถ์"์ผ. ์ด ๊ตฌ์กฐ ๋๋ถ์ ์ด๋ฏธ์ง ํ๋๋ก ์ฌ๋ฌ ํ๊ฒฝ์ ์ปค๋ฒํ ์ ์๋ ๊ฑฐ์ง.
๊ทธ๋ฆฌ๊ณ YAML ์นํ์ฉ ๋ณ์์์๋ ์
ธ ํ๊ฒฝ๋ณ์๊ฐ .env ํ์ผ๋ณด๋ค ์ฐ์ ํด. CI์์ export TAG=v2 ํด๋๋ฉด .env์ TAG๋ณด๋ค ๋จผ์ ์ ์ฉ๋๋ค๋ ๋ป!
๐ 5. ๋น๋ฐ๊ฐ(Secret)์ ํ๊ฒฝ๋ณ์์ ๋ฃ์ด๋ ๋ ๊น?
์์งํ ๋งํ ๊ฒ. ์๊ท๋ชจ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํ๊ฒฝ๋ณ์๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฃ๋ ๊ฑด ํํ๊ณ , ๋น์ฅ ํฐ์ผ ๋์ง ์์. ํ์ง๋ง ์ด์ ํ๊ฒฝ์ด๋ผ๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ. ํ๊ฒฝ๋ณ์์๋ ์ด๋ฐ ์ฝ์ ์ด ์๊ฑฐ๋ .
โข
docker inspect ๊ฒฐ๊ณผ์ ํ๋ฌธ์ผ๋ก ๊ทธ๋๋ก ๋ณด์โข ์ฑ์ด ํฌ๋์ ๋๋ฉด์ ํ๊ฒฝ๋ณ์ ์ ์ฒด๋ฅผ ๋ก๊ทธ๋ ์๋ฌ ๋ฆฌํฌํธ์ ๋คํํ๋ ๊ฒฝ์ฐ๊ฐ ์์
โข ์์ ํ๋ก์ธ์ค์ ์๋ ์์๋จ
โข ๊ฐ์ ํธ์คํธ์์ ๊ถํ ์๋ ์ฌ์ฉ์๋
/proc/<pid>/environ์ผ๋ก ํ์ธ ๊ฐ๋ฅ๊ทธ๋์ Docker๋ ์ํฌ๋ฆฟ(Secrets) ๊ธฐ๋ฅ์ ์ ๊ณตํด. Compose์์ secrets๋ฅผ ์ฐ๋ฉด ๊ฐ์ด ์ปจํ
์ด๋ ์์ /run/secrets/<์ด๋ฆ> ํ์ผ๋ก ๋ง์ดํธ๋ผ. ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก์๋ ๋ํ๋์ง ์์ง.
์ Compose ์์ ์์ POSTGRES_PASSWORD_FILE์ ์ด ๊ฑฐ ๋ดค์ด? ๊ณต์ postgres, mysql ๊ฐ์ ์ด๋ฏธ์ง๋ _FILE ์ ๋ฏธ์ฌ ๊ท์น์ ์ง์ํด์, ๋ณ์ ๊ฐ ๋์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฃผ๋ฉด ๊ทธ ํ์ผ ๋ด์ฉ์ ์ฝ์ด ๋น๋ฐ๋ฒํธ๋ก ์จ. ๋ด ์ฑ์์๋ ๊ฐ์ ํจํด์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด.
# Python ์์: _FILE ๋ณ์๊ฐ ์์ผ๋ฉด ํ์ผ์์, ์์ผ๋ฉด ํ๊ฒฝ๋ณ์์์
import os
def get_secret(name):
file_path = os.getenv(f"{name}_FILE")
if file_path and os.path.exists(file_path):
with open(file_path) as f:
return f.read().strip()
return os.getenv(name)
db_password = get_secret("DB_PASSWORD")
๋น๋ ๊ณผ์ ์์ ๋น๋ฐ๊ฐ์ด ํ์ํ ๋(์: ํ๋ผ์ด๋น ํจํค์ง ์ ์ฅ์ ํ ํฐ)๋ BuildKit์ secret mount๋ฅผ ์จ. ์ด๊ฑด ์ด๋ฏธ์ง ๋ ์ด์ด์ ํ์ ์ด ์ ๋จ์.
# Dockerfile
# syntax=docker/dockerfile:1
FROM node:20-alpine
RUN --mount=type=secret,id=npm_token \
NPM_TOKEN=$(cat /run/secrets/npm_token) npm ci
# ๋น๋ ๋ช
๋ น
docker build --secret id=npm_token,src=./npm_token.txt -t myapp .
๋ ํฐ ๊ท๋ชจ๋ผ๋ฉด Kubernetes Secret, HashiCorp Vault, AWS Secrets Manager, Azure Key Vault ๊ฐ์ ์ ์ฉ ์ํฌ๋ฆฟ ์ ์ฅ์์ ์ฐ๋ํ๋ ๊ฒ ์ ์์ด์ผ. ๋ค๋ง Kubernetes Secret์ ๊ธฐ๋ณธ์ ์ผ๋ก base64 ์ธ์ฝ๋ฉ์ผ ๋ฟ ์ํธํ๊ฐ ์๋๋ผ์, etcd ์ ์ฅ ์ ์ํธํ(Encryption at rest)์ RBAC ์ค์ ์ ๋ฐ๋ก ์ฑ๊ฒจ์ผ ํด. ์ด๊ฑฐ ๋ชจ๋ฅด๋ ์ฌ๋ ๊ฝค ๋ง์!
๐ 6. ํ๋์ ๋ณด๋ ๋ฐฉ๋ฒ๋ณ ๋น๊ตํ
| ๋ฐฉ๋ฒ | ์ ์ฉ ์์ | ์ถ์ฒ ์ฉ๋ | ๋น๋ฐ๊ฐ |
|---|---|---|---|
| Dockerfile ENV | ๋น๋+๋ฐํ์ | ๊ธฐ๋ณธ ์ค์ ๊ฐ | โ ๊ธ์ง |
| Dockerfile ARG | ๋น๋๋ง | ๋ฒ์ , ๋น๋ ์ต์ | โ ๊ธ์ง |
| run -e / --env-file | ๋ฐํ์ | ํ๊ฒฝ๋ณ ์ค์ | โณ ๊ฐ๋ฐ์ฉ |
| Compose environment | ๋ฐํ์ | ์๋น์ค๋ณ ์ค์ | โณ ๊ฐ๋ฐ์ฉ |
| Compose/Swarm secrets | ๋ฐํ์(ํ์ผ) | ๋น๋ฐ๋ฒํธ, ํค | โ ๊ถ์ฅ |
| BuildKit --secret | ๋น๋๋ง | ๋น๋์ฉ ํ ํฐ | โ ๊ถ์ฅ |
๐ ๏ธ 7. ์ค๋ฌด์์ ๋ฐ๋ก ์ฐ๋ ์ฒดํฌ๋ฆฌ์คํธ
01.env๋ .gitignore์, .env.example์ ์ปค๋ฐ
ํค ์ด๋ฆ๊ณผ ์ค๋ช
๋ง ๋ด์ ํ
ํ๋ฆฟ์ ๊ณต์ ํ๋ฉด ํ์์ด ๋ญ ์ฑ์์ผ ํ๋์ง ๋ฐ๋ก ์์.
02.dockerignore์๋ .env ์ถ๊ฐCOPY . . ํ ๋ฐฉ์ .env๊ฐ ์ด๋ฏธ์ง๋ก ์ธ๋ ค ๋ค์ด๊ฐ๋ ์ฌ๊ณ , ์๊ฐ๋ณด๋ค ํํด. gitignore๋ง ์ฑ๊ธฐ๊ณ dockerignore๋ฅผ ๋นผ๋จน๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
03์ฑ ์์ ์ ํ์ ๋ณ์ ๊ฒ์ฆ
๊ฐ์ด ์์ผ๋ฉด ์ ๋งคํ๊ฒ ๋์ง ๋ง๊ณ ์ฆ์ ์ข
๋ฃ(fail fast)ํ์. ์์ธ ํ์
์ด ํจ์ฌ ๋นจ๋ผ์ ธ.
04ํ๊ฒฝ๋ณ Compose ํ์ผ ๋ถ๋ฆฌ
docker compose -f compose.yaml -f compose.prod.yaml up์ฒ๋ผ ์ค๋ฒ๋ผ์ด๋ ํ์ผ๋ก ์ด์ ์ค์ ๋ง ๋ฎ์ด์ฐ๊ธฐ.
05๋ก๊ทธ์ ํ๊ฒฝ๋ณ์ ์ ์ฒด ์ถ๋ ฅ ๊ธ์ง
๋๋ฒ๊น
ํ๋ค๊ณ printenv ๊ฒฐ๊ณผ๋ฅผ ๋ก๊ทธ์ ๋จ๊ธฐ๋ฉด ๋น๋ฐ๊ฐ์ด ๋ก๊ทธ ์์ง ์์คํ
์ผ๋ก ์ค์ค ์์ด๋๊ฐ.
06์ด๋ฏธ์ง ์ค์บ์ผ๋ก ์ํฌ๋ฆฟ ๊ฒ์ฌ
CI ๋จ๊ณ์์ gitleaks, trufflehog, Trivy ๊ฐ์ ๋๊ตฌ๋ก ์ฝ๋์ ์ด๋ฏธ์ง ์ ๋น๋ฐ๊ฐ์ ๊ฒ์ฌํ๋ฉด ๋ ๋ ํด.
๐งช 8. ๋๋ฒ๊น ํ ๋ ์ฐ๋ ๋ช ๋ น์ด ๋ชจ์
# ์คํ ์ค ์ปจํ
์ด๋์ ํ๊ฒฝ๋ณ์ ํ์ธ
docker exec mycontainer env
# ์ค์ ๋ ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก๋ง ๋ฝ๊ธฐ
docker inspect --format '{{json .Config.Env}}' mycontainer
# Compose ์ต์ข
์ค์ (์นํ ์๋ฃ) ํ์ธ
docker compose config
# ํน์ ์๋น์ค์ ์ผํ์ฑ์ผ๋ก ๋ค๋ฅธ ๊ฐ ์ฃผ๊ณ ์คํ
docker compose run -e LOG_LEVEL=debug api
๊ทธ๋ฆฌ๊ณ ๊ผญ ์์๋ ๊ฒ! ํ๊ฒฝ๋ณ์๋ ์ปจํ
์ด๋๊ฐ ์์ฑ๋ ๋ ์ ํด์ ธ. ๊ทธ๋์ env ํ์ผ์ ์์ ํ๋ค๋ฉด docker restart๋ก๋ ๋ฐ์์ด ์ ๋๊ณ , ์ปจํ
์ด๋๋ฅผ ๋ค์ ๋ง๋ค์ด์ผ ํด. Compose๋ผ๋ฉด docker compose up -d๊ฐ ์ค์ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ ์ปจํ
์ด๋๋ฅผ ์ฌ์์ฑํด์ค. "๋ถ๋ช
๋ฐ๊ฟจ๋๋ฐ ์ ๊ทธ๋๋ก์ง?"์ ๋ฒ์ธ์ ๋๋ถ๋ถ ์ด๊ฑฐ์ผ. ๐ต๏ธ
๐ฏ ๋ง๋ฌด๋ฆฌ: ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ๋ ๊ฒฐ๊ตญ '์ต๊ด'์ด๋ค
์ ๋ฆฌํด๋ณด๋ฉด ์ด๋.
โข ์ด๋ฏธ์ง๋ ํ๋, ์ค์ ์ ๋ฐํ์์ ์ฃผ์
โข ARG๋ ๋น๋์ฉ, ENV๋ ๊ธฐ๋ณธ๊ฐ์ฉ, ๋ ๋ค ๋น๋ฐ๊ฐ ๊ธ์ง
โข Compose์ .env๋ YAML ์นํ์ฉ์ด๋ผ๋ ํจ์ ๊ธฐ์ตํ๊ธฐ
โข ์ด์ ๋น๋ฐ๊ฐ์ secrets ํ์ผ ๋ง์ดํธ๋ ์ ์ฉ ์ํฌ๋ฆฟ ์ ์ฅ์๋ก
โข .gitignore + .dockerignore ๋ ๋ค ์ฑ๊ธฐ๊ธฐ
์ฒ์์ ๊ท์ฐฎ์ ๋ณด์ฌ๋ ํ ๋ฒ ๊ตฌ์กฐ๋ฅผ ์ก์๋๋ฉด ๋ฐฐํฌ๊ฐ ์ง์ง ํธํด์ ธ. ํน์ ์ฌ๋ด ์ธํ๋ผ์ ๋ง๋ DockerยทCI/CD ๊ตฌ์ฑ์ ์ ๋ฌธ๊ฐ์๊ฒ ๋์๋ฐ๊ณ ์ถ๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ DevOps ๊ฒฝํ์ด ํ๋ถํ ๊ฐ๋ฐ์๋ฅผ ์ฐพ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ๋ฐ๋๋ก ์ด๋ฐ ๋ ธํ์ฐ๋ฅผ ์ด๋ฏธ ๊ฐ์ท๋ค๋ฉด ์ฌ๋ฅ๋ท์์ ๋ค ๊ธฐ์ ์ ๋๋ ๋ณด๋ ๊ฒ๋ ๋ฉ์ง ์ ํ์ด๊ณ ! ๐
์ค๋ ๋ฐฐ์ด ๊ฑฐ ํ๋๋ง ๊ธฐ์ตํด๋ ์ถฉ๋ถํด.
"๋น๋ฐ๋ฒํธ๋ ์ด๋ฏธ์ง์ ๋ฃ์ง ์๋๋ค."
์ด๊ฒ๋ง ์ง์ผ๋ ๋๋ ์ด๋ฏธ ์์๊ถ ๊ฐ๋ฐ์์ผ. ๐
๐ ์ฐธ๊ณ ์๋ฃ
โข Docker Docs - Set environment variables within your container's environment: https://docs.docker.com/compose/how-tos/environment-variables/set-environment-variables/
โข Docker Docs - Environment variables precedence: https://docs.docker.com/compose/how-tos/environment-variables/envvars-precedence/
โข Docker Docs - Manage secrets securely in Docker Compose: https://docs.docker.com/compose/how-tos/use-secrets/
โข Docker Docs - Build secrets: https://docs.docker.com/build/building/secrets/
โข Dockerfile reference (ARG, ENV): https://docs.docker.com/reference/dockerfile/
โข The Twelve-Factor App - III. Config: https://12factor.net/config
โข Kubernetes Docs - Secrets: https://kubernetes.io/docs/concepts/configuration/secret/
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.