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...