Docker
πŸ™ˆ

Docker

Created
Feb 22, 2024 09:01 AM
Last edited time
Last updated April 8, 2024
Tags
CS
Language
URL

Intro::

Docker λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μž.
Β 

λ„μ»€λž€ ?

도컀(Docker)λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ»¨ν…Œμ΄λ„ˆν™”ν•΄μ„œ 개발, 배포, 싀행을 κ°„νŽΈν•˜κ²Œ ν•΄μ£ΌλŠ” μ˜€ν”ˆ μ†ŒμŠ€ ν”Œλž«νΌμ΄λ‹€. μ»¨ν…Œμ΄λ„ˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  것(μ½”λ“œ, λŸ°νƒ€μž„, μ‹œμŠ€ν…œ 도ꡬ, μ‹œμŠ€ν…œ 라이브러리 λ“±)을 ν¬ν•¨ν•˜λŠ” ν‘œμ€€ν™”λœ λ‹¨μœ„λ‘œ, μ†Œν”„νŠΈμ›¨μ–΄κ°€ μ–΄λ–€ ν™˜κ²½μ—μ„œλ„ μΌκ΄€λ˜κ²Œ λ™μž‘ν•  수 μžˆλ„λ‘ 보μž₯ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μ£Όμ˜ν•΄μ•Ό ν•  점은 도컀 μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트 OS의 컀널을 κ³΅μœ ν•œλ‹€λŠ” 것이닀. 즉, λ§Œμ•½ 호슀트 OSκ°€ λ¦¬λˆ…μŠ€λΌλ©΄, 도컀 μ»¨ν…Œμ΄λ„ˆλŠ” λ¦¬λˆ…μŠ€ 배포판 κ°„μ—λŠ” OSλ₯Ό 'λ³€κ²½'ν•  수 μžˆμ§€λ§Œ, μ™„μ „νžˆ λ‹€λ₯Έ 컀널을 μ‚¬μš©ν•˜λŠ” OS(예: ν˜ΈμŠ€νŠΈκ°€ λ¦¬λˆ…μŠ€μ΄κ³  μ»¨ν…Œμ΄λ„ˆκ°€ μœˆλ„μš°λ₯Ό μ‹€ν–‰ν•˜λ €λŠ” 경우)λ‘œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ Linux μ»¨ν…Œμ΄λ„ˆλ₯Ό Windowsμ—μ„œ μ‹€ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ 일뢀 ν˜Έν™˜μ„± 계측을 톡해 λ‹€λ₯Έ OS의 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•˜λŠ” 도ꡬ듀도 μžˆλ‹€.

λ„μ»€μ˜ μž₯점

  1. 개발 ν™˜κ²½μ˜ 일관성: 도컀λ₯Ό μ‚¬μš©ν•˜λ©΄ 개발, ν…ŒμŠ€νŠΈ, ν”„λ‘œλ•μ…˜ ν™˜κ²½ μ‚¬μ΄μ˜ 차이λ₯Ό 쀄일 수 μžˆλ‹€. λͺ¨λ“  ν™˜κ²½μ—μ„œ λ™μΌν•œ 이미지λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, "λ‚΄ μ»΄ν“¨ν„°μ—μ„œλŠ” 잘 λ˜λŠ”λ°μš”" 같은 문제λ₯Ό 방지할 수 μžˆλ‹€.
  1. 배포 속도 ν–₯상: μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ 쒅속성을 μ»¨ν…Œμ΄λ„ˆμ— νŒ¨ν‚€μ§•ν•˜λ©΄, 배포 ν”„λ‘œμ„ΈμŠ€κ°€ κ°„μ†Œν™”λ˜κ³  μžλ™ν™”ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€. 이둜 인해 배포 속도가 빨라진닀.
  1. 이식성 ν–₯상: 도컀 μ»¨ν…Œμ΄λ„ˆλŠ” μ–΄λ””μ„œλ“  싀행될 수 μžˆμ–΄. λ¦¬λˆ…μŠ€, μœˆλ„μš°, macOS 상관없이, μ˜¨ν”„λ ˆλ―ΈμŠ€λ‚˜ ν΄λΌμš°λ“œ 상관없이 μ‹€ν–‰κ°€λŠ₯ν•˜λ‹€.
  1. 뢄리 및 관리 용이: 도컀λ₯Ό μ‚¬μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ„œλΉ„μŠ€λ³„λ‘œ λΆ„λ¦¬ν•΄μ„œ 관리할 수 μžˆλ‹€. μ΄λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ™€ 잘 λ§žλŠ”λ‹€. 각 μ»¨ν…Œμ΄λ„ˆλŠ” λ…λ¦½μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜κ³  관리할 수 μžˆμ–΄μ„œ μœ μ§€λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•˜λ‹€.
  1. λ¦¬μ†ŒμŠ€ νš¨μœ¨μ„±: μ»¨ν…Œμ΄λ„ˆλŠ” κ°€λ²Όμ›Œμ„œ λΉ λ₯΄κ²Œ μ‹œμž‘ν•  수 있고, 가상 λ¨Έμ‹ (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 .// 와같이 λΉŒλ“œν•΄μ•Όν•œλ‹€.
Β 

References::

Docker - 도컀에 Spring Boot(Gradle) κ΅¬μΆ•ν•˜κΈ°
μš°λ¦¬κ°€ 도컀λ₯Ό 이해해야 ν•˜λŠ” μ΄μœ λŠ” ν˜ΈμŠ€νŒ… μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” νŠΉμ •ν•œ μ„œλ²„ ν™˜κ²½μ— 배포λ₯Ό ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— 그에 λ”°λ₯Έ 섀정을 λ§žμΆ°μ€˜μ•Ό λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 맀번 λ‹€λ₯Έ μ›Ήμ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  λ•Œ λ§ˆλ‹€ 섀정을 ν•΄μ•Όν•˜λ©°, μ„œλ²„λ§ˆλ‹€ 각각의 μ„€μ •μ„ν•΄μ€˜μ•Ό ν•˜μ—¬ λ§Žμ€ μžμ› 남이가 μžˆμŠ΅λ‹ˆλ‹€. 이런 λ‹€λ₯Έ ν™˜κ²½μ—μ„œμ˜ μž‘μ—…μ„ κ·œκ²©ν™”ν•˜μ—¬ μ •μ˜λ₯Ό ν•˜κΈ° μœ„ν•΄ 도컀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. #️⃣ 도컀 μ‹€ν–‰ μˆœμ„œ 1. spring boot 개발 2. jar 파일 생성 3. dockerfile λ§Œλ“€κΈ° 4. docker image생성 5. docker containerμ‹€ν–‰ λ¨Όμ € μ‹€μŠ΅μ„ ν•˜κΈ°μ•žμ„œ 도컀가 μ„€μΉ˜κ°€ λ˜μ–΄μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 도컀 μ„€μΉ˜λ²• 1️⃣Spring Boot 개발 ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ 도컀λ₯Ό μ€‘μ μœΌλ‘œ ν•˜λŠ” λ‚΄μš©μ΄κΈ° λ•Œλ¬Έμ— spring ν”„λ‘œμ νŠΈλŠ” 간단..
Docker - 도컀에 Spring Boot(Gradle) κ΅¬μΆ•ν•˜κΈ°
[Docker] 이미지λ₯Ό κΉ¨λ—ν•˜κ²Œ μž¬λΉŒλ“œν•˜λŠ” 방법
도컀 이미지λ₯Ό κΉ¨λ—ν•˜κ²Œ μž¬λΉŒλ“œν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 단계λ₯Ό λ”°λ₯΄λ©΄ λ©λ‹ˆλ‹€. 1. μ»¨ν…Œμ΄λ„ˆ 및 이미지 μ‚­μ œ μš°μ„  ν•΄λ‹Ή 이미지λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ₯Ό μ€‘μ§€ν•˜κ³  μ‚­μ œν•΄μ•Όν•©λ‹ˆλ‹€. μ΄λŠ” λ‹€μŒ λͺ…령을 톡해 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. docker stop [container_name] docker rm [container_name] 이미지λ₯Ό 직접 μ‚­μ œν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μž…λ ₯ν•©λ‹ˆλ‹€. docker rmi [image_name] 2. μΊμ‹œλœ λΉŒλ“œ μ‚­μ œ 이전 λΉŒλ“œμ—μ„œ μΊμ‹œκ°€ μ‚¬μš©λ  κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ λΉŒλ“œ μΊμ‹œλ₯Ό μ‚­μ œν•΄μ•Όν•©λ‹ˆλ‹€. λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μΊμ‹œλ₯Ό μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. docker builder prune 3. μƒˆλ‘œμš΄ 이미지 λΉŒλ“œ λͺ¨λ“  이전 이미지 및 μΊμ‹œκ°€ μ œκ±°λ˜μ—ˆμœΌλ―€λ‘œ μƒˆ 이미지λ₯Ό λΉŒλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ή..
[Docker] 이미지λ₯Ό κΉ¨λ—ν•˜κ²Œ μž¬λΉŒλ“œν•˜λŠ” 방법

Loading Comments...