Intro::
Docker λ₯Ό μ¬μ©νλ λ°©λ²μ λν΄ κ³΅λΆν΄λ³΄μ.
Β
λ컀λ ?
λ컀(Docker)λ μ ν리μΌμ΄μ
μ 컨ν
μ΄λνν΄μ κ°λ°, λ°°ν¬, μ€νμ κ°νΈνκ² ν΄μ£Όλ μ€ν μμ€ νλ«νΌμ΄λ€. 컨ν
μ΄λλ μ ν리μΌμ΄μ
κ³Ό κ·Έ μ ν리μΌμ΄μ
μ μ€ννλ λ° νμν λͺ¨λ κ²(μ½λ, λ°νμ, μμ€ν
λꡬ, μμ€ν
λΌμ΄λΈλ¬λ¦¬ λ±)μ ν¬ν¨νλ νμ€νλ λ¨μλ‘, μννΈμ¨μ΄κ° μ΄λ€ νκ²½μμλ μΌκ΄λκ² λμν μ μλλ‘ λ³΄μ₯νλ€. κ·Έλ¬λ μ£Όμν΄μΌ ν μ μ λ컀 컨ν
μ΄λκ° νΈμ€νΈ OSμ 컀λμ 곡μ νλ€λ κ²μ΄λ€. μ¦, λ§μ½ νΈμ€νΈ OSκ° λ¦¬λ
μ€λΌλ©΄, λ컀 컨ν
μ΄λλ 리λ
μ€ λ°°ν¬ν κ°μλ OSλ₯Ό 'λ³κ²½'ν μ μμ§λ§, μμ ν λ€λ₯Έ 컀λμ μ¬μ©νλ OS(μ: νΈμ€νΈκ° 리λ
μ€μ΄κ³ 컨ν
μ΄λκ° μλμ°λ₯Ό μ€ννλ €λ κ²½μ°)λ‘λ μλνμ§ μλλ€. νμ§λ§ Linux 컨ν
μ΄λλ₯Ό Windowsμμ μ€ννλ κ²μ²λΌ μΌλΆ νΈνμ± κ³μΈ΅μ ν΅ν΄ λ€λ₯Έ OSμ 컨ν
μ΄λλ₯Ό μ€νν μ μλ νκ²½μ μ 곡νλ λꡬλ€λ μλ€.
λ컀μ μ₯μ
- κ°λ° νκ²½μ μΌκ΄μ±: λ컀λ₯Ό μ¬μ©νλ©΄ κ°λ°, ν μ€νΈ, νλ‘λμ νκ²½ μ¬μ΄μ μ°¨μ΄λ₯Ό μ€μΌ μ μλ€. λͺ¨λ νκ²½μμ λμΌν μ΄λ―Έμ§λ₯Ό μ¬μ©νκΈ° λλ¬Έμ, "λ΄ μ»΄ν¨ν°μμλ μ λλλ°μ" κ°μ λ¬Έμ λ₯Ό λ°©μ§ν μ μλ€.
- λ°°ν¬ μλ ν₯μ: μ ν리μΌμ΄μ κ³Ό κ·Έ μ’ μμ±μ 컨ν μ΄λμ ν¨ν€μ§νλ©΄, λ°°ν¬ νλ‘μΈμ€κ° κ°μνλκ³ μλννκΈ° μ¬μμ§λ€. μ΄λ‘ μΈν΄ λ°°ν¬ μλκ° λΉ¨λΌμ§λ€.
- μ΄μμ± ν₯μ: λ컀 컨ν μ΄λλ μ΄λμλ μ€νλ μ μμ΄. 리λ μ€, μλμ°, macOS μκ΄μμ΄, μ¨νλ λ―Έμ€λ ν΄λΌμ°λ μκ΄μμ΄ μ€νκ°λ₯νλ€.
- λΆλ¦¬ λ° κ΄λ¦¬ μ©μ΄: λ컀λ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μλΉμ€λ³λ‘ λΆλ¦¬ν΄μ κ΄λ¦¬ν μ μλ€. μ΄λ λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²μ μ λ§λλ€. κ° μ»¨ν μ΄λλ λ 립μ μΌλ‘ μ λ°μ΄νΈνκ³ κ΄λ¦¬ν μ μμ΄μ μ μ§λ³΄μκ° νΈλ¦¬νλ€.
- 리μμ€ ν¨μ¨μ±: 컨ν μ΄λλ κ°λ²Όμμ λΉ λ₯΄κ² μμν μ μκ³ , κ°μ λ¨Έμ (VM)μ λΉν΄ μ μ μμ λ©λͺ¨λ¦¬μ CPUλ₯Ό μ¬μ©νλ€. μ΄λ μμ€ν 리μμ€λ₯Ό λ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μκ² ν΄μ€λ€.
κΈ°λ³Έ κ΅¬μ± μμ
- μ΄λ―Έμ§(Image): μ ν리μΌμ΄μ μ μ€ννλ λ° νμν λͺ¨λ νμΌκ³Ό μ€μ μ ν¬ν¨νλ λΆλ³μ ν νλ¦Ώ. μ΄λ―Έμ§λ 컨ν μ΄λλ₯Ό μμ±νλ λ° μ¬μ©λλ€.
- 컨ν μ΄λ(Container): μ΄λ―Έμ§λ₯Ό κΈ°λ°μΌλ‘ μμ±λλ©°, μ€μ λ‘ μ ν리μΌμ΄μ μ μ€ννλ 격리λ νκ²½. κ° μ»¨ν μ΄λλ λ 립μ μΌλ‘ μ€νλλ©°, λ€λ₯Έ 컨ν μ΄λλ νΈμ€νΈ μμ€ν κ³Ό κ²©λ¦¬λΌ μλ€.
- λ컀 λ°λͺ¬(Docker Daemon): λ컀 μ΄λ―Έμ§μ 컨ν μ΄λλ₯Ό κ΄λ¦¬νλ λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€. μ¬μ©μλ λ컀 APIμ μμ²μ λ°μ μ²λ¦¬νλ€.
- λ컀 ν΄λΌμ΄μΈνΈ(Docker Client): μ¬μ©μκ° λ컀 λ°λͺ¬κ³Ό ν΅μ ν λ μ¬μ©νλ μ£Όμ μΈν°νμ΄μ€. λͺ λ Ήμ΄λ₯Ό μ λ ₯νλ©΄, λ컀 ν΄λΌμ΄μΈνΈκ° μ΄ λͺ λ Ήμ΄λ₯Ό λ컀 λ°λͺ¬μκ² μ λ¬νλ€.
Β
Dockerfile
FROM python:3.9-slim # μ¬μ©ν BaseImage WORKDIR /app # μμ λλ ν 리 COPY main.py . # νμν νμΌλ€μ docker μ΄λ―Έμ§μ λ³΅μ¬ COPY ./requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # νμν ν¨ν€μ§λ₯Ό λ€μ΄ CMD ["python3", "main.py"] # 컨ν μ΄λκ° μ¬λΌκ°λ μ€ν
Build
docker build -t docker-ex:1.0 .
Β
Run
docker run --name {container-name} -d {image:tag}
Β
ENTRYPOINT
컨ν μ΄λκ° μμλ λ μ€νν΄μΌ ν κΈ°λ³Έ λͺ λ Ή(λλ νλ‘κ·Έλ¨)μ μ€μ ν©λλ€. μ΄ λͺ λ Ήμ 컨ν μ΄λ μ€ν μ λ³κ²½ν μ μμΌλ―λ‘ "λΆλ³"ν λΆλΆμΌλ‘ λ³Ό μ μμ΅λλ€.
Β
CMD
ENTRYPOINT
μ μν΄ μ€νλλ νλ‘κ·Έλ¨μ λν κΈ°λ³Έ μΈμλ₯Ό μ 곡νκ±°λ,ENTRYPOINT
κ° μμ λ μ€νν κΈ°λ³Έ λͺ λ Ήμ μ μν©λλ€. 그리κ³CMD
λdocker run
λͺ λ Ήμ΄μ μΆκ°μ μΈ μΈμκ° μ£Όμ΄μ§ κ²½μ°μ λ체λ μ μμ΅λλ€.
docker compose
1. λ컀 νμΌ μμ±
κ° μ ν리μΌμ΄μ
(μ€νλ§, νμ΄μ¬, MySQL)μ λν λ컀 νμΌμ μμ±ν©λλ€. λ컀 νμΌμ 컨ν
μ΄λμ μ΄λ―Έμ§λ₯Ό λΉλνλ λ° νμν μ§μμ¬νμ λ΄κ³ μμ΅λλ€.
- MySQL λ컀 νμΌ: MySQLμ μ΄λ―Έ 곡μ λ컀 μ΄λ―Έμ§κ° μκΈ° λλ¬Έμ λ³λμ λ컀 νμΌμ μμ±ν νμκ° μμ΅λλ€. νκ²½ λ³μλ₯Ό μ¬μ©νμ¬ μ΄κΈ° μ€μ (μ: λ°μ΄ν°λ² μ΄μ€ μ΄λ¦, μ¬μ©μ μ΄λ¦, λΉλ°λ²νΈ λ±)μ ν μ μμ΅λλ€.
- μ€νλ§ μ ν리μΌμ΄μ λ컀 νμΌ: Javaμ Maven(λλ Gradle)μ κΈ°λ°μΌλ‘ ν μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ λΉλνκ³ μ€ννκΈ° μν λ컀 νμΌμ μμ±ν©λλ€.
- νμ΄μ¬ μ ν리μΌμ΄μ λ컀 νμΌ: νμ΄μ¬ μ ν리μΌμ΄μ μ νμν μμ‘΄μ±μ μ€μΉνκ³ μ ν리μΌμ΄μ μ μ€ννκΈ° μν λ컀 νμΌμ μμ±ν©λλ€.
2. λ컀 μ»΄ν¬μ¦ νμΌ μμ±
λ컀 μ»΄ν¬μ¦λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ 컨ν
μ΄λλ₯Ό λμμ μ μνκ³ μ€νν μ μμ΅λλ€.
docker-compose.yml
νμΌμ μμ±νμ¬ μ€νλ§ μ ν리μΌμ΄μ
, νμ΄μ¬ μ ν리μΌμ΄μ
, κ·Έλ¦¬κ³ MySQL μλΉμ€λ₯Ό μ μν©λλ€.version: '3' services: mysql: image: mysql:latest container_name: mysql environment: MYSQL_DATABASE: 'db' MYSQL_USER: 'user' MYSQL_PASSWORD: '1234' MYSQL_ROOT_PASSWORD: 'root1234' TZ: 'Asia/Seoul' MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci ports: - "3306:3306" volumes: - db-data:/var/lib/mysql - ./my.cnf:/etc/mysql/conf.d/custom.cnf spring-app: build: context: ./newsHabit dockerfile: dockerfile restart: on-failure ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/news_habit?useUnicode=true&characterEncoding=utf8 SPRING_DATASOURCE_USERNAME: "user" SPRING_DATASOURCE_PASSWORD: "1234" TZ: "Asia/Seoul" depends_on: - mysql python-app: build: context: ./crawling dockerfile: Dockerfile environment: TZ: "Asia/Seoul" command: python3 ./src/main.py volumes: - ./crontab:/crawling/crontab depends_on: - mysql volumes: db-data:
#my.cnf [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
3. λ€νΈμν¬ μ€μ
λ컀 μ»΄ν¬μ¦λ κΈ°λ³Έμ μΌλ‘ λͺ¨λ μλΉμ€λ₯Ό κ°μ λ€νΈμν¬μ λ°°μΉνμ¬ μλ‘ ν΅μ ν μ μλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄, μ€νλ§ μ ν리μΌμ΄μ
κ³Ό νμ΄μ¬ μ ν리μΌμ΄μ
μ
mysql
μλΉμ€ μ΄λ¦μΌλ‘ MySQL λ°μ΄ν°λ² μ΄μ€μ μ κ·Όν μ μμ΅λλ€.4. μ€ν λ° ν μ€νΈ
λ컀 μ»΄ν¬μ¦ νμΌμ΄ μ€λΉλλ©΄, λ€μ λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν΄ λͺ¨λ μλΉμ€λ₯Ό λΉλνκ³ μ€νν μ μμ΅λλ€.
docker-compose up --build
μ΄ λͺ
λ Ήμ΄λ μ μλ λͺ¨λ μ΄λ―Έμ§λ₯Ό λΉλνκ³ μ»¨ν
μ΄λλ₯Ό μμν©λλ€.
--build
μ΅μ
μ μ΄λ―Έμ§κ° μ΅μ μνμΈμ§ νμΈνκ³ νμν κ²½μ° λΉλλ₯Ό λ€μ μνν©λλ€.Β
DB μ μ₯ μ νκΈ κΉ¨μ§ νμ
my.cnf λ‘ ν΄κ²°
Β
ec2 μ΄λ―Έμ§ λΉλ νΈν λ¬Έμ
docker build --platform linux/amd64 -t aoleejohn/crawl:latest .// μκ°μ΄ λΉλν΄μΌνλ€.
Β
Loading Comments...