docker compose 문법 정리
도커 컴포즈는 여러 개의 도커 이미지 + 여러 개의 도커파일을 순차적으로 실행시켜 컨테이너로 만들어주는 명령어 파일을 말합니다!
도커 파일이 이미지를 만드는 거니까...
여러 개의 이미지를 실행 할 때 필요한 환경설정 값들을 도커 컴포즈에서 모두 관리한다고 생각하시면 됩니다!
1. image
docker-compose 안에서 베이스 이미지를 지정할 수 있는데, docker build를 할 때와 마찬가지로 이미지가 로컬 환경에 없다면 해당 이미지를 다운받아서 base 이미지로 사용합니다.
<이미지이름> : <버전>
services:
proxy:
image: nginx:latest # nginx 이미지
2. build
build는 docker-compose에서 dockerfile을 이용해 자동으로 docker build를 실행하고 생성된 이미지를 base 이미지로 사용합니다.
servies:
server:
build: # Dockerfile 빌드
만약 dockerfile의 경로나 이름이 다른 곳에 있다면 특정 경로를 작성해 dockerfile을 지정할 수 있습니다.
servies:
server:
build: # Dockerfile 빌드
context: ./src/servers # Dockerfile 빌드 경로
dockerfile: dockerfile-server # dockerfile의 파일명이 dockerfile이 아닐 경우 파일명을 입력해야합니다.
3. command / entrypoint
위 command는 Dockerfile의 entrypoint와 거의 비슷합니다. 다만, dockerfile의 entrypoint보다 docker-compose의 entrypoint가 우선순위가 더 높습니다!
아래와 같이 dockerfile에 entrypoint를 정의해도 docker-compose를 실행하게 되면 dockerfile의entrypoin를 덮어쓰고 docker-compose의 entrypoint가 우선적으로 실행되게 됩니다.
#docker-componse.yml
services:
nginx:
build: .
entrypoint: cat /etc/hosts
# 또는
entrypoint:
- /bin/cat
- /etc/hosts
# Dockerfile
FROM centos:7
ENTRYPOINT ["/bin/ls", "-lh", "/root"]
4. ports
ports는 호스트 OS와 컨테이너의 포트를 바인딩 시키는 포트포워딩의 역할을 합니다. ports아래 옵션을 추가할 수 있는데, target은 컨테이너 내부 포트고, published는 호스트OS의 포트입니다. protocol은 포트 프로토콜을 지정할 수 있습니다.
ports는 <호스트 머신의 포트번호> : <컨테이너의 포트 번호> 와 같은 순서로 바인딩이 이루어집니다. 만약, 8080:8080이 아닌 8080만 지정했을 경우(컨테이너의 포트번호만 지정한 경우, 호스트 머신의 포트는 랜덤한 값으로 설정됩니다. 4631(랜덤):8080와 같이요.
# docker-compose.yml
version: "3"
services:
nginx:
build: .
ports:
- "8080:8080"
#또는
- target: 8080 ## 컨테이너 내부 포트
published: 8080 ## 호스트OS에서 공개할 포트
protocol: tcp ## 포트 프로토콜
5. expose
expose는 호스트os에 포트를 공개하지 않고, 컨테이너만 포트를 공개합니다. 즉, 호스트 OS와 직접적으로 연결되지 않고 링크등으로 연결된 컨테이너-컨테이너간의 통신만이 필요한 경우에 사용됩니다.
일반적으로 로그 서버와 같이 호스트 머신에서 직접 액세스하지 않고, 웹 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 액세스하고 싶은 경우 등에 사용되는데,
예를 들면 A컨테이너에 express서버와 B컨테이너에 nginx간의 통신만이 필요할 경우, A컨테이너의 express 측에 expose를 설정해 컨테이너끼리 통신할 수 있도록 설정하는 것입니다.
만약 dockerfile에 expose가 명시되어 있다면 docker-compose에는 작성하지 않아도 됩니다!
# docker-compose.yml
version: "3"
services:
server:
build: # Dockerfile 빌드
expose:
- 8080 # 도커 내부적 포트
다시 한 번 정리하자면, expose는 호스트 쪽에서는 접근이 불가능하며, 컨테이너 사이의 통신만 가능하도록 지정하는 것입니다.
6. volume
dockerfile에서 사용되는 volume과 같이 컨테이너에 볼륨을 마운트할 때 사용됩니다. <호스트>:<컨테이너> 방식으로 사용하고 마지막에 :ro를 추가해 볼륨을 읽기 전용으로 사용할 수 있습니다.
보통 도커 컴포즈를 통해 빌드하게 되면 이미지가 생성되는데, 개발을 하다보면 수시로 코드를 수정하게 되는데 수정할 때마다 이미지를 재생성하면 굉장히 비효율적이게 됩니다.
이때 코드 수정을 하고 있는 호스트의 경로를 컨테이너와 연결시켜서 이미지 빌드 없이 코드가 반영될 수 있도록 하는 것이 volume입니다!
# docker-compose.yml
volumes:
- ./mysql/mysql_data:/var/lib/mysql
- ./mysql/sqls/:/docker-entrypoint-initdb.d/
'Backend&Devops > Docker' 카테고리의 다른 글
[리눅스] docker, docker-compose 설치 (0) | 2024.02.21 |
---|---|
[Docker] 도커 안에 젠킨스 설치 (도커 인 도커, Docker In Docker, D in D) (0) | 2022.05.06 |
[Dockerfile] Dockerfile express 연동하기 (0) | 2021.12.21 |
[Dockerfile] Dockerfile이란? Dockerfile 옵션 (1) | 2021.12.21 |
[Docker] 도커에 젠킨스 설치, 도커에 젠킨스 연동 (0) | 2021.12.14 |