![[Docker/기초] Docker-comopse 파일 만들기 (version 3) (2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaMxua%2FbtsK81SDWgN%2Fk2pK6LGkMowhUn8h3jA0sk%2Fimg.png)
이번글의 docker 실행 방식은 다음을 따른다.
- DockerFile을 만들어서 커스텀 Dockerfile 만들기
이떄 기본 이미지를 dockerhub에서 받아오고 커스터마이징 한다. - 1번에서 만든 Dockerfile을 사용해서 docker-image 빌드하기
- network 설정 추가 알아보기
- docker-compose 명령어
이번글에서 설명하는 내용은 2번이다.
1번을 보고싶은 경우 여기로 이동하면 된다.
[Docker/기초] Docker File 만들기 (1)
이번글의 docker 실행 방식은 다음을 따른다.DockerFile을 만들어서 커스텀 Dockerfile 만들기이떄 기본 이미지를 dockerhub에서 받아오고 커스터마이징 한다.1번에서 만든 Dockerfile을 사용해서 docker-image
naturecancoding.tistory.com
지금을 기준으로 작성하기 떄문에 현재 표준으로 사용하는 3.x 버전을 기반으로 작성한 글이다.
Docker Engine 1.13 이상에서 사용가능하다.
특징으로는 스웜 모드, 네트워크, 볼륨, 의존성등의 고급 기능 강화, deploy 옵션으로 리소스 제한 및 분산 설정 가능이다.
2. Dockerfile을 사용하는 docker-compose 파일 만들기
그래서 이건 왜 사용함?
- 여러 컨테이너 관리 간소화
여러 컨테이너를 각각 docker run명령어로 관리하는건 쉽지 않을 것이다. 그래서 docker-compose.yml파일에서 여러가지를 한번에 관리할 수 있다. - 환경 정의 일관성 유지 가능
여러 컨테이너를 한번에 설정함으로써 컨테이너들이 공유해야하는 환경을 잘 유지할수 있다.
이는 DevOps롸 CI/CD 파이프라인에서 매우 큰 역할을 한다. - 네트워크 자동 설정
docker의 경우 네트워크 통신을 사용해 통신할 수 있다. 이를 통해서 서로 통신이 쉬워지거나 안정성을 확보할 수 있다. - 확장성
dockerfile에서 진행하는 설정 뿐만아니라 여러 설정을 추가적으로 진행할 수 있다.
yml형식으로 작성하기 때문에 가시성이 좋다는 것 또한 장점이다.
docker-compose.yml 에서 사용하는 설정
yml형식을 사용하다보니 들여쓰기가 중요하다. 한번 설정이 뭐가있는지 이해하고 전체적인 모습을 보는 것이 중요하다.
몇몇 명령어는 dockerfile과 같은 설정이 있다. 이는 덮어쓰며지거나 어떤걸 사용할껀지 선택하도록 해야한다. 목록은 접은 글을 펼쳐보자
Docker Compose가 Dockerfile을 덮어쓰는 항목
- command
- entrypoint
- environment
- build.args
- working_dir
- volumes
- ports
- restart
- networks
- depends_on
Docker Compose가 Dockerfile을 덮어쓰지 않는 항목
- FROM
- RUN
- COPY
- ADD
- EXPOSE
- LABEL
- USER
- ENV (초기 설정값은 유지, 추가 또는 덮어쓰기 가능)
- WORKDIR (Compose에서 따로 설정하지 않으면 Dockerfile 값 유지)
- MAINTAINER
version (필수)
Docker Compose 파일의 스키마 버전을 지정한다.
version: '3.9'
이는 작성하지 않으면 자동으로 1버전으로 선택될수 있음으로 필수적으로 지정하는 것이 좋다.
자동 지정될시 버그가 생길 확률이 높다.
services (필수)
컨테이너를 정의하는 핵심 블록이다.
어떤 방식으로 컨테이너를 생성할지 지정한다.
방식은 2가지로 나뉜다.
1. Dockerfile 없이 Docker Hub에서 사용하는 기본 이미지를 사용하는 방식
services:
web: # 애플리케이션 컨테이너 이름 (임의로 지정 가능)
image: nginx:latest # Docker Hub에서 nginx 최신 이미지를 사용
2. Dockerfile을 사용해서 직접 이미지를 빌드하고 실행하는 방식
services:
web: # 애플리케이션 컨테이너 이름 (임의로 지정 가능)
build: # Dockerfile을 사용해 이미지를 빌드
context: . # 현재 디렉토리를 빌드 컨텍스트로 사용
dockerfile: Dockerfile # 사용할 Dockerfile 지정 dockerfile이 존재하는 경로 설정을 해줘야한다.
image: mywebapp:latest # 빌드된 이미지를 "mywebapp:latest"로 태그
build (필수)
위에서 봤지만 한번더 설명한다.
Dockerfile을 사용해서 이미지를 빌드한다.
build:
context: .
dockerfile: Dockerfile
context : dockerfile이 위치한 디렉토리
dockerfile : dockerfile의 이름
context를 .으로 지정해 현재 디렉토리로 하고 dockerfile에서 경로설정을 진행해도 된다.
image (필수)
컨테이너를 생성할때 사용할 이미지 이름을 지정하면된다.
image: nginx:latest
container_name
생성될 컨테이너의 이름을 설정한다.
container_name: my_app_container
port (필수)
ports:
- "8080:80" # 호스트:컨테이너
앞에 작성되는 부분이 외부에서 컨테이너로 접근하는 port이고 뒤에 작성되는 부분이 외부 port에 매핑되는 컨테이너 내부 port이다.
volumes
호스트와 컨테이너 간의 파일 공유이다.
volumes:
- ./data:/app/data
파일로 지정하게되면 파일이 공유되고 디렉토리로 지정시 디렉토리가 지정된다.
port와 마찬가지로 (컨테이너 외부 디렉토리):(컨테이너 내부 디렉토리)이다.
컨테이너가 종료되도 데이터를 유지시키려고 할때 사용할 수 있다.
여러 디렉토리를 volumes로 지정할 수 있다.
디렉토리를 설정하면 디렉토리안에 있는 모든걸 공유한다. (권한 설정에 유의하자)
environment
환경 변수를 설정한다.
environment:
- APP_ENV=production
- DEBUG=false
command
컨테이너 시작시 실행할 명령어를 지정한다.
command: ["python3", "app.py"]
entrypoint
컨테이너의 고정 실행 명령어를 설정한다.
컨테이너 실행시 반드시 실행되야하는 프로그램 혹은 스크립트를 지정할 수 있다.
entrypoint: ["/usr/local/bin/my-entrypoint.sh"]
depends_on
컨테이너 실행 순서를 설정한다.
어떤 컨테이너는 다른 컨테이너가 무조건 있어야 실행할 수 있을 때 사용하면 좋다.
depends_on:
- db
- redis
restart
컨테이너 재시작 정책을 정의한다. 컨테이너가 종료되었을때 어떤 행동을 취할껀지 정할수 있다.
restart: always
- no: 재시작하지 않음.
- always: 항상 재시작.
- on-failure: 오류 발생 시 재시작.
- unless-stopped: 중지되지 않는 한 항상 재시작.
윈도우에서 돌릴때는 컴퓨터가 켜질때 자동으로 컨테이너 시작하도록 always를 거는 일이 많다.
networks
네트워크를 설정한다. 네트워크를 컨테이너에 할당할때엔 네트워크가 이미 존재하고 있어야 한다.
services:
app:
image: nginx:latest
networks:
- my_custom_network
docker compose파일에 네트워크가 없으면 자동으로 생성하는 명령어를 적을수도 있다.
networks:
my_custom_network: # 사용자 지정 네트워크 정의
driver: bridge
추가설명은 아래 링크에서 볼수 있다.
[Docker/기초] Docker 네트워크 (3)
이번글의 docker 실행 방식은 다음을 따른다.DockerFile을 만들어서 커스텀 Dockerfile 만들기이떄 기본 이미지를 dockerhub에서 받아오고 커스터마이징 한다.1번에서 만든 Dockerfile을 사용해서 docker-image
naturecancoding.tistory.com
healthcheck
컨테이너 상태를 확인하는 방식을 설정할 수 있다.
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
- 지정방식은 여러개가 있으니까 추가로 확인해보면 된다.
- 이런 방식으로 상태를 확인해서 컨테이너가 정상적으로 실행중인지 아닌지 판단하게 할수 있다.
logging
컨테이너 로그를 어떤식으로 관리할지 설정할수있다.
logging:
driver: "syslog"
options:
syslog-address: "udp://localhost:8080" 로그를 전송할 대상
tag: "my-container"
이런식으로 여러 방식이 있으니 이런 명령어도 있구나 정도 이해하자
lables
추가적인 정보인 메타데이터를 기록할수 있다.
labels:
app: "my-application"
version: "1.0"
maintainer: "team@mycompany.com"
어플리케이션 정보, 개발자 정보, 배포 환경 기록등을 할수 있다.
ulimits
컨테이너의 리소스 제한을 설정할 수 있다.
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
여러가지 설정을 진행할 수 있음으로 여기서는 이런 기능이 있구나 정도를 이해하자
privileged
컨테이너를 호스트와 동일한 권한으로 실행한다.
privileged: true
이는 여러 위험이 있다.
- 보안 격리 해제
컨테이너가 호스트 커널과 상호작용하며 공격 취약점이 생긴다. - 호스트 시스템 손상 가능성
컨테이너 내의 잘못된 설정 혹은 코드가 악영향을 끼칠수 있다. - 데이터 유출 위험
컨테이너가 호스트 디바이스나 시스템 디렉토리에서 민감한 데이터를 읽을 수 있다.
최종코드
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile
image: my_app:latest
container_name: app_container
ports:
- "8080:8080"
volumes:
- ./data:/app/data
environment:
- APP_ENV=production
restart: always
depends_on:
- db
networks:
- app_network
db:
image: postgres:13
container_name: db_container
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app_network
networks:
app_network:
driver: bridge
volumes:
db_data:
이제 자유롭게 사용해보자
'Deployment > Docker 기초' 카테고리의 다른 글
[Docker/기초] Docker-compose 명령어 & 설치 (4) (0) | 2024.12.05 |
---|---|
[Docker/기초] Docker 네트워크 (3) (0) | 2024.12.05 |
[Docker/기초] Docker File 만들기 (1) (0) | 2024.12.05 |
[Docker/기초] Volume (0) | 2024.02.15 |
[Docker/기초] Docker 상위 커맨드 ls 정리 (0) | 2024.02.14 |
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간