Container/Docker

[Docker CE] docker-compose 문법 간단 정리 (2) (ports, expose, depends_on, nevironment, env_file, container_name, labels, volumes, volumes_from)

Nirsa 2020. 1. 22. 13:43
반응형

 

1편 (image, build, command, entrypoint, links) : https://nirsa.tistory.com/79?category=868315

 

  • 5. ports

ports는 호스트OS와 컨테이너의 포트를 바인딩 시켜줍니다. 참고로 아래 docker-compose.yml을 작성할 때 주의해야할 점이 있는데 "8080:8080"와 같이 작성할 경우 반드시 따옴표와 함께 사용하여 문자열로 지정 해주어야 합니다.

형식은 "host:container" 또는 "container" 등으로 사용 됩니다. 아이피를 지정해준다거나, 포트의 범위 등 설정이 가능하고 자세한 설정들은https://docs.docker.com/compose/compose-file/ 를 참고해주세요.

* 이 명령은 docker-compose up 명령으로 실행할 때만 적용이 되므로 docker-compose run 명령으로 실행해야할 경우 --service-ports 옵션을 사용해주세요. (포트를 다시 입력하여활성화 시키고 필요에 따라 호스트와 맵핑시켜주는 역할을 합니다)

# docker-compose.yml
version: "3"
services:
  nginx:
    build: .
    ports:
      - "8080:8080"
      #또는
      - target: 8080       ## 컨테이너 내부 포트
        published: 8080    ## 호스트OS에서 공개할 포트
        protocol: tcp      ## 포트 프로토콜
# Dockerfile
FROM centos:7

RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx

CMD ["nginx", "-g", "daemon off;"]

 

  • 6. expose

expose는 호스트OS에 포트를 공개하지 않고, 컨테이너만 포트를 공개 합니다. 호스트OS와 직접 연결되지 않고 링크등으로 연결된 컨테이너-컨테이너간의 통신만이 필요한 경우 등에 사용 됩니다.

 

아래와 같이 작성 후 docker-compose up -d --build 로 실행하고 netstat -antop 사용 시 호스트 OS에는 포트가 공개되지 않고, docker container ls 명령 등으로 컨테이너에서만 포트가 공개되는걸 확인할 수 있습니다. (Dockerfile에 EXPOSE가 명시되어 있다면 docker-compose에서는 작성하지 않아도 됩니다)

# docker-compose.yml
version: "3"
services:
  nginx:
    build: .
    expose:
      - "8080"
# Dockerfile
FROM centos:7

RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx

CMD ["nginx", "-g", "daemon off;"]

 

 

  • 7. depends_on

depends_on 명령은 서비스간의 종속성 순서대로 서비스를 시작할 수 있습니다. 예를들어 nginx와 redis라는 두 이미지가 있을 때 redis부터 실행하고 nginx를 실행해야 할 경우 등에 사용 됩니다.

 

아래 코드는 redis 이미지를 docker hub 에서 다운로드 받고, 먼저 실행한 뒤 nginx를 실행 합니다.

# docker-comse.yml
version: "3"
services:
  nginx:
    build: .
    depends_on:
      - redis
    redis:
      image: redis
# Dockerfile
FROM centos:7

RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo

RUN yum -y install nginx

CMD ["nginx", "-g", "daemon off;"]

 

하지만 depends_on의 가장 큰 단점이 있는데 위 예제같은 경우 redis를 실행한 뒤 nginx를 실행해야 하는데, redis가 완전히 실행되고 준비가 될 때 까지 기다리지 않습니다. 

때문에 depends_on을 사용할때엔 시작과 종료 순서에 대해 제어를 해주어서 정상적으로 준비가 된 뒤 다음 서비스가 실행되도록 해주어야 합니다. 이 내용은 다음에 업로드 하겠습니다.

제어 관련 참고 사이트 : https://docs.docker.com/compose/startup-order/

 

  • 8. environment, env_file

이 두 명령어는 dockerfile의 env 명령과 같이 컨테이너의 환경 변수를 지정해줄 수 있습니다. (참고:https://nirsa.tistory.com/69?category=868315) env_file은 docker-compose가 아닌 다른 파일에 지정할 환경 변수들을 모아두고, 해당 파일을 읽어와서 사용할 때 사용 됩니다.

## docker-compose.yml
#environment

environment:
  - RACK_ENV=devlopment
  - SHOW=true
  
  #또는
environment:
  RACK_ENV: devlopment
  SHOW: 'true'
## docker-compose.yml
#env_file

env_file: .env
  
  #또는

env_file:
  - ./common.env
  - ./apps/web.env

 

  • 9. container_name

컨테이너 이름을 지정해 줍니다.

# docker-compose.yml

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

 

  • 10. labels

이미지 구성이나 라이센스 기록, 컨테이너, 볼륨 및 네트워크간의 관계에 주석을 달거나 할때에 사용 됩니다.

라벨은 키-값 쌍이며 문자열로 저장 됩니다. 여러개의 라벨을 지정할 수 있지만 각각의 키-값 쌍은 유일해야하는데, 만약 동일한 키에 여러 값이 작성되면 가장 최근에 작성된 값이 이전 모든 값을 덮어 씁니다.

 

일반적으로 다른 S/W의 라벨과 중복되어 겹치는 일이 없도록 역 DNS 표기법을 사용하여 코멘트를 달아놓습니다.

# docker-compose.yml

build:
  context: .
  lablees:
    com.example.description: "nirsa nginx"
    com.example.department: "Finance"

 

  • 11. volumes, volumes_from

dockerfile에서 사용되던 volume과 같이 컨테이너에 볼륨을 마운트 할 때에 사용 됩니다. host:container 방식으로 사용되고 마지막에 :ro 를 추가하여 볼륨을 읽기 전용으로 사용할 수 있습니다.

# docker-compose.yml
volumes:
  - /var/log/test:/var/log
  - ~/configs:/etc/configs/:ro

아래 코드는 volumes_from 을 이용하여 log라는 컨테이너로 마운트 합니다. 

# docker-compose.yml

volumes_from:
  - log

 

volumes도 활용 범위가 매우 많아 나중에 업로드 할것이고 자세한건 https://docs.docker.com/compose/compose-file/ 를 참고해주세요.

반응형