[부트캠프 - 35일차] 2/9.월 - Docker

developowl·2026년 2월 12일

부트캠프

목록 보기
25/29
post-thumbnail

Docker Compose

docker-compose

개요

  • yaml 포맷으로 기술된 설정 파일을 이용해서 여러 Container 간의 실행이나 관계를 설정
  • 시스템을 일괄 실행 또는 일괄 종료 및 삭제 할 수 있는 도구
  • 컨테이너나 볼륨을 어떠한 설정으로 만들지에 대한 항목이 기재돼 있는데 작성 내용은 docker 명령어와 비슷하지만 docker 명령어는 아님
  • up 커맨드는 docker run 커맨드와 유사해서 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행하는데 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성할 수 있음
  • down 커맨드는 컨테이너와 네트워크를 정지 및 삭제하는 것으로 볼륨과 이미지는 삭제하지 않고 컨테이너와 네트워크 삭제없이 종료만 하고 싶다면 stop 커맨드를 사용

Docker Compose와 Dockerfile

  • docker compose 는 docker run 명령어를 여러 개 모아놓은 것과 같은데 컨테이너와 주변 환경을 생성하며 네트워크와 볼륨까지 함께 만들 수 있음
  • Dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없음

docker compose 작성 및 실행

# 컨테이너 생성 명령
docker run --name apa000ex1 -d -p 8080:80 httpd

# Docker-Compose 활용
# docker-compose.yaml 파일 작성
version: "3"
services:
	apa000ex2:
		image: httpd
		ports:
			-8081:80
		restart: always

# docker-compose 명령 수행
docker-compose up -d

# 컨테이너 확인
docker ps

Maria DB 테스트

# docker-compose.yaml 파일 작성
version: '3.8'
services:
	mariadb:
	image: mariadb:10.4.6
	container_name: mariadb-server
	restart: always
	environment:
		# 루트 비밀번호 (반드시 수정해서 사용하세요)
		MYSQL_ROOT_PASSWORD: your_root_password
		# 초기 생성할 데이터베이스 이름 (선택 사항)
		MYSQL_DATABASE: my_database
		# 일반 사용자 계정 (선택 사항)
		MYSQL_USER: my_user
		MYSQL_PASSWORD: my_user_password
	ports:
		- "3306:3306"
	volumes:
		# 호스트의 ./data 폴더와 컨테이너 내부 데이터 폴더를 동기화
		- ./data:/var/lib/mysql
		# 초기 설정 파일이 있다면 ./init 폴더에 넣기
		- ./init:/docker-entrypoint-initdb.d
		

# docker-compose 명령어로 컨테이너 생성
docker-compose up -d

# 네트워크 확인
docker network ls
  • 네트워크
    • docker-compose up 명령을 수행하면 자체 기본 네트워크가 생성되는데 up 과 동시에 가장 먼저 기본 네트워크를 디렉터리명_default 이름으로 생성
    • 이후 도커 컴포즈에 포함된 다중 컨테이너를 구동하고 이 네트워크에 컨테이너 서비스를 연결하게 되며 이 기본 네트워크를 통해 IP가 아닌 서비스명(컨테이너명)으로 서비스 간 통신을 할 수 있음

작성 방법

  • 파일 이름
    • docker-compose.yaml / docker-compose.yml / compose.yaml / compose.yml
  • 주 항목
    • version
    • services
    • networks
    • volumes
  • 정의 내용
    • image
    • networks: --net
    • volumes: -v
    • ports: -p
    • environment: -e
    • depends_on: 다른 서비스에 대한 의존 관계
    • restart: 컨테이너 종료 시 재시작 여부(no, always, on-failure, unless-stopped)

버전 정의

  • yaml 코드 첫 줄은 버전 명시
    • version: ‘3.8’
  • 버전 선택은 docker 엔진 릴리스에 적합한 버전을 선택하는데 만일 버전이 맞지 않으면 에러 메시지를 출력
  • docker 버전 및 docker compose 버전 업데이트 속도가 잦은 편이니 종종 docker 도큐먼트를 참고하여 버전 변화를 참고
  • 에러 발생 원인
    • 작성한 버전과 현재 docker compose 또는 docker 엔진 릴리스가 적합하지 않은 경우
    • docker compose 도구가 오래된 경우 - 새로운 버전으로 업데이트 필요
    • 버전 문제가 아닌 들여쓰기의 공백 수가 하위 레벨과 맞지 않은 경우

서비스 정의

  • docker compose 를 통해 실행할 서비스를 정의
  • docker compose 는 컨테이너 대신 서비스 개념을 사용
  • 상위의 version 명령과 동일 레벨로 작성되며 다중 컨테이너 서비스 실행을 목적으로 하기 때문에 복수형으로 작성되는 것에 유의
  • docker compose 로 함께 실행된 모든 서비스는 docker compose 명령을 통해 통합 관리
  • services 하위에는 실행될 컨테이너 서비스를 작성하고 하위 레벨에 docker 명령 실행과 유사하게 컨테이너 실행에 필요한 옵션을 작성
  • 프로젝트에 필요한 애플리케이션 개발을 위해 Dockerfile 을 작성하여 컨테이너를 실행하는 경우에는 미리 빌드해서 이미지명 태그를 명시해도 되지만 build 옵션을 사용하면 docker compose 실행과 함께 이미지를 빌드
  • build 옵션은 이미지 빌드에 필요한 Dockerfile의 경로를 지정하고 docker-compose.yaml 파일과 동일 경로에 위치한 경우에는 . 을 이용해 Dockerfile 이 같은 경로에 있음을 명시

서비스 정의 - 하위 옵션

  • container_name
    • docker run 의 --name 옵션과 동일하며 생략 시 자동으로 부여됨
    • 디렉토리명_서비스명_n
  • ports
    • docker run 의 -p 옵션과 동일하며 서비스 내부 포트와 외부 호스트 포트를 지정하여 바인드
  • expose
    • 호스트 운영체제와 직접 연결하는 포트를 구성하지 않고 포트를 노출하는데 필요 시 링크로 연결된 서비스와 서비스 간의 통신만 사용
  • networks
    • docker run 의 --net(--network) 옵션과 동일하며 최상위 레벨의 networks에 정의된 네트워크 이름을 작성
  • volumes
    • docker run 의 -v(--volume) 옵션과 동일한데 서비스 내부 디렉토리와 호스트 디렉토리를 연결하여 데이터 지속성 설정
  • environment
    • docker run의 -e 옵션과 동일한데 서비스 내부 환경 변수 설정에 이용하며 환경 변수가 많은 경우에는 파일(*.env)로 만들어 env_file 옵션에 파일명을 지정(envfile: ./envfile.env)
  • command
    • docker run의 마지막에 작성되는 명령어로 서비스가 구동 이후 실행
      할 명령어 작성
  • restart
    • docker run의 --restart 옵션과 동일하며 서비스 재시작 옵션 지정
      • no: 수동 재시작
      • always: 컨테이너 수동 제어를 제외하고 항상 재시작
      • on-failure: 오류가 있을 시 재시작
  • depends_on
    • 서비스 간의 종속성을 의미하며 먼저 실행해야 하는 서비스를 지정하여 순서를 정한느데 이 옵션에 지정된 서비스가 먼저 시작됨

네트워크 정의

  • 다중 컨테이너들이 사용할 최상위 네트워크 키를 정의하고 이하 하위 서비스 단위로 이 네트워크를 선택할 수 있음
  • networks 옵션을 지정하지 않으면 자체 기본 네트워크가 생성되고 대역은 172.x.x.x 로 자동 할당되며 기본 드라이버는 브리지로 지정됨
  • docker에서 생성한 기존 네트워크를 지정하는 경우에는 externel 옵션에 네트워크 이름을 작성

볼륨 정의

  • 데이터의 지속성을 유지하기 위해 최상위 레벨에 볼륨을 정의하고 서비스 레벨에서 볼륨명과 서비스 내부의 디렉토리를 바인드
  • docker volume create 와 동일하게 docker 가 관리하는 가상 영역(/var/lib/docker/volume)에 자동 배치
  • docker volume ls 명령을 통해서 확인 가능하고, docker volume inspect 볼륨명 으로 세부 디렉토리 경로까지 알 수 있음
  • 최상위 레벨에 volumes를 정의하지 않고 서비스 하위 레벨에 호스트의 절대 경로와 컨테이너의 디렉토리 경로를 직접 사용하는 바인드 마운트 방식도 가능

컨테이너 간의 통신

  • 외부에서 도커 내부의 컨테이너에 접근하고자 하는 경우에는 도커 컨테이너를 생성할 때 포트포워딩을 수행해서 접근
  • 하나의 도커 엔진에 만들어진 컨테이너 간에는 도커 엔진에서 부여한 IP를 이용해서 접근 가능 - docker inspect network bridge
profile
Don’t get mad at the computer.

0개의 댓글