
π³ "λ컀λ μ ν리μΌμ΄μ μ κ°λ°, λ°°ν¬ λ° μ€ννλ λ° νμ μ μΈ λ°©μμ μ 곡νλ 컨ν μ΄λ νλ«νΌ"
λ컀μμ κ°μ₯ μ€μν λ κ°μ§ κ°λ μ 'μ΄λ―Έμ§'μ '컨ν μ΄λ'μ λλ€.
λ컀 μ΄λ―Έμ§λ 컨ν μ΄λλ₯Ό λ§λλ λ° μ¬μ©λλ μ½κΈ° μ μ©(Read-only) ν νλ¦Ώ μ λλ€. μ ν리μΌμ΄μ μ€νμ νμν μ½λ, λ°νμ, λΌμ΄λΈλ¬λ¦¬, νκ²½ λ³μ λ° μ€μ νμΌ λ± λͺ¨λ κ²μ ν¬ν¨ν©λλ€.
λ컀 컨ν μ΄λλ μ΄λ―Έμ§λ₯Ό μ€νν μνλ₯Ό λ§ν©λλ€. 컨ν μ΄λλ μ΄λ―Έμ§μ λͺ©μ μ λ§λ νμΌ μμ€ν κ³Ό 격리λ μμ€ν μμ λ° λ€νΈμν¬λ₯Ό μ¬μ©ν μ μλ λ 립λ 곡κ°μ λλ€.

"μ΄λ―Έμ§μ 컨ν μ΄λμ κ΄κ³λ₯Ό μμμ λΉμ νλ©΄, μ΄λ―Έμ§λ 'λλ λ μνΌ'μ΄κ³ 컨ν μ΄λλ 'κ·Έ λ μνΌλ‘ λ§λ λλ'μ΄λΌκ³ μκ°ν μ μμ΅λλ€. νλμ λ μνΌ(μ΄λ―Έμ§)λ‘ μ¬λ¬ κ°μ λλ(컨ν μ΄λ)μ λ§λ€ μ μμ΅λλ€."
λ°±κ·ΈλΌμ΄λμμ μ€νλλ μλΉμ€λ‘, λ컀 API μμ²μ μ²λ¦¬νκ³ μ»¨ν μ΄λ, μ΄λ―Έμ§, λ€νΈμν¬ λ±μ λ컀 κ°μ²΄λ₯Ό κ΄λ¦¬ν©λλ€.
μ΄λ―Έμ§ λΉλ, 컨ν μ΄λ μμ±, κ΄λ¦¬μ λͺ¨λ μμ μ λ΄λΉν©λλ€.
μ¬μ©μκ° λ컀 λͺ λ Ήμ΄λ₯Ό μ λ ₯νλ©΄, μ΄λ₯Ό λ컀 λ°λͺ¬μκ² μ λ¬νλ μν μ ν©λλ€.
CLI(Command Line Interface) ννλ‘ μ 곡λλ©°, μ¬μ©μμ λ컀 λ°λͺ¬ κ°μ ν΅μ μΈν°νμ΄μ€ μν μ ν©λλ€.
λ컀 μ΄λ―Έμ§λ₯Ό μ μ₯νλ μ μ₯μμ λλ€.
Docker Hubλ κ°μ₯ μ λͺ ν κ³΅κ° λ μ§μ€νΈλ¦¬λ‘, κΈ°λ³Έμ μΌλ‘ λ컀λ μ¬κΈ°μ μ΄λ―Έμ§λ₯Ό μ°Ύμ΅λλ€.
κ°μΈ λλ κΈ°μ μ μ체 νλΌμ΄λΉ λ μ§μ€νΈλ¦¬λ₯Ό μ΄μν μλ μμ΅λλ€.
λ컀 μ΄λ―Έμ§λ μ¬λ¬ μ½κΈ° μ μ© λ μ΄μ΄λ‘ ꡬμ±λλ©°, κ° λ μ΄μ΄λ Dockerfileμ λͺ λ Ήμ΄μ μν΄ μμ±λ©λλ€.
Layer 4: CMD ["node", "app.js"] - μμ© νλ‘κ·Έλ¨ μ€ν λͺ
λ Ή
Layer 3: COPY . /app - μμ€ μ½λ 볡μ¬
Layer 2: RUN npm install - μμ‘΄μ± μ€μΉ
Layer 1: FROM node:14 - λ² μ΄μ€ μ΄λ―Έμ§
λ컀λ μ΄λ¬ν λ μ΄μ΄λ₯Ό νλμ νμΌ μμ€ν μΌλ‘ ν΅ν©νμ¬ λ³΄μ¬μ£Όλ μ λμ¨ νμΌ μμ€ν μ μ¬μ©ν©λλ€.
μμ λ μ΄μ΄μμ νμΌμ μμ ν κ²½μ°, νμ λ μ΄μ΄μ μλ³Έ νμΌμ κ·Έλλ‘ μ μ§λλ©°(Copy-on-Write λ°©μ), λ³κ²½λ λ΄μ©μ μ λ μ΄μ΄μ μ μ₯λ©λλ€.
λμΌν λͺ λ Ήμ΄λ₯Ό μ€νν λ λ컀λ μΊμλ λ μ΄μ΄λ₯Ό μ¬μ¬μ©νμ¬ λΉλ μκ°μ λ¨μΆν©λλ€.
νΉμ λ μ΄μ΄κ° λ³κ²½λλ©΄, ν΄λΉ λ μ΄μ΄μ κ·Έ μ΄νμ λͺ¨λ λ μ΄μ΄λ₯Ό μ¬κ΅¬μ±ν©λλ€.
Cgroups(Control Groups): νλ‘μΈμ€ κ·Έλ£Ήμ 리μμ€ μ¬μ©λ(CPU, λ©λͺ¨λ¦¬, λ€νΈμν¬ λμν)μ λͺ¨λν°λ§νκ³ μ νν©λλ€. ν 컨ν μ΄λκ° μ 체 μμ€ν μμμ λ μ νλ κ²μ λ°©μ§ν©λλ€.
Namespace: νλ‘μΈμ€μκ² μ νλ μμ€ν λ·°λ₯Ό μ 곡νμ¬, νλ‘μΈμ€κ° μμ μ λ€μμ€νμ΄μ€ λ΄μμλ§ μμ€ν 리μμ€λ₯Ό λ³Ό μ μλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ νμΌ μμ€ν , λ€νΈμν¬, μ¬μ©μ ID λ±μ κ° μ»¨ν μ΄λλ§λ€ λ 립μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.

λ컀 μ΄λ―Έμ§λ λ μ΄μ΄ μ μΈ΅μ μν€ν
μ²λ₯Ό κ°μ΅λλ€. κ° λ μ΄μ΄λ λ³κ²½ μ¬νμ μ μ₯νλ©°, μ΄μ λ μ΄μ΄ μμ μμ΄λ ννλ‘ κ΅¬μ±λ©λλ€.
λ³κ²½λλ λ μ΄μ΄λ μ΅μμ λ μ΄μ΄λ‘ ꡬμ±νλ κ²μ΄ ν¨μ¨μ μ λλ€. νΉμ λ μ΄μ΄λ₯Ό μμ νλ©΄ λ컀λ ν΄λΉ λ μ΄μ΄λΆν° λͺ¨λ μμ λ μ΄μ΄λ₯Ό μ¬κ΅¬μ±ν΄μΌ νκΈ° λλ¬Έμ λλ€.
docker run -it --name mycontainer nginx
μ΄ λͺ λ Ήμ΄λ nginx μ΄λ―Έμ§λ₯Ό μ΄μ©ν΄ 'mycontainer'λΌλ μ΄λ¦μ 컨ν μ΄λλ₯Ό μμ±νκ³ μ€νν©λλ€.
docker ps # μ€ν μ€μΈ 컨ν
μ΄λλ§ νμ
docker ps -a # λͺ¨λ 컨ν
μ΄λ νμ(μ€μ§λ 컨ν
μ΄λ ν¬ν¨)
docker start mycontainer # 컨ν
μ΄λ μμ
docker stop mycontainer # 컨ν
μ΄λ μ€μ§
docker create --name testos centos
μ΄ λͺ λ Ήμ΄λ centos μ΄λ―Έμ§λ₯Ό μ¬μ©ν΄ 'testos'λΌλ μ΄λ¦μ 컨ν μ΄λλ₯Ό μμ±νμ§λ§ μ€ννμ§λ μμ΅λλ€.
Dockerfileμ λ컀 μ΄λ―Έμ§λ₯Ό μμ±νλ λ° νμν μ€μ κ°μ λ΄κ³ μλ μ€ν¬λ¦½νΈ νμΌμ λλ€.
# κΈ°λ³Έ μ΄λ―Έμ§ μ§μ
FROM node:14
# μμ
λλ ν 리 μ€μ
WORKDIR /app
# μμ‘΄μ± νμΌ λ³΅μ¬ λ° μ€μΉ
COPY package.json .
RUN npm install
# μμ€ μ½λ 볡μ¬
COPY . .
# ν¬νΈ μ€μ
EXPOSE 3000
# μ€ν λͺ
λ Ήμ΄
CMD ["node", "server.js"]
docker build -t myapp:latest .
μ΄ λͺ λ Ήμ΄λ νμ¬ λλ ν 리(.)μ Dockerfileμ μ¬μ©νμ¬ 'myapp:latest'λΌλ μ΄λ¦μ μ΄λ―Έμ§λ₯Ό λΉλν©λλ€.
μ΄λ―Έμ§λ₯Ό λ컀 νλΈμ μ λ‘λνμ¬ κ³΅μ ν μ μμ΅λλ€.
docker login
docker tag myapp:latest username/myapp:latest
docker push username/myapp:latest
μ΄ κ³Όμ μ ν΅ν΄ μμ μ΄ λ§λ μ΄λ―Έμ§λ₯Ό λ컀 νλΈμ μ λ‘λνκ³ λ€λ₯Έ μ¬λκ³Ό 곡μ ν μ μμ΅λλ€.
μ€μ μ ν리μΌμ΄μ μ λ³΄ν΅ μ¬λ¬ μλΉμ€λ‘ ꡬμ±λ©λλ€(μΉ μλ², λ°μ΄ν°λ² μ΄μ€, μΊμ μλ² λ±). μ΄λ¬ν μλΉμ€λ€μ κ°κ° 컨ν μ΄λλ‘ μ€ννκ³ μ°κ²°ν λ λ컀 μ»΄ν¬μ¦λ₯Ό μ¬μ©ν©λλ€.
docker-compose.yml νμΌμ YAML νμμΌλ‘ μμ±λλ©°, μ¬λ¬ 컨ν μ΄λμ ꡬμ±μ μ μν©λλ€.
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- my-network
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
POSTGRES_DB: example_db
volumes:
- db-data:/var/lib/postgresql/data
networks:
- my-network
volumes:
db-data:
networks:
my-network:
λ€μμ νλ‘ νΈμλ, λ°±μλ, λ°μ΄ν°λ² μ΄μ€λ‘ ꡬμ±λ μ ν리μΌμ΄μ μ μμ μ λλ€.
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
backend:
build: ./backend
ports:
- "8080:8080"
environment:
- DB_HOST=postgres
- DB_PORT=5432
- DB_USER=example
- DB_PASSWORD=example
- DB_NAME=example_db
depends_on:
- postgres
postgres:
image: postgres:13
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
POSTGRES_DB: example_db
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
# μ»΄ν¬μ¦ νμΌλ‘ μλΉμ€ μμ
docker-compose up
# λ°±κ·ΈλΌμ΄λμμ μ€ν
docker-compose up -d
# μλΉμ€ μ€μ§
docker-compose down
# μλΉμ€ μν νμΈ
docker-compose ps