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/ 를 참고해주세요.