거꾸로 바라본 세상
Published 2023. 4. 19. 09:36
10. Docker Compose CI-CD/Docker
반응형

Docker Compose

Docker Compose는 여러 컨테이너들을 모아서 관리하기 위한 도구로써 docker-compose.yml라는 파일에 컨테이너 구성정보를 정의하여 동일 호스트 상의 여러 컨테이너를 일괄적으로 관리 할 수 있다.

Docker Compose 시작

$ docker-compose up

Docker Compose 컨테이너의 상태

$ docker-compose ps
       Name                     Command               State         Ports
--------------------------------------------------------------------------------
redis_1       docker-entrypoint.sh redis ...   Up      6379/tcp
webserver_1   python /opt/imageview/app.py     Up      0.0.0.0:80->80/tcp

Docker Compose 컨테이너 정지

컨테이너 정지

$ docker-compose stop

컨테이너 리소스 삭제

$ docker-compose down

Docker Compose 구성 관리

docker-compose.yml

Docker Compose는 (docker-compose.yml or docker-compose.yaml)형식의 파일을 이용하여 시스템 안에서 가동하는 여러 서버의 구성들을 정의한다.

Compose 정의 파일에는 관리하고 싶은 컨테이너 서비스(services:) 네트워크(networks:) 볼륨(volumes:)을 정의할 수 있다.

그리고 버전에 따라서 기술할 수 있는 항목이 다르다.

version: '3.3'

버전

Compose 버전 Docker Engine 버전
3.3 17.06.0
3.2 17.04.0
3.1 1.13.1
3.0 1.13.0

 

ex)

#docker-compose.yml                                                                                                                    X
#버전명 지정
version: '3.3'
# 서비스 정의
services:
   # WebServer config
  webserver:
    image: ubuntu
    ports:
      - "80:80"
    networks:
      - webnet
   # Redis config
  redis:
    image: redis
    networks:
      - webnet
# 네트워크 정의
netwokrs:
  webnet:
#데이터 볼륨 정의
volumes:
  data-volume:

이미지 지정(image)

Docker Container의 베이스 이미지를 지정하려면 image를 사용하여 이미지 이름 또는 이미지 ID를 지정한다.

이미지는 공식 이미지 뿐만아니라 Docker Hub에 공개되어있는 이미지는 모두 지정가능하다.

이미지 태그를 지정하지 않을 경우

services:
  webserver:
    image: ubuntu

이미지 태그를 지정한 경우

services:
  webserver:
    image: asashiho/dockersample:1.0

이미지 빌드(build)

Dockerfile을 작성하고 자동으로 빌드하여 베이스 이미지로 지정할 때 build를 지정하다.

build에는 Dockerfile의 파일 경로를지정한다.

ㅁ sample
ㅣ
ㄴㅡㅡㅁ docker-compose.yml
ㄴㅡㅡㅁ Dockerfile
  • docker-compose.ymal
    services:
    webserver:
      build: . #current directory
  • Dockerfile
    FROM ubuntu
$ docker-compose up --build
Creating network "dockertext2_default" with the default driver
Building webserver
Step 1/1 : FROM ubuntu
 ---> df5de72bdb3b

Successfully built df5de72bdb3b
Successfully tagged dockertext2_webserver:latest
Creating dockertext2_webserver_1 ... done
Attaching to dockertext2_webserver_1
  • 임의으로 된 Dockerfile을 빌드할 때는 dockerfile를 지정한다.
  • Dockerfile이 있는 디렉토리 경로나 Git URL을 context로 지정한다.
services:
  webserver:
    build:
      context: /data
      dockerfile: Dockerfile-alternate
  • Docker 이미지를 빌드 할 때 args(인수)를 지정할 수 있다.
services:
    webserver:
        build:
            args:
                projectno:1
                user: aaa

컨테이너 안에서 작동하는 명령 지정(command/entrypoint)

command는 컨테이너에서 작동할 때 사용한다. 베이스 이미지에서 지정되어있을 땐 그 명령을 덮어쓴다.

command: bin/bash

entrypoint를 덮어쓸 수도 있다.

entrypoint:
    - php
    - -d
    - memory:limit=-1

컨테이간 연결(links)

다른 컨테이너에 대한 링크를 연결할 때 links를 사용한다.

# logserver라는 이름을 가진 컨테이너를 연결 하고 싶을 때.
# 별도의 명칭을 붙이고 싶을 때 서비스명:alias
links:
  - logserver
  - logserver:log01

컨테이너 간 통신(ports/expose)

ports는 컨테이너 공개하는 포트를 지정한다.

  • "<호스트 포트번호>:<컨테이너 포트번호>"
    • "<IP>:<호스트 포트번호>:<컨테이너 포트번호>"
ports:
    - "3000"
    - "8080:8080"
    - "49111:22"
    - "127.0.0.1:8081:8081"

expose는 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때 사용한다.

로그서버와 같이 호스트 머신에 직접 엑세스하지 않고, 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 엑세스 하고 싶을 경우 등에 사용.

expose:
    - "3000"
    - "8000"

서비스의 의존관계 정의(depends_on)

depends_on : 여러 서비스의 의존관계를 정의할 때 사용

  • depends_on은 컨테이너 시작 순서만 제어할 뿐 컨테이너 상의 애플리케이션이 이용 가능해질 때까지 기다리지 제어하지 않는다.
  • 의존관계에 있는 DB service의 준비가 끝날 때까지 기다리는 것이 아니기 때문에 애플리케이션 측에서는 대응이 필요.

ex) webserver 컨테이너를 시작하기 전 db 컨테이너와 redis컨테이너를 시작하고 싶을 때

services:
    webserver:
        build: .
        depends_on:
            - db
            - redis
    redis:
        image: redis
    db:
        image: mysql

컨테이너 환경변수 지정(environment/env_file)

environment : 컨테이너 안의 환경변수를 지정할 때 사용

## 배열 형식으로 지정
environment:
    - HOGE=fuga
    - FOO=bar
## 해시 형식으로 지정
environment:
    HOGE: fuga
    FOO: bar

env_file : 환경변수 파일을 읽어 사용할 때 사용

envfile

HOGE=fuga
FOO:bar

docker-compose.yaml

#단일 환경변수 호출
env_file: envfile
#여러개 화경변수 호출
env_file: 
    - ./envfile1
    - ./envfile2
    - ./envfile3

컨테이너 정보 설정(container_name/labels)

container_name : Docker Compose로 생성되는 컨테이너에 이름을 붙일 경우에 사용

# 컨테이너명 지정
container_name: web-container

labels : 컨테이너에 라벨을 붙일 경우 사용

# 배열 형식으로 지정
labels:
    - "com.example.desc="Account webapp"
    - "com.example.depart="Finance"
# 해시 형식으로 지정
labels:
    com.example.desc:"Account webapp"
    com.example.depart:"Finance"

컨테이너 데이터 관리(volumes/volumes_from)

volumes : 컨테이너 볼륨을 마운트 할 때 사용

  • 호스트 측에서 마운트 경로를 지정하려면 호스트의 디렉토리 경로:컨테이너 디렉토리 경로를 지정
    volumes:
    # 볼륨지정
        - /var/lib/mysql
        - /cache/:/tmp/cache
    
    # 볼륨 지정 뒤 'ro' 를 지정하면 볼륨을 읽기전용으로 마운트 할 수 있다.
    # 읽기전용 볼륨 지정
        - ~/configs:/etc/configs/:ro
     

Docker Compose를 사용한 컨테이너 운용

Docker Compose 버전 확인

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

Docker Compose 기본 명령

$ docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]

서브명령(Commands)

서브명령 설명
up 컨테이너 생성/시작
ps 컨테이너 목록 표시
logs 컨테이너 로그 출력
run 컨테이너 실행
start 컨테이너 시작
stop 컨테이너 정지
restart 컨테이너 재시작
pause 컨테이너 일시 정지
unpause 컨테이너 재개
port 공개 포트번호 표시
config 구성 확인
kill 실행중인 컨테이너 강제 정지
rm 컨테이너 삭제
down 리소스 삭제

 

- current directory 이외의 장소에 docker-compose.yaml 파일 이 있을 경우 -f 옵션을 통해 파일 경로를 지정하여 실행할 수 있다.

$ docker-compose -f ./sample/docker-compose.yaml up

 

특정 컨테이너만 종료하고 싶을 때

$ docker-compose stop webserver

여러 컨테이너 생성(up)

docker-compose up 명령 사용

$ docker-compose up [옵션] [서비스명...]

지정할 수 있는 주요 옵션

옵션 설명
-d 백그라운드에서 실행
--no-deps 링크 서비스를 시작하지 않는다.
--build 이미지를 빌드
--no-build 이미지 빌드안함
-t, --timeout 컨테이너의 타입아웃을 초로 지정(default:10)
--scale SERVICE=서비스수 서비스수를 지정

service_a, service_b docker-compose.yml 생성

version: '3.3'
    services:
        service_a:
            image: nginx
        service_b:
            image: redis

여러 컨테이너 일괄 생성 및 시작

$ docker-compose up

여러 컨테이너 일괄 백그라운드로 시작

$ docker-compose up -d

Docker 이미지 빌드

$ docker-compose up --build

컨테이너를 생성할 개수를 지정

$ docker-compose up --scale service_a=20

여러 컨테이너 확인(ps/logs)

컨테이너들을 확인하고 싶을 때

$ docker-compose ps

       Name                     Command               State    Ports
--------------------------------------------------------------------
sample_service_a_1   /docker-entrypoint.sh ngin ...   Exit 0
sample_service_b_1   docker-entrypoint.sh redis ...   Exit 0

컨테이너 ID 확인

$ docker-compose ps -q

754cd9049961f74527bc3e97cd18039016d55979bffad67d16559715c63afb22
858a229977e1e38c92aa829441bd652ce0018f1763208f8f68294b1a2f4a7c9e

컨테이너의 로그 확인

$ docker-compose logs

컨테이너에서 명령 실행(run)

컨테이너 실행 명령 docker-compose run

ex) service_a라는 이름의 컨테이너에서 /bin/bash를 실행


$ docker-compose run service_a /bin/bash

여러 컨테이너 시작/정지/재시작(start/stop/restart)

시작 (start)

$ docker-compose start

정지 (stop)

$ docker-compose stop

재시작 (restart)

$ docker-compose restart

특정 컨테이너 재시작 (restart)

$ docker-compose restart service_a

여러 컨테이너 일시 정지/재개(pause/unpause)

일시정지 (pause)

$ docker-compose pause

재개 (unpause)

$ docker-compose unpause

서비스 구성 확인(port/config)

서비스 공개용 포트를 확인할 때

docker-compose port [옵션] <서비스명> <프라이빗 포트 번호>

ex) 공개포트 확인

$ docker-compose port webserver 80

Compose의 구성을 확인하고 싶을 때

docker-compose config

ex) 구성요소 확인

$ docker-compose config
services:
  service_a:
    image: nginx
  service_b:
    image: redis
version: '3.3'

여러 컨테이너 강제정지/삭제(kill/rm)

컨테이너 강제정지

-s SIGINT 프로세스를 강제 종료

$ docker-compose kill -s SIGINT

컨테이너 삭제

$ docker-compose rm
docker-compose rm
Going to remove sample_service_b_1, sample_service_a_1
Are you sure? [yN] y
Removing sample_service_b_1 ... done
Removing sample_service_a_1 ... done


# -f를 붙이면 강제로 삭제할 수 있다.
$ docker-compose rm -f

여러 리소스 일괄 삭제(down)

down: docker-compose up으로 생성된 컨테이너들의 이미지를 한꺼번에 모아서 삭제할 때 사용

docker-compose down [옵션]

옵션 내용
--rmi all 모든 이미지 삭제
--rmi local 커스텀 태그가 없는 이미지 삭제
-v, --volumes Compose 정의 파일의 데이터 볼륨 삭제
$ docker-compose down --rmi all
Removing network sample_default
Removing image nginx
Removing image redis
반응형

'CI-CD > Docker' 카테고리의 다른 글

11. Docker Application 배포  (0) 2023.04.19
9. Dockerfile  (0) 2023.04.19
8. Docker compose를 이용하여 Kafka Confluent 설치  (0) 2023.04.19
7. Docker Network  (0) 2023.04.19
6. Docker container  (0) 2023.04.19
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!