여러개의 서비스 또는 특정 서비스를 시작 / 정지 / 일시정지 / 재시작을 할 수 있습니다.
# 서비스 시작
docker-compose start
# 서비스 정지
docker-compose stop
# 서비스 일시 정지
docker-compose pause
# 서비스 일시 정지 해제
docker-compose unpause
# 서비스 재시작
docker-compose restart
각각의 설정 뒤에 서비스명을 붙이면 특정 서비스만 제어할 수 있습니다. (ex. docker-compose restart [서비스명])
docker-compose rm
docker-compose로 생성한 컨테이너들을 일괄 삭제 합니다. (삭제 전, 관련 컨테이너들을 종료 시켜두어야 합니다.)
docker-compose rm
docker-compose kill
실행중인 컨테이너를 강제로 정지 시킵니다.
-s옵션을 사용하여 시그널을 지정해줄 수 있는데, 아래 코드에서는 SIGINT를 사용 하였습니다. -s 옵션을 사용하지 않고 docker-compose kill만 사용할 경우 SIGKILL 이 전송 됩니다.
* 이 명령은 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에서는 작성하지 않아도 됩니다)
이 두 명령어는 dockerfile의 env 명령과 같이 컨테이너의 환경 변수를 지정해줄 수 있습니다. (참고:https://nirsa.tistory.com/69?category=868315) env_file은 docker-compose가 아닌 다른 파일에 지정할 환경 변수들을 모아두고, 해당 파일을 읽어와서 사용할 때 사용 됩니다.
docker-compose는 여러개의 컨테이너 설정 내용을 하나의 파일에 모아서 사용하는 YAML 파일 입니다. 이 docker-compose는 컨테이너의 서비스(services:), 네트워크(networks:), 볼륨(volumes:)을 정의 합니다.
docker-compose의 버전에 따라 여러 차이가 있기 때문에 작성할 때엔 아래처럼 버전을 정의 해주는것이 좋습니다.
version: "3"
docker compose의 기본적인 실행/중지 명령은 docker-compose up, docker-compose stop 이고, 실행 시키면서 빌드를 진행할 때에는 docker-compose up --build 를 사용 합니다.
1. image
docker-compose 안에서 베이스 이미지를 지정할 수 있습니다. docker build를 할때와 마찬가지로 베이스 이미지가 로컬 환경에 없다면 Docker hub에서 다운로드하여 베이스 이미지로 사용되고, 로컬 환경에 있다면 그 이미지를 베이스 이미지로 사용하게 됩니다.
1번은 어떤 베이스 이미지를 사용할 지 docker-compose 안에서 선언을 해주었다면, docker-compose에서 선언하여 Dockerfile을 이용해 자동으로 docker build 후 베이스 이미지로 사용할 수 있습니다.
# docker-compose.yml
services:
nginx:
build: .
# Dockerfile
FROM centos:7
위와 같이 설정 후 docker-compose up 명령어를 입력하면 자동으로 Dockerfile을 빌드하여 베이스 이미지를 만들고 centos를 기반으로 한 nginx 이미지를 생성해줍니다.
만약 Dockerfile의 경로나 이름이 다른곳에 있다면 아래와 같이 특정 Dockerfile을 지정해줄 수 있습니다.
services:
nginx:
build:
context: /mnt/backup ## Dockerfile이 있는 경로 (절대경로 또는 상대경로)
dockerfile: Dockerfile-agent ## 파일명이 Dockerfile이 아닐 경우 파일명 기입
args 으로 인수를 지정해줄 수 있는데, Dockerfile에서 ARG 또는 ENV로 지정한 변수에 값을 넣거나 할 수 있습니다. (args는 Dockerfile의 ARG와 비슷 합니다. docker-compose 명령이 실행되는 구간에서만 적용 됩니다.)
build 문법을 사용할 때에 하위 옵션(context, args 등)을 사용하게 되면 build: 옆에 인수를 비워두고 하위 옵션에 작성해주어야 합니다. 아래 코드를 참고 하시고, Dockerfile에 있는 환경변수 number에 docker-compose.yml을 이용하여 args로 환경변수에 값을 넣어준 결과 입니다.
# Dockerfile
FROM centos:7
ARG number
RUN echo "$number"
3. command / entrypoint
Dockerfile의 cmd,entrypoint와 거의 같습니다. 하지만 Dockerfile의 entrypoint보다 docker-compose의 entrypoint가 우선 순위가 높습니다.
즉, 아래 이미지와 같이 Dockerfile에 entrypoint를 정의 하여도 docker-compose를 실행 및 빌드할 때에 Dockerfile의 entrypoint를 덮어써서 docker-compose에 작성한 명령이 실행 됩니다.
# docker-compose.yml
version : "3"
services:
nginx:
build: .
entrypoint: cat /etc/hosts
# 또는
entrypoint:
- /bin/cat
- /etc/hosts
# Dockerfile
FROM centos:7
ENTRYPOINT ["/bin/ls", "-lh", "/root"]
4. links
links는 각 컨테이너들을 연결시켜주는 역할을 하는데, links는 Docker의 레거시 기능으로 Docker 공식 홈페이지에서도 권장하지 않는 명령 입니다. 네트워크 설정을 통해 연결 시켜 주거나 Volumes를 이용하는것을 권장 하기 때문에 links에 대한 설명은 패스 하겠습니다.