본문 바로가기

Micro Service Architecture/Docker

19. docker-compose 문법

반응형
250x250
반응형

1. version : docker compose 버전, 버전 별로 차이가 있으므로 버전을 정이해주는 것이 좋음.

version: "3"

 

2. image : 로컬에 이미지가 없다면 docker hub에서 다운로드하여 베이스 이미지로 사용.

services:                   # 컨테이너의 서비스라는것을 정의

  nginx:                    # [이미지명]:

    image: centos:7         # image: [이미지명]:[태그명]

 

3. build : 이미지를 정의할때 dockerfile을 사용하여 빌드할 수 있음.

# dockerfile이 같은 디렉토리 내에 있으면

# docker-compose.yml

services:

  nginx:

    build: .



# dockerfile이 다른 디렉토리에 있다면

services:

  nginx:

  build:

    context: /mnt/backup            ## Dockerfile이 있는 경로 (절대경로 또는 상대경로)

    dockerfile: Dockerfile-agent    ## 파일명이 Dockerfile이 아닐 경우 파일명 기입



# dockerfile내에 이미지 정의

# Dockerfile

FROM centos:7

 

4. command : container가 실행 될 때 수행할 명령어. docker run에서 마지막에 붙는 command와 같음.

# centos의 실행 시킬 프로세스가 없다면 스스로 소명 하므로 계속 떠 있어야 할 조건을 만들어 주어야 함.

services:                       # 컨테이너의 서비스라는것을 정의

  nginx:                        # [이미지명]:

    image: centos:7             # image: [이미지명]:[태그명]

    command: tail -f /dev/null  # 계속 컨테이너가 떠 있어야 할 조건





# 만약 도커파일을 통해 빌드를 진행 한다면 도커파일내에 CMD 보다 우선 하며 오버라이드 한다.

 

5. ports : 서비스 포트

# docker-compose.yml

version: "3"

services:

  nginx:

    build: .

    ports:

      - "8080:8080"

      #또는

      - target: 8080       ## 컨테이너 내부 포트

        published: 8080    ## 호스트OS에서 공개할 포트

        protocol: tcp      ## 포트 프로토콜

 

 

6. expose: 컨테이너 내부 포트만 정의(컨테이너 - 컨테이너 간 통신)

# docker-compose.yml

version: "3"

services:

  nginx:

    build: .

    expose:

      - "8080"

 

7. depends_on : 서비스 간 종속성 순서

# 하기 예로 redis가 먼저 실행 되고 nginx가 실행 된다.

# docker-comse.yml

version: "3"

services:

  nginx:

    build: .

    depends_on:

      - redis

    redis:

      image: redis

 

 

8. environment, env_file : dockerfile의 env 명령과 같이 컨테이너의 환경 변수를 지정

# docker-compose.yml

environment:

  - RACK_ENV=devlopment

  - SHOW=true

   

  #또는

environment:

  RACK_ENV: devlopment

  SHOW: 'true'







env_file: .env

   

  #또는



env_file:

  - ./common.env

  - ./apps/web.env

 

 

9. container_name : 컨테이너 이름 지정

# docker-compose.yml



# container_name: [사용할 컨테이너명]

container_name: nginx
 

 

10. volumes, volumes_from : dockerfile에서 사용되던 volume과 같이 컨테이너에 볼륨을 마운트

# docker-compose.yml

volumes:

  - /var/log/test:/var/log

  - ~/configs:/etc/configs/:ro







#또는아래와 같이 log라는 컨테이너로 마운트

volumes_from:

  - log

 

11. devices :  호스트의 장치를 컨테이너에서 사용할 수 있도록 연결

devices:

  - "/dev/ttyUSB0:/dev/ttyUSB0"

 

12. healthcheck : 서비스의 상태를 체크

# 컨테이너가 시작하고 40초 후부터 1분 30 초마다 웹 서버가 10초 이내에

# 기본 페이지를 제공하는 확인

# 실패시 3번 재시도 함

#

healthcheck:

  test: ["CMD", "curl", "-f", "http://localhost"]

  interval: 1m30s

  timeout: 10s

  retries: 3

  start_period: 40s

 

13. links : docker run의 --link와 같으며 container 끼리 연결 할때 사용. 현재는 network로 대체되어 lagacy.

# [service:alias] 형태로 사용가능

services:

  web:

    links:

      - db

      - db:database

      - redis

 

14. network : docker run의 --net 과 같음. docker-compose에서 network를 생성 할 수도 있고 다른container에 생성된 네트워크를 공유 할 수도 있음. docker-compose에 의해 생성된 네트워크는 삭제시에 같이 삭제 됨.

# mynetwork를 bridge 형태로 생성하고 nginx와 centos7을 같은 네트워크로 묶어줌.

version: "3"

services:

  nginx:

    image: nginx:latest

    ports:

      - "8080:80"

    depends_on:

      - centos7

    healthcheck:

      test: ["CMD", "curl", "-f", "http://localhost"]

      interval: 1m30s

      timeout: 10s

      retries: 3

      start_period: 40s

    networks:

      - mynetwork



  centos7:

    image: ansible/centos7-ansible:latest

    command: tail -f /dev/null

    networks:

      - mynetwork



networks:

  mynetwork:

    driver: bridge

 

15. extra_hosts : 컨테이너 내부 /etc/hosts 에 호스트 정보를 추가한다.

version: "3"

services:

  nginx:

    image: nginx:latest

    ...

    extra_hosts:

      - "plo:1.1.1.1"

      - "plo2:1.1.1.2"





# 실제 컨테이너 /etc/hosts

1.1.1.1 plo

1.1.1.2 plo2

16. dns : 컨테이너의 커스텀 dns 설정

dns:
  - 8.8.8.8
  - 8.8.4.4

 

17. ipam : 생성 될 network의 ip 설정 정보 

# subnet 입력시 배열 주의
# "ERROR: Invalid subnet  : invalid CIDR address:" <<- 에러 날 수 있음.
networks:
  mynetwork:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.0.0/16
          gateway: 172.28.0.1

 

  • docker-compose command
# 실행
$ docker-compose up


# 백그라운드 실행
$ docker-compose up -d


# docker compose 파일이 다른 경로에 있을때
$ docker-compose -f <PATH> up -d


# docker compose에 정의되어 이는 서비스 컨테이너를 한번에 정지시키고 컨테이너를 삭제
$ docker-compose -f <PATH> down


# down시 컨테이너 확인
$ docker-compose -f <PATH> ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


# 중지
$ docker-compose -f <PATH> stop


# 중지 되어 있는 컨테이너를 다시 올려줌
$ docker-compose -f <PATH> start


# 실행 + 빌드
$ docker-compose up --build


# 로그
# -f 옵션: 실시간 보기
# 특정 service의 로그를 볼수도 있음.
$ docker-compose -f <PATH> logs -f <service_name>


# 실행 중인 컨테이너를 대상으로 명령어를 날릴때
$ docker-compose exec <service_name> <명령어>
$ docker-compose exec centos7 /bin/bash  # docker exec -it centos7 /bin/bash 와 같음.




# 실행 중인 컨테이너에 단발성으로 명령어를 날릴때
$ docker-compose run <service_name> <명령어>


# docker compose 설정을 확인 및 검증
$ docker-compose -f <PATH> config




# 실행중인 컨테이너의 프로세스 표시
$ docker-compose top
반응형