< docker-compose 명령어 >

 

docker-compose pull [service]

 

docker-compose.yml 내의 이미지들을 모두 다운받음

뒤에 service(컨테이너 이름?) 를 추가하면, 추가한 이름의 이미지만 다운받음

 

docker-compose build [service]

 

docker-compose.yml 내에 명시한 dockerfile 을 빌드함

뒤에 service 를 추가하면, 추가한 이름의 dockerfile 만 빌드함

 

docker-compose up [service]

 

docker-compose.yml 을 기반으로 컨테이너를 실행

실행된 후에 서비스가 forground 에서 동작하는데

docker-compose up -d 처럼 -d 옵션을 추가하여 서비스를 background 에서 동작하도록 함

 

docker-compose ps

 

현재 실행중인 서비스 목록을 보여줌

 

docker-compose logs [service]

 

현재 실행중인 서비스의 로그를 보여줌

docker-compose logs -f 처럼 -f 옵션을 주면 로그를 실시간으로 볼 수 있음

 

docker-compose top

 

서비스 내에서 실행중인 프로세스 목록을 보여줌

 

docker-compose stop [service]

 

서비스를 멈춤

 

docker-compose start [service]

 

멈춰있는 서비스의 컨테이너를 실행

 

docker-compose exec {container} {command}

 

해당 서비스의 컨테이너에서 명령어를 실행

컨테이너 내부로 들어갈 때 이 명령어를 사용

예를 들어 nginx 컨테이너에 들어가려면 아래 명령어 사용

 

docker-compose exec nginx bash

 

그럼 nginx 컨테이너의 bash 로 들어갈 수 있게 됨

 

docker-compose run {service} {command}

 

해당 서비스에 컨테이너를 하나 더 실행

exec 와 다른 점은, 실행할 때 아예 새로운 컨테이너 하나를 만들고 실행한다는 점

 

docker-compose run nginx bash

 

위 명령어를 실행하면 아예 새로운 nginx 컨테이너가 만들어진 후 그 새로운 컨테이너의 bash 쉘이 실행됨

 

docker-compose down [service]

 

서비스를 멈추고(stop) 컨테이너를 삭제(rm)

docker-compose down -v 처럼 -v 옵션을 주면 볼륨까지 함께 삭제함

 

 

 

< docker-compose YAML >

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#버전 정의
# 버전에 따라서 지원하는 형식이 다릅니다.
version: '3.0'
 
#service 정의
# docker-compose로 생성 할 container의 옵션을 정의 합니다.
# service안의 container들은 하나의 project로서 docker-compose로 관리 됩니다.
services:
    #생성 할 container 이름을 지정 합니다.
    container-이름:
        #container 생성시 사용 할 이미지 지정
        image: node-server:v1
        #build 옵션
        # docker-compose build 옵션에서 사용 됩니다.
        # dockerfile에 명시된 FROM의 image를 사용하여 위에 명시된image 이름과 tag로 새로운 image를 생성 합니다.
        build:
            #dockerfile의 위치를 지정 합니다. 현재 위치(.)에 존재하는 dockerfile 을 사용해 빌드합니다.
            context: .
        #container port mapping 정보
        ports:
            - "80:80"
        #EXPOSE
        # 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
        expose:
            - "80"
        #환경 변수 리스트를 정의
        environment:
            UPDATE_URL: "https://www.doitnow-man.com"
        #실행 환경 설정
        stdin_open: true       #docker run -i
        tty: true              #docker run -t
        entrypoint: /bin/bash  #exec /bin/bash
cs

 

 

version

 

docker-compose.yml 의 명세 버전을 의미

맨 위에 적음

주로 3 버전을 사용한다고 함

3버전을 주로 사용하는 이유는 나중에 추가

 

services

 

실행할 컨테이너 정의

services 내에서 컨테이너의 이름, 포트, 이미지 등을 정의 할 것임

 

services:

  my-container

 

컨테이너 이름을 my-container 라고 정의

docker run --name my-container 와 같음

확인해봐야 하는 사항)

  여기 적어둔 이름이 컨테이너 내부에서 hostname 이 되는 듯

  docker-compose 를 통해 실행된 컨테이너들끼리

  여기 적어둔 이름(hostname) 으로 통신이 가능한 것으로 보임

 

image: ubuntu

 

image 에는 실제 컨테이너 이미지명이 들어감

태그가 없으면 latest 가 자동으로 붙음

 

build

 

docker hub 등에서 가져오는 이미지가 아닌

내가 정의한 dockerfile 을 빌드하라는 속성

image 속성 대신 사용하는 경우가 많음

 

ports

 

호스트와 컨테이너의 호스트를 연결

예를 들어 아래와 같다면

- "8080:80"

호스트의 8080 과 컨테이너의 80을 연결 하라는 의미가 됨

 

environment

 

컨테이너 내부의 환경 변수를 설정 가능

예를 들어, mysql 의 환경 변수를 다음과 같이 설정 가능

- MYSQL_ROOT_PASSWORD=root

 

volumes

 

호스트의 dir 와 컨테이너의 dir 를 연결(mount) 해주는 속성

예를 들어 아래와 같다면

- /home/eye_host/:/home/eye_container

호스트의 /home/eye_host dir 가

컨테이너의 /home/eye_container 와 연결됨

 

depends_on

 

컨테이너들의 실행 순서를 설정

의존성을 추가하는 거라고 생각하자.

예를 들어 아래와 같다면

 

service:

  mysql:

    ...

  django:

    ...

    depends_on:

      - mysql

 

이름이 django인 컨테이너는 

이름이 mysql 인 컨테이너가 실행된 이후 실행됨

즉, mysql 이 실행된 이후에 django 가 실행됨

 

restart

 

컨테이너가 예기치 않게 종료되었을 때 어떻게 할 것인지 결정

예를 들어 nginx 컨테이너에서 nginx 프로세스가 예기치 않게 종료되면 nginx 컨테이너까지 같이 종료되어버림

이런 경우 종료되고 난 후 그대로 둘 것인지, 다시 컨테이너를 시작할 것인지 등을 결정할 수 있음

세 가지를 추가 가능

"no" : 기본값. 컨테이너를 다시 시작하지 않음

always : 컨테이너를 항상 다시 시작함

on-failure : 오작동하면서 종료되었을 때만 컨테이너를 다시 시작함

 

 

아래는 docker-compose.yml 파일의 예시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.3'
 
services:
  db:
    image: mysql
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
 
  wordpress:
    image: wordpress
    ports
      - "6000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
 
volumes:
  db_data: {}
cs

 

환경 변수를 설정할 수 있는 곳이 다양함

dockerfile 에도 설정할 수 있고

docker-compose yml 에서도 설정할 수 있고

docker-compose run 할 때 옵션으로 추가하여 설정할 수 있음

 

이렇게 다양하게 추가했을 때 최종적으로 컨테이너 내부에서는

어떤 곳에 선언된 환경변수를 따라가는가?

즉, 어떤 곳에 선언된 환경 변수의 우선순위가 높은가?

 

우선순위

1.

docker-compose run -e MY_ENV=first 처럼

-e 옵션으로 추가한 경우가 가장 우선순위가 높음

2.

docker-compose.yml 내에서

environment:

  - MY_ENV=second

처럼 environment 에 추가한 환경 변수가 두번째로 우선순위가 높음

3.

Dockerfile 내에서

ENV MY_ENV third

처럼 ENV 에 추가한 환경 변수가 세번째로 우선순위가 높음

 

 

 

참고로 docker-compose 자체에 컨테이너들 끼리 묶을 수 있는 기능이 있다고 함

 

 

 

 

 

 

참고

https://doitnow-man.tistory.com/247

 

 

 

 

 

 

+ Recent posts