Docker 시작
리눅스에서 서버를 실행시키는데 이때까지 쉘스크립트를 이용해서 서버를 실행했다 지금은 로컬 서버에서 해서 버전이나 업데이트 이부분에서 문제가 없지만 클라우드로 옮길때 버전 문제 운영체제 문제등이 존재하기 때문에 도커와 도커 컴포즈로 변경할려고 한다
도커
도커는 dockerfile로 작성하고 확장자는 없다 도커 파일은 이미지를 빌드(만들때) 사용하는 파일로 도커 파일을 실행하면 이미지가 생성되고 실행된다
1
2
3
4
docker-example/
│── main.py
│── requirements.txt
│── Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Python 3.9 기반의 슬림 이미지를 사용합니다.
FROM python:3.9-slim
# 작업 디렉토리 생성 및 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 애플리케이션 코드 복사 로컬에 있는 파일 복사
COPY . .
# 컨테이너 시작 시 uvicorn으로 FastAPI 앱 실행 (main.py의 app 객체를 실행)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
위 코드는 도커를 이용해서 fastapi를 실행하는 도커코드이다
도커 build 명령어
1
docker build -t my-app:v1 .
이 명령어는 현재 위치 기반(.)에 있는 dockerfile로 빌드를 하는데 태그 (-t) 이름 my-app으로 설정하고 : v1으로 버전을 명시한다 만약 버전 표기가 없다면 lastest로 자동으로 된다
도커 run 명령어
1
docker run -p 3000:3000 my-app
my-app이라는 이름의 도커 이미지를 기반으로 컨테이너를 실행하는 명령어이다 -p 는 호스트포트: 컨테이터 포트를 의미한다
주요옵션
| 옵션 | 설명 |
|---|---|
-p 호스트포트:컨테이너포트 | 호스트와 컨테이너 간의 포트 매핑 (3000:3000) |
-d | 컨테이너를 백그라운드에서 실행 (Detached mode) |
-it | 인터랙티브 모드 (-i + -t 조합) |
--name | 컨테이너 이름을 지정 |
--rm | 컨테이너 종료 시 자동 삭제 |
-v 호스트디렉토리:컨테이너디렉토리 | 볼륨 마운트 (파일을 공유) |
-e KEY=VALUE | 환경 변수 설정 |
실행후 컨테이너 관리
1
2
3
4
5
6
docker ps # 실행 중인 컨테이너 목록 확인
docker ps -a # 중지된 컨테이너 포함 전체 목록 확인
docker stop <ID> # 특정 컨테이너 중지
docker rm <ID> # 특정 컨테이너 삭제
docker images # 저장된 도커 이미지 목록 확인
docker rmi <IMAGE> # 특정 도커 이미지 삭제
1
2
3
docker stop $(docker ps -q) # 모든 실행 중인 컨테이너 중지
docker rm $(docker ps -aq) # 모든 컨테이너 삭제
docker rmi $(docker images -q) # 모든 이미지 삭제
도커 어플리케이션으로도 관리가 가능하다
도커 컴포즈
도커 컴포즈는 빌드된 이미지가 존재할 때 이 이미지를 한꺼번에 실행할 수 있다 또한 실행된 여러 컨테이너들을 묶거나 네트워크 설정 볼륨등 도 설정 가능하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
version: '3.8'
services:
selenium:
image: selenium/standalone-firefox:latest # Firefox + Selenium 서버 실행
container_name: selenium_container
shm_size: 2g # 공유 메모리 설정 (브라우저 충돌 방지)
ports:
- "4444:4444" # Selenium WebDriver 포트
networks:
- my_network
environment:
- SE_NODE_MAX_SESSIONS=5
- SE_NODE_OVERRIDE_MAX_SESSIONS=true
mariadb:
build: ./DB
container_name: mariadb_container
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_password
ports:
- "3306:3306"
volumes:
- mariadb_data:/var/lib/mysql
- ./DB:/docker-entrypoint-initdb.d # 초기화 스크립트 마운트
networks:
- my_network
crawler:
build: ./Crawler # 크롤링 코드가 있는 폴더
container_name: crawler_container
depends_on:
- selenium # Selenium 컨테이너가 먼저 실행된 후 크롤러 실행
- mariadb # DB 컨테이너가 실행된 후 크롤러 실행
environment:
- SELENIUM_URL=http://selenium:4444/wd/hub # Selenium 서버 주소
- DB_HOST=mariadb
- DB_USER=my_user
- DB_PASS=my_password
- DB_NAME=my_database
volumes:
- ./crawler:/app # 크롤링 코드와 컨테이너 간 동기화
networks:
- my_network
fastapi:
build: ./FastAPI
container_name: fastapi_container
restart: unless-stopped
depends_on:
- mariadb
- elasticsearch # FastAPI 실행 전에 Elasticsearch 실행
ports:
- "8000:8000"
environment:
DATABASE_URL: "mysql://my_user:my_password@mariadb:3306/my_database"
ELASTICSEARCH_URL: "http://elasticsearch:9200" # Elasticsearch 연결
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.2
container_name: elasticsearch_container
environment:
- discovery.type=single-node # 단일 노드 모드로 실행
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 메모리 제한 설정
- xpack.security.enabled=false # 기본 인증 비활성화
ports:
- "9200:9200" # REST API 포트
- "9300:9300" # 클러스터 통신 포트
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
mariadb_data:
name: mariadb_data # Docker가 mariadb_data 볼륨을 생성
es_data:
name: es_data # 이름 직접 지정
networks:
my_network:
driver: bridge
위 코드는 서버에서 사용할 도커 컴포즈 파일이다 도커를 통해서 이미지를 빌드후 사용할 수 있도 온라인에 도커 이미지가 이미 있다면 도커 컴포즈에 이미지 정보를 넣는것만으로 실행 가능하다 위 코드에서 selenium과 elasticsearch는 온라인 이미지를 이용했다
services: 여러 개의 컨테이너를 정의.
image: 사용할 도커 이미지.
container_name: 컨테이너 이름을 지정.
ports: 컨테이너와 호스트 간의 포트 연결.
volumes: 컨테이너 내부 데이터를 유지하기 위한 볼륨 설정.
environment: 환경 변수 설정.
depends_on: 특정 서비스가 먼저 실행된 후 실행하도록 설정.
networks: 컨테이너 간 통신을 위한 네트워크 설정.
도커 컴포즈 명령어&옵션
1
docker-compose up -d --build
docker-compose.yml을 읽고 컨테이너 실행 up 명령어를 실행하면, 필요한 이미지를 자동으로 빌드하고 컨테이너를 시작한다
| 옵션 | 설명 |
|---|---|
-d | 백그라운드(Detached mode)에서 실행 |
--build | 컨테이너를 실행하기 전에 이미지를 다시 빌드 |
--force-recreate | 기존 컨테이너를 삭제하고 새로 생성 |
1
docker-compose ps
현재 실행 중인 컨테이너 목록 확인
1
docker-compose logs -f
| 옵션 | 설명 |
|---|---|
-f | 실시간 로그 스트리밍 (follow) |
--tail=100 | 최근 100줄만 출력 |
컨테이너 실시간 로그 확인
1
docker-compose exec app sh
app 컨테이너 내부에서 sh 쉘을 실행
1
docker-compose stop
모든 컨테이너 중지
도커 vs 도커 컴포즈
| 기능 | docker run | docker-compose up |
|---|---|---|
| 개별 컨테이너 실행 | ✅ | ✅ |
| 여러 개의 컨테이너 실행 | ❌ | ✅ |
| YAML 파일로 설정 | ❌ | ✅ |
| 네트워크 및 볼륨 자동 관리 | ❌ | ✅ |
| 컨테이너 중지 후 유지 | ✅ | ✅ |
| 한 줄로 전체 시스템 실행 | ❌ | ✅ |