Post

Docker 시작

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 rundocker-compose up
개별 컨테이너 실행
여러 개의 컨테이너 실행
YAML 파일로 설정
네트워크 및 볼륨 자동 관리
컨테이너 중지 후 유지
한 줄로 전체 시스템 실행
This post is licensed under CC BY 4.0 by the author.