docker-compose(명령어, yaml파일구조)
docker-compose란
- 여러 도커 컨테이너를 정의하고 컨테이너들 간의 환경설정, 의존성, 포트매핑, 네트워크, 실행 등을 관리하는 도구
- 이러한 설정 파일은 YAML 형식으로 작성되며, 컨테이너, 네트워크, 볼륨 등과 관련된 설정을 포함
docker-compose.yml , docker-compose.yaml - 개별 컨테이너를 따로 관리하는거보다 효율적이다.
- 개발 환경 (dev), 테스트 환경 (test), 운영 환경 (prod) 등 다양한 버전으로 만든다.
docker-compose 관련명령어
- docker-compose up: 설정된 서비스들을 시작합니다. ( build->create->start 3단계 다있음)
- docker-compose down: 실행 중인 서비스들을 중지하고 관련된 리소스를 삭제합니다. (stop +rm : 멈추고 삭제)
- docker-compose ps: 현재 실행 중인 서비스들의 상태를 표시합니다.
- docker-compose logs: 서비스들의 로그를 표시합니다.
- docker-compose build : 정의된 서비스들의 이미지를 빌드
- docker-compose pull : 정의된 서비스들에 대한 이미지를 Docker Hub 또는 지정된 레지스트리에서 가져옴
- docker-compose start : 명령어는 정의된 서비스들을 시작
- docker-compose stop : 실행 중인 서비스들을 중지
- docker-compose rm : 정의된 서비스들과 관련된 컨테이너, 네트워크, 볼륨 등을 삭제합니다. -v 옵션을 추가하면 관련된 볼륨도 함께 삭제
- docker-compose push : docker hub로 이미지들을 올림
- docker compose = docker-compose
- docker-compose.yaml = docker-compose.yml (둘다 존재하면 에러 발생하니 주의)
+ 만약 다른 이름의 파일 사용하고 싶으면 docker-compose -f docker-compose.mac.yml up (-f 사용)
보통 이렇게 쓰임
docker-compose.prod.yml (프로덕션용) , docker-compose.dev.yml (개발용) , docker-compose.test.yml (테스트용)
프로덕션 : 실제운영환경/ 개발 :개발하고 디버깅 / 테스트 : 버그 찾아내고 테스트
docker-compose 설치
- docker desktop의 일부로 자동 설치됨
- docker engine 실행하고 터미널에서 버전 확인
- docker-compose --version
docker-compose.yml 파일구성
- **`services`:**
- `services` 섹션은 여러 개의 컨테이너 서비스를 정의합니다. 각 서비스는 독립적으로 실행되는 컨테이너를 나타냅니다. 각 서비스에는 사용할 도커 이미지, 포트 매핑, 환경 변수 등을 설정할 수 있습니다.
services:
web:
image: nginx:latest
ports:
- "8080:80"
database:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example - **`volumes`:**
- `volumes` 섹션은 볼륨을 정의합니다. 볼륨은 컨테이너 간 데이터를 공유하거나 데이터를 영속적으로 저장하는 데 사용됩니다. 여러 서비스 간에 데이터를 공유하거나 컨테이너 내부의 데이터를 호스트와 분리하는 데 활용됨
volumes:
data-volume:
볼륨은 `services` 섹션에서 각 서비스의 `volumes` 옵션을 통해 연결할 수 있습니다. - **`networks`:**
- `networks` 섹션은 네트워크를 정의합니다. 여러 컨테이너 간의 통신을 위한 네트워크를 설정할 수 있습니다. 기본적으로 `docker-compose`는 기본 네트워크를 생성하며, 추가적으로 정의된 네트워크를 사용할 수 있습니다.
networks:
frontend:
backend:
네트워크는 `services` 섹션에서 각 서비스의 `networks` 옵션을 통해 연결할 수 있습니다. 이를 통해 서비스 간에 특정 네트워크를 통한 통신이 가능해집니다.
이러한 섹션들을 조합하여 `docker-compose.yml` 파일을 작성하면 여러 개의 컨테이너로 구성된 멀티-컨테이너 애플리케이션을 쉽게 정의하고 실행할 수 있습니다.
+여기다 서버를 각각 따로 구성하려면 networks도 추가
docker 관련 명령 동작 예시
- docker images : 이미지들을 출력.
'docker-compose build' 시 폴더 이름(example/voting/app) 이 앞에 첨자로 붙어 출력된다.
+다른방법으로 빌드 됐거나, 도커 허브에서 온경우 첨자가 붙지 않는다. - docker-compose images : 컨테이너들을 출력
- docker-compose push : docker hub로 이미지들을 올림(허브에서 온애들 안올림)
- docker-compose ls (그룹별로 보여줌)
- docker-compose ps(그룹내 각각 보여줌)
- docker network ls (bridge, host, none)
+Bridge 모드는 Docker의 기본 네트워크 모드이며, 컨테이너를 위한 가상 브리지를 생성합니다. 이 가상 브리지는 호스트 시스템과 컨테이너 간의 통신을 도와줍니다.
- **특징:**
- 컨테이너 간 통신을 지원합니다.
- 각 컨테이너는 가상 브리지에 연결되어 호스트와 격리됩니다.
docker run --network=bridge my-container
Host 모드는 호스트의 네트워크 네임스페이스를 공유하는 방식으로 동작합니다. 컨테이너는 호스트의 네트워크 인터페이스를 직접 사용하게 됩니다.
- **특징:**
- 호스트와 동일한 네트워크 네임스페이스를 공유하므로 호스트와 동일한 IP 주소를 사용합니다.
- 호스트와 완전히 통합되어 있는데, 이는 네트워크 격리를 해제하는 효과가 있습니다.
docker run --network=host my-container
None 모드는 네트워크를 사용하지 않는 방식으로, 컨테이너는 네트워크를 가지지 않습니다. 따라서 외부와의 통신이 차단
- **특징:**
- 외부와 통신이 필요하지 않은 경우에 사용됩니다.
- 컨테이너는 외부 네트워크와 격리되며, 내부에서만 동작합니다.
docker run --network=none my-container