일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OnlineIDE
- github
- nas
- Jenkins
- kubernetes
- 3d프린터 초보
- gitlab
- docker
- 3D 프린터 용어
- 3D
- 3D프린터 입문
- ci/cd
- Notification
- linux job
- Token인증방식
- 3D모델링
- octoprint
- NAS HDD교체
- git
- 데이터 직렬화 포맷
- 리눅스 파일동기화
- 네이버클라우드
- IoTNetwork
- 3D프린터입문
- 코틀린개발환경
- data serialization formats
- 3D프린터
- C언어
- docker container
- Kotlin
- Today
- Total
0과 1을 공부하다.
[Docker] Docker 맛보기 - Dockerfile/Docker-Compose (3) 본문
본 게시물에서는 도커 이미지를 빌드하기 위한 Dockerfile 을 작성하는 요령과 여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구인 Docker-Compose를 다루는 방법에 대해 기술한다.
1. Docker Image Build (Dockerfile)
- Dockerfile은 애플리케이션을 컨테이너로 만들기 위해 필요한 명령어들을 담고 있는 파일이다.
- 애플리케이션의 환경 설정, 종속성 설치, 파일 복사 등을 정의한다.
- Dockerfile을 사용하여 도커 이미지를 빌드하고, 해당 이미지를 실행하여 컨테이너를 생성할 수 있다.
Dockerfile을 이용한 이미지 빌드
- 도커파일을 생성할 디렉터리 생성 및 이동
$ mkdir img_build && cd img_build
- Dockerfile 생성 및 작성
$ vi Dockerfile
- Dockerfile 작성 요령
option | contents |
FROM | 베이스 이미지 |
RUN | 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성 |
WORKDIR | 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성 |
EXPOSE | Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미 (컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다) |
USER | 이미지를 어떤 계정에서 실행 하는지 지정 |
COPY / ADD | build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것 |
ENV | 이미지에서 사용할 환경 변수 값을 지정 |
CMD / ENTRYPOINT | 컨테이너를 생성,실행 할 때 실행할 명령어 |
VOLUME |
외부 마운트 포인트 생성 |
ARGS | Dockerfile 내에서 사용할 변수 정의 |
LABEL | Docker image에 포함할 메타데이터 정의 (key-value) |
ONBUILD | 다른 빌드의 베이스로 사용될때 사용하는 명령어 (부모/자식 이미지에서 동일하게 실행되는 명령어 정의) |
Dockerfile의 예시는 아래와 같다.
# Dockerfile
# 베이스 이미지를 지정합니다.
FROM python:3.9
# 환경 변수를 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 앱 디렉토리를 생성하고 작업 디렉토리로 설정합니다.
RUN mkdir /app
WORKDIR /app
# 앱의 종속성을 설치합니다.
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# 앱 소스 코드를 추가합니다.
COPY . /app/
# 앱을 실행합니다.
CMD ["python", "app.py"]
- Dockerfile build
$ docker build -t [이름공간/이미지이름:태그] [경로]
이후 $ docker image ls 명령어로 빌드결과를 확인한다.
- + <none> tag image 삭제
bulid에 실패할 경우 docker image ls으로 살펴보면 이름과 태그가 <none>으로 붙은 것을 볼 수 있다. 수정 후 정상적인 빌드를 하면 정상적인 태그로 돌아오지만 아래와 같이 삭제 가능하다.
$ docker rmi $(sudo docker images -f "dangling=true" -q) --force
특정 파일 및 디렉토리 build 제외
특정 파일 및 디렉토리의 파일이 build 되는 것을 방지하기 위해서는 프로젝트 내 .dockerignore 파일을 생성한다.
와일드카드 패턴 (예: *.txt, logs/*) 또는 디렉토리 패턴 (예: logs/, tmp/)을 적용하여 작성한다.
build cache 삭제
Dockerfile을 빌드하는 과정에서는 반복되는 build 시간을 단축하고자 캐싱한다.
이러한 캐싱 결과가 PC 내에 지속적으로 쌓이게 되면 불필요한 데이터가 PC에 남게 된다.
이러한 Docker build 캐시를 삭제하는 방법은 아래와 같다.
$ docker builder prune
Docker Hub을 이용한 image 생성/버전관리
$ docker login
$ docker push [사용자명]/[repository 이름]:[tagname]
2. Docker-Compose
- 도커 컴포즈(Docker Compose)는 여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구이다.
- 컴포즈 파일을 사용하여 여러 컨테이너를 하나의 프로젝트로 정의하고, 이를 단일 명령어로 실행할 수 있다. (여러개의 컨테이너를 실행하기 위한 명령어 집합)
- 컴포즈 파일은 YAML 형식으로 작성되며, 각 컨테이너의 설정, 의존성, 네트워크 설정 등을 정의한다.
Docker-compose 생성 및 작성
$ vi docker-compose.yml
- docker-compose.yml 작성 요령
option | contents |
version | Docker Compose 파일의 버전을 지정 (필수) |
services | Docker Compose로 관리할 서비스를 정의하는 섹션 |
volumes | 컨테이너에서 사용할 볼륨을 정의 |
networks | 컨테이너 간 통신을 위한 네트워크를 정의 |
x-{사용자 정의} | 사용자 정의 확장 (extension) |
docker-compose.yml 파일을 작성한 예시파일은 아래와 같다.
# docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: flaskapp
MYSQL_USER: flaskuser
MYSQL_PASSWORD: flaskpassword
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Compose 실행 및 종료
- Compose 실행
$ docker compose up
# -d: 백그라운드 실행
- Compose 종료
$ docker compose down
참고 사이트
- [Docker] Docker 맛보기 - 특징과 설치 (1) 와 같음
※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.
* CopyRight 2024. Jay Park All rights reserved.
'Study > Server' 카테고리의 다른 글
[Kube] Kubernetes - 실습 환경 구성 (3) (0) | 2024.07.16 |
---|---|
[Kube] Kubernetes - 특징 및 아키텍처 (2) (0) | 2024.07.16 |
[Kube] Kubernetes - 컨테이너 오케스트레이션이란 ? (1) (0) | 2024.07.15 |
[Docker] Docker 맛보기 - 컨테이너 실행/중단 (2) (0) | 2024.04.12 |
[Docker] Docker 맛보기 - 특징과 설치 (1) (0) | 2022.08.11 |