개발놀이터

docker-compose 주요 문법 본문

배포/Docker

docker-compose 주요 문법

마늘냄새폴폴 2023. 6. 12. 15:42

이번 포스팅에선 docker-compose 에서 사용되는 주요 문법들에 대해서 포스팅해보도록 하겠습니다. 

 

요즘 docker에 빠져있는데요. docker는 작은 프로젝트에 한해선 단점이 하나도 없는 좋은 기술인 것 같습니다. 

 

docker-compose는 docker의 다양한 설정들을 보기쉽게 정리하고 나중에 설정이 바뀌었을 때 유지보수도 쉽게 도와주는 docker의 좋은 파트너입니다. 

 

보통 docker-compose는 yml (야믈) 파일로 저장되는데요. 그렇기 때문에 우리가 스프링에서 application.yml 을 써봤다면 조금은 익숙하실겁니다. 

 

이제 본격적으로 시작해보죠!

 

docker-compose 문법

1. image

docker-compose 안에서 이미지를 선택할 수 있습니다. 만약 로컬에 있는 커스텀 이미지를 불러오고싶다면 해당 이름을 넣으면 됩니다. 만약 로컬에 없는 이미지를 입력하면 이미지를 내려받아줍니다. 

 

services:
  proxy:
    image: nginx:latest # nginx 이미지

 

2. build

build는 docker-compose에서 Dockerfile을 이용해 자동으로 docker build를 실행하고 생성된 이미지를 베이스 이미지로 사용합니다. 

 

servies:
	server:
    	build: # Dockerfile 빌드

 

보통 저는 docker-compose 파일과 Dockerfile을 같은 디렉토리에 넣기 때문에 위와같은 문법을 사용하면 되지만 혹여 Dockerfile과 docker-compose가 다른 위치에 있는 경우 그리고 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과 docker-compose의 entrypoint는 실제로 image가 빌드되고 컨테이너로 올라갈 때 실행할 명령을 적을 수 있다는 점입니다. 

 

#docker-componse.yml
services:
  nginx:
    build: .
    entrypoint: cat /etc/hosts
    # 또는
    entrypoint:
      - /bin/cat
      - /etc/hosts

이렇게 코드를 작성하면 docker-compose가 실행될 때 cat /etc/hosts의 명령어가 실행됩니다. 

 

Dockerfile의 CMD 쓰면 되는거 아냐? 이렇게 생각하신 분들도 있을텐데요. Dockerfile의 CMD와 ENTRYPOINT는 엄연히 다릅니다. 이에 대해서는 추후에 포스팅해보도록 하겠습니다. 

 

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와 직접적으로 연결되지 않고 링크등으로 연결된 컨테이너-컨테이너간의 통신만 필요한 경우 사용합니다. 

 

일반적으로 로그 서버와 같이 호스트 머신에서 직접 액세스 하지 않고, 우베 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 액세스 하고 싶은 경우등에 사용됩니다. 

 

# docker-compose.yml
version: "3"
services:
 server:
    build: # Dockerfile 빌드
    expose:
      - 8080 # 도커 내부적 포트

 

즉 정리하자면, expose는 호스트 쪽에서 접근이 불가능하고, 컨테이너끼리만 통신이 가능하도록 지정하는 것입니다. 

 

6. volume

Dockerfile에서 사용되는 volume과 같이 컨테이너에 디렉토리 혹은 파일을 마운트할 때 사용됩니다. <호스트>:<컨테이너> 방식으로 사용하고 마지막에 :ro를 추가해 볼륨을 읽기 전용으로 사용할 수도 있습니다. 

 

# docker-compose.yml
volumes:
  - ./mysql/mysql_data:/var/lib/mysql
  - ./mysql/sqls/:/docker-entrypoint-initdb.d/

 

이렇게 만든 docker-compose 를 실행하고 싶다면 아래와 같은 명령어를 작성하면 됩니다. 

 

$ docker-compose -f ./docker-compose.yml up -d

해석하자면 현재 디렉토리에 있는 docker-compose.yml 파일을 기반으로 컨테이너를 백그라운드로 띄워줘 가 되겠습니다. 

마치며

이렇게 docker-compose문법에 대해서 알아봤습니다. docker-compose를 실제로 자신이 작성할 수 있을만큼 익히는 것도 중요하겠지만, 누군가 작성한 docker-compose 파일을 똑같이 옮겨 적을 때 의미없이 옮겨 적는 것 보다 알면서 옮겨 적는게 아무래도 조금 더 도움이 될 듯합니다. 

 

이제 다음은 docker-compose의 명령어에 대해서 알아보도록 하고 이어서 Dockerfile에 대해서 알아보도록 하겠습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://seokhyun2.tistory.com/61

 

[Docker] RUN, CMD, ENTRYPOINT 차이점

도커파일 작성 시에, 사용할 수 있는 명령어 중에 실행하는 것과 관련된 명령어는 RUN, CMD, ENTRYPOINT 세 가지가 있습니다. 세 명령어에 대한 차이점을 예시와 함께 확인해보도록 하겠습니다. 1. RUN

seokhyun2.tistory.com

https://narup.tistory.com/207

 

[Docker] Docker Compose 문법 정리

docker compose 문법 정리 도커 컴포즈는 여러 개의 도커 이미지 + 여러 개의 도커파일을 순차적으로 실행시켜 컨테이너로 만들어주는 명령어 파일을 말합니다! 도커 파일이 이미지를 만드는 거니까

narup.tistory.com