Docker Compose

동균·2022년 3월 15일

Docker

목록 보기
2/2

Docker Compose란?

다중 컨테이너 Docker 어플리케이션을 정의하고 실행하기 위한 도구이다.
Compose는 YAML 파일을 사용하여 각종 어플리케이션 서비스를 구성한다.
그런다음 단일 명령으로 구성에서 모든 서비스를 만들고 시작 할 수 있다.

Swarm과 Kubernetes 같은 Conatainer Orchestration 툴과는 다른 말 그대로 Docker Container를 쉽게 실행하고 종료 할 수 있게 해주는 도구 이다.

docker run -d -v /usr/home/user/db:./db -p 3306:3306 --name db db
docker run -d -v /usr/home/user/app1:./app1 -p 80:80 --name app1 --net container:ev24c9qu34m7 db app1

이와 같이 docker 실행 명령어에 각종 옵션을 추가하여 컨테이너를 실행 시킨 이후
다른 컨테이너와 연결을 위해 net 옵션이나 link를 걸어주고...

스크립트를 별도로 구성해서 돌린다면 모르겠지만 매번 이런식으로 컨테이너를 올리는건 아주 비효율적이다. 이때 사용하는것이 Docker compose이다.

version: 3

service:
  app1:
    image: app1
    volumes:
   	  - /usr/home/user/app1:./app1
    container_name: app1
    ports:
      - 80:80
  db:
    image: db
    volumes:
   	  - /usr/home/user/db:./db
    container_name: db
    ports:
      - 3306:3306
networks:
	tmp_network:
		driver: bridge

해당 파일을 만들어 단순히 $ docker-copose up -d 만 하면 간단하게 db와 연결된 app1을 구동 할 수 있다.

Docker compose 명령어

실행

-d : detached mode 흔히 말하는 백그라운드 모드
-f {경로} : 특정 경로의 특정 파일명으로 된 compose 파일을 기준으로 동작
--force-recreate : 강제 컨테이너 새로 만들기
--build : 강제 이미지 빌드 하기
(기본적으로 이미지가 없으면 빌드부터 시작)
docker-compose up

종료

정지시킬 뿐만 아니라 컨테이너 삭제까지 시킨다.
docker-compose down

시작

정지된 컨테이너들을 시작시킨다.
컨테이너 이름 입력시 특정 컨테이너만 시작한다.
docker-compose start [{컨테이너 이름}]

다시 시작

동작중인 컨테이너들을 다시 시작시킨다.
컨테이너 이름 입력시 특정 컨테이너만 다시 시작한다.
docker-compose start [{컨테이너 이름}]

정지

동작중인 컨테이너들을 정지시킨다.
컨테이너 이름 입력시 특정 컨테이너만 정지시킨다..
docker-compose stop [{컨테이너 이름}]

로그

-f : 실시간 감시 (watching)
docker-compose logs

목록

docker-compose ps

명령

docker-compose exec {컨테이너 이름} {명령어}

빌드

compose 내 build 부분에 정의된 대로 빌드한다.
컨테이너 이름 입력시 특정 컨테이너만 빌드한다.
docker-compose build [{컨테이너 이름}]

Docker Compose 문법

version: '3' // compose 버전 ('3' = 3. 버전대 가장 최신)

services: // service container 영역
  db: // service 이름 container_name이 없을 경우 기본적으로 db_1형식으로 만들어 진다.
    image: mysql:latest // 참조 이미지
    volumes: // 볼륨 설정
  	  - ./data:/var/lib/mysql // host경로 : container경로
    environment: // 컨테이너 환경 변수 설정
      - 'MYSQL_ROOT_PASSWORD=PASSWORD'
    networks: // 네트워크 설정
      tmp_network:
        ipvr4_address: 192.168.0.2 // ip지정
	container_name: db // 컨테이너 이름
	hostname: db // 호스트 이름
	command: // 추가 명령어 ["--lower_case_table_names=1", "--charact...", ...] 가능
      - --lower_case_table_names=1
      - --character-set-server=utf8
      - --collation-server=utf8_unicode_ci
      
  app1:
    build: // build 설정
      context: . // 명령어 전달할 Dir경로
      dockerfile: ./compose/Dockerfile-dev // Dockerfile 경로
    environment:
     - DB_HOST=db
    depends_on: //의존성 지정
      - db
    volumes:
      - app1_data:./app1:ro // volume container 연결 및 ro : read-only 설정
    restart: always // 재시작 여부 no, always, on-failure[:{시도횟수}], unless-stopped
    ports: // 포트 지정 Host Port : Container Port
      - 8000:8000
    networks: // 네트워크 설정
      - default
      - tmp_network

volumes: // volume container 영역
  app1_data:  // 볼륨 이름
  
networks: // network 영역
	tmp_network: // name이 없을 경우 최상위 container이름_tmp_network
    	driver: bridge // 드라이버 이름 bridge, host, custom driver 가능
        name: tmp_network // network 이름

Docker Compose Network 구성

docker-compose 를 시작할때 network 영역을 설정 하지 않으면 기본적인 container이름_default 로 네트워크를 형성한다. 그로 인해서 docker-compose로 올린 컨테이너에 docker 명령어로 구동한 컨테이너는 접근이 불가능 하다.
Docker Compose로 도커를 구동시 네트워크를 연결 하는 방법으로는 docker-compose에 명시적으로 network 생성 하도록 설정을 하던지 외부에서 network 생성을 한 이후 할당 하는 방법이 있다.

Docker Network 할당 예시

  1. Docker Network 생성 후 할당

    Docker Network 생성

    docker network create --driver=bridge tmp_network

    docker compose 할당

    networks:
    	default:
        	external:
            	name: tmp_network

    혹은

    networks:
        tmp_network:
            driver: bridge
            external: true
  2. 동일한 compose file에 container 설정

    version: '3'
    
    services:
    	store-service:
    		image: nginx:latest
    		container_name: store
    		networks:
    			- tmp_network
    
    	web-service:
    		image: nginx:latest
    		container_name: web
    		networks:
    			- tmp_network
    
    networks:
    	tmp_network:
    		driver: bridge
    		name: tmp_network
  3. compose file에 network를 동일하게 작성

    version: '3'
    
     services:
    	store-service:
    		image: nginx:latest
    		container_name: store
    		networks:
    			- tmp_network
    
     networks:
    	tmp_network:
    		driver: bridge
    		name: tmp_network

    version: '3'
    
     services:
    	web-service:
    		image: nginx:latest
    		container_name: web
    		networks:
    			- tmp_network
    
     networks:
    	tmp_network:
    		driver: bridge
    		name: tmp_network
            

Docker Compose Volume 구성

network와 마찬가지로 compose가 돌아갈때 volume을 생성하는 방법과 외부에서 생성한 볼륨을 할당 하는 방법이 있다.

Docker Volume 할당 예시

  1. Docker Volume 생성 후 할당

    Docker Network 생성

    docker volume create tmp_volume

    docker compose 할당

    volumes:
    	tmp_volume:
            external: true
  2. compose file에 volume 명시

    volumes:
    	tmp_volume:
profile
내가 볼려고 끄적끄적 적는 개발 블로그

0개의 댓글