Post

[도커] 기초

도커란?

개발을 할 때 내 컴퓨터에서는 되는데 서버에서는 안되는 상황, 즉 버전이나 설정이 꼬이는 상황을 해결할 수 일종의 표준화된 컨테이너이다. 어떤 프로그램과 그 실행에 필요한 모든 라이브러리, 설정 등을 컨테이너에 넣어서 실행시키면 어디서든 똑같이 돌아가는 개념이다.

이미지(image) vs 컨테이너(container)

구분비유 (붕어빵)비유 (게임)설명
이미지 (Image)붕어빵 틀게임 설치 CD프로그램 실행에 필요한 파일과 설정값 등을 저장해 둔 설계도 (불변)
컨테이너 (Container)구워진 붕어빵실행 중인 게임이미지를 바탕으로 실제로 실행되어 메모리에 올라간 프로세스 (생성/삭제 가능)

undefined

이미지 만들기 (Build)

Dockerfile

  • FROM : 베이스 이미지, 어떤 OS/환경인지
  • WORKDIR : 작업 폴더
  • COPY . . : 파일 복사 (내 컴퓨터 파일을 컨테이너로)
  • CMD : 실행 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
FROM python:3.9 AS builder

WORKDIR /app
COPY . .

# python:3.9-slim 은 불필요한 도구를 뺀 초경량 버전
FROM python:3.9-slim

WORKDIR /app

COPY --from=builder /app .

CMD ["python", "main.py"]

명령어 : docker build - t [이미지 이름] . (마지막 점(.) 있어야함)

1
2
3
4
5
6
7
FROM myslq:latest
# mysql root 비밀번호 설정
ENV MYSQL_ROOT_PASSWORD=0323
COPY ./init.sql /docker-entrypoint-init.d/
# 포트 지정
EXPOSE 3306
CMD ["mysqld"]

Multi-stage Build

  • Build와 Run분리
  • 불필요한 빌드 도구를 뺀 초경량 이미지 생성 가능
  • 위의 COPY –from=builder /app . 이 build 과정만 가져오는 것

.dockerignore

1
2
3
4
5
6
7
# .dockerignore 내용

.git
venv/
__pycache__/
*.md
secret_key.txt
  • .gitingnore와 같은 역할로, 필요없는 파일을 제외시켜준다
  • COPY . . 시 무시된다

데이터 지키기 (Volume)

컨테이너는 휘발성(삭제하면 데이터 증발)이다

  • Volume 마운트로 해결 가능
  • -v [내 컴퓨터 경로]:[컨테이너 경로]
    • 내 컴퓨터의 특정 폴더와 컨테이너 내부 폴더를 일종의 개구멍으로 연결하는 것. 컨테이너가 삭제되어도 내 컴퓨터 파일은 안전
  • 예) docker run –rm -v “${pwd}:/data” alpine touch /data/secret_file.txt
    • 맥은 {pwd}, 윈도우는 {PWD}
    • alpine : 이미지 이름

Docker Compose

컨테이너가 2개 이상 (예 : 웹 서버 + DB)일 때 사용

  • 파일 docker-compose.yml
  • 예) 워드프레스 블로그 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> services:  
>   db:  
>     image: mysql:5.7  
>     platform: linux/amd64 # 맥은 이거 필요  
>     environment:  
>       MYSQL_ROOT_PASSWORD: password  
>       MYSQL_DATABASE: wordpress  
>     volumes:  
>       - ./db_data:/var/lib/mysql  
>   
>   wordpress:  
>     image: wordpress:latest  
>     ports:  
>       - "8000:80"  
>     depends_on:  
>       - db  
>     environment:  
>       WORDPRESS_DB_HOST: db:3306  
>       WORDPRESS_DB_USER: root  
>       WORDPRESS_DB_PASSWORD: password  
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	services:
	  db:
	    image: mysql:5.7
	    platform: linux/amd64 # 맥은 이거 필요
	    environment:
	      MYSQL_ROOT_PASSWORD: password
	      MYSQL_DATABASE: wordpress
	    volumes:
	      - ./db_data:/var/lib/mysql
	
	  wordpress:
	    image: wordpress:latest
	    ports:
	      - "8000:80"
	    depends_on:
	      - db
	    environment:
	      WORDPRESS_DB_HOST: db:3306
	      WORDPRESS_DB_USER: root
	      WORDPRESS_DB_PASSWORD: password
  • 실행 : docker compose up -d (일괄 실행)
  • 종료 / 삭제 : docker compose down (일괄 종료 및 네트워크 삭제)
This post is licensed under CC BY 4.0 by the author.