초보자를 위한 Docker Compose 자습서

문제를 제거하기 위해 도구를 사용해보십시오

초보자를 위한 Docker Compose 자습서

Docker Compose는 이러한 문제를 극복하고 한 번에 여러 컨테이너를 쉽게 처리할 수 있도록 도와주는 도구입니다. 이 튜토리얼에서는 주요 기능과 강력한 메커니즘을 살펴보겠습니다.



1. 개요

Docker를 광범위하게 사용하면 여러 컨테이너를 관리하는 것이 빠르게 복잡해집니다.






Docker Compose는 이 문제를 극복하고 한 번에 여러 컨테이너를 쉽게 처리할 수 있습니다.



이 튜토리얼에서는 주요 기능과 강력한 메커니즘을 살펴보겠습니다.



2. YAML 구성 설명

요컨대 Docker Compose는 내부에 선언된 많은 규칙을 적용하여 작동합니다. 싱글 docker-compose.yml 구성 파일 .






이것들 YAML 사람이 읽을 수 있고 기계에 최적화된 규칙은 10,000피트에서 몇 줄로 전체 프로젝트를 스냅샷하는 효과적인 방법을 제공합니다.

거의 모든 규칙은 특정 **Docker **명령을 대체하므로 결국 다음을 실행하기만 하면 됩니다.

바이낸스에서 쿠코인으로 이체
docker-compose up

Compose에서 후드 아래에서 수십 가지 구성을 적용할 수 있습니다. 이렇게 하면 Bash나 다른 것으로 스크립팅하는 번거로움을 줄일 수 있습니다.

이 파일에서 다음을 지정해야 합니다. 버전 Compose 파일 형식 중 하나 이상 서비스 , 그리고 선택적으로 볼륨 그리고 네트워크 :

version: '3.7' services: ... volumes: ... networks: ...

이 요소들이 실제로 무엇인지 봅시다.

2.1. 서비스

가장 먼저, 서비스 컨테이너 구성 참조 .

예를 들어 프론트 엔드, 백엔드 및 데이터베이스로 구성된 도커화된 웹 애플리케이션을 가정해 보겠습니다. 이러한 구성 요소를 3개의 이미지로 분할하고 구성에서 3개의 서로 다른 서비스로 정의할 수 있습니다.

services: frontend: image: my-vue-app ... backend: image: my-springboot-app ... db: image: postgres ...

서비스에 적용할 수 있는 여러 설정이 있으며 나중에 자세히 살펴보겠습니다.

2.2. 볼륨 및 네트워크

볼륨 반면에 호스트와 컨테이너 또는 컨테이너 간에 공유되는 디스크 공간의 물리적 영역입니다. 다시 말해, 볼륨은 호스트의 공유 디렉토리입니다. , 일부 또는 모든 컨테이너에서 볼 수 있습니다.

비슷하게, 네트워크 컨테이너 간, 컨테이너와 호스트 간의 통신 규칙을 정의합니다. . 공통 네트워크 영역은 컨테이너의 서비스를 서로 검색할 수 있게 하는 반면 개인 영역은 가상 샌드박스에서 컨테이너를 분리합니다.

다시, 우리는 다음 섹션에서 그들에 대해 더 배울 것입니다.

3. 서비스 분석

이제 서비스의 주요 설정을 살펴보겠습니다.

3.1. 이미지 가져오기

때로는 서비스에 필요한 이미지가 이미 (당사 또는 다른 사람에 의해) 게시되었습니다. 도커 허브 , 또는 다른 도커 레지스트리 .

그렇다면 다음과 같이 참조하십시오. 영상 이미지 이름과 태그를 지정하여 속성:

services: my-service: image: ubuntu:latest ...

3.2. 이미지 구축

대신 짓다 소스 코드에서 이미지를 읽어 도커파일 .

이번에는 짓다 키워드, Dockerfile의 경로를 값으로 전달:

services: my-custom-app: build: /path/to/dockerfile/ ...

우리는 또한 할 수 있습니다 URL을 사용 경로 대신:

services: my-custom-app: build: https://github.com/my-company/my-project.git ...

또한 다음을 지정할 수 있습니다. 영상 이름과 함께 짓다 생성된 이미지의 이름을 지정하는 속성, 다른 서비스에서 사용할 수 있도록 :

services: my-custom-app: build: https://github.com/my-company/my-project.git image: my-project-image ...

3.3. 네트워킹 구성

도커 컨테이너 ** 암시적으로 또는 Docker Compose에 의해 구성을 통해 생성된 네트워크에서 서로 통신합니다**. 서비스는 단순히 컨테이너 이름과 포트로 참조하여 동일한 네트워크의 다른 서비스와 통신할 수 있습니다(예: network-example-service:80 )를 통해 포트에 액세스할 수 있도록 설정한 경우 폭로하다 예어:

services: network-example-service: image: karthequian/helloworld:latest expose: - '80'

그런데 이 경우 노출하지 않고도 작동할 것입니다. 왜냐하면 폭로하다 지시문이 이미 있습니다. 이미지 도커파일 .

netflix.com/netflix 활성화

호스트에서 컨테이너에 도달하려면 , 포트는 선언적으로 다음을 통해 노출되어야 합니다. 항구 예어 , 호스트에서 포트를 다르게 노출할지 여부를 선택할 수도 있습니다.

services: network-example-service: image: karthequian/helloworld:latest ports: - '80:80' ... my-custom-app: image: myapp:latest ports: - '8080:3000' ... my-custom-app-replica: image: myapp:latest ports: - '8081:3000' ...

포트 80은 이제 호스트에서 볼 수 있으며 다른 두 컨테이너의 포트 3000은 호스트의 포트 8080 및 8081에서 사용할 수 있습니다. 이 강력한 메커니즘을 통해 충돌 없이 동일한 포트를 노출하는 다른 컨테이너를 실행할 수 있습니다. .

마지막으로 컨테이너를 분리하기 위해 추가 가상 네트워크를 정의할 수 있습니다.

services: network-example-service: image: karthequian/helloworld:latest networks: - my-shared-network ... another-service-in-the-same-network: image: alpine:latest networks: - my-shared-network ... another-service-in-its-own-network: image: alpine:latest networks: - my-private-network ... networks: my-shared-network: {} my-private-network: {}

이 마지막 예에서 우리는 같은 네트워크에 있는 다른 서비스 ping을 수행하고 포트 80에 연결할 수 있습니다. 네트워크 예시 서비스 , 동안 자체 네트워크에 있는 다른 서비스 습관.

3.4. 볼륨 설정

세 가지 유형의 볼륨이 있습니다. 익명의 , 명명 된 , 그리고 주인 것.

Docker는 익명 및 명명된 볼륨을 모두 관리합니다. , 호스트의 자체 생성 디렉토리에 자동으로 마운트합니다. 익명 볼륨은 이전 버전의 Docker(1.9 이전)에서 유용했지만 요즘에는 명명된 볼륨이 권장되는 방법입니다. 호스트 볼륨을 사용하면 호스트의 기존 폴더를 지정할 수도 있습니다.

서비스 수준에서 호스트 볼륨을 구성하고 구성의 외부 수준에서 명명된 볼륨을 구성할 수 있습니다. 이를 통해 후자를 자신이 속한 컨테이너뿐만 아니라 다른 컨테이너에서도 볼 수 있습니다.

services: volumes-example-service: image: alpine:latest volumes: - my-named-global-volume:/my-volumes/named-global-volume - /tmp:/my-volumes/host-volume - /home:/my-volumes/readonly-host-volume:ro ... another-volumes-example-service: image: alpine:latest volumes: - my-named-global-volume:/another-path/the-same-named-global-volume ... volumes: my-named-global-volume:

여기에서 두 컨테이너 모두에 대한 읽기/쓰기 액세스 권한이 있습니다. my-named-global-volume 매핑한 다른 경로에 관계없이 공유 폴더. 대신 두 호스트 볼륨은 볼륨 예시 서비스 .

파이썬으로 웹 스크레이퍼 만들기

NS /tmp 호스트 파일 시스템의 폴더가 /내 볼륨/호스트 볼륨 컨테이너의 폴더.

파일 시스템의 이 부분은 쓰기 가능하며, 이는 컨테이너가 호스트 시스템에서 파일을 읽을 수 있을 뿐만 아니라 쓰기(및 삭제)할 수 있음을 의미합니다.

다음을 추가하여 읽기 전용 모드로 볼륨을 마운트할 수 있습니다. :NS 규칙에 따라 /집 폴더(도커 컨테이너가 실수로 사용자를 지우는 것을 원하지 않습니다).

3.5. 종속성 선언

종종 서비스 간에 종속성 체인을 생성하여 일부 서비스가 다른 서비스보다 먼저 로드되고 언로드되도록 해야 합니다. 우리는 다음을 통해 이 결과를 얻을 수 있습니다. 의존하다 예어:

services: kafka: image: wurstmeister/kafka:2.11-0.11.0.3 depends_on: - zookeeper ... zookeeper: image: wurstmeister/zookeeper ...

그러나 Compose는 다음을 기다리지 않습니다. 사육사 시작하기 전에 로드를 완료하는 서비스 카프카 서비스: 시작될 때까지 기다리기만 하면 됩니다. 다른 서비스를 시작하기 전에 서비스를 완전히 로드해야 하는 경우 다음을 가져와야 합니다. Compose에서 시작 및 종료 순서에 대한 심층 제어 .

4. 환경 변수 관리

Compose에서는 환경 변수 작업이 쉽습니다. 정적 환경 변수를 정의하고 동적 변수를 정의할 수도 있습니다. $ {} 표기법:

services: database: image: 'postgres:${POSTGRES_VERSION}' environment: DB: mydb USER: '${USER}'

Compose에 이러한 값을 제공하는 다양한 방법이 있습니다.

예를 들어, 하나는 .env 와 같은 구조의 동일한 디렉토리에 있는 파일 .속성 파일, 키=값 :

POSTGRES_VERSION=alpine USER=foo

그렇지 않으면 명령을 호출하기 전에 OS에서 설정할 수 있습니다.

export POSTGRES_VERSION=alpine export USER=foo docker-compose up

마지막으로 쉘에서 간단한 한 줄짜리를 사용하면 편리할 것입니다.

POSTGRES_VERSION=alpine USER=foo docker-compose up

접근 방식을 혼합할 수 있지만 Compose는 다음 우선 순위를 사용하여 덜 중요한 것을 더 높은 우선 순위로 덮어씁니다.

  1. 파일 작성
  2. 셸 환경 변수
  3. 환경 파일
  4. 도커파일
  5. 정의되지 않은 변수

5. 확장 및 복제본

이전 Compose 버전에서는 컨테이너 인스턴스를 확장할 수 있었습니다. 도커 작성 스케일 명령. 최신 버전은 더 이상 사용되지 않으며 다음으로 대체했습니다. –__– 규모 옵션.

반면에 우리는 악용할 수 있습니다. 도커 스웜 – Docker 엔진 클러스터 – 컨테이너를 통해 선언적으로 자동 확장 복제본 속성 전개하다 부분:

팔로우하지 않고 보호된 트윗을 보는 방법
services: worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 6 resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M ...

아래에 배포, 리소스 임계값과 같은 다른 많은 옵션을 지정할 수도 있습니다. 작곡하지만, 전체를 고려 전개하다 Swarm에 배포할 때만 섹션 , 그렇지 않으면 무시합니다.

6. 실제 사례: Spring Cloud 데이터 흐름

작은 실험이 단일 기어를 이해하는 데 도움이 되지만 실제 코드가 작동하는 것을 보는 것은 큰 그림을 확실히 드러낼 것입니다.

Spring Cloud Data Flow는 복잡한 프로젝트이지만 이해할 수 있을 만큼 간단합니다. 하자 YAML 파일 다운로드 실행:

DATAFLOW_VERSION=2.1.0.RELEASE SKIPPER_VERSION=2.0.2.RELEASE docker-compose up

Compose는 모든 구성 요소를 다운로드, 구성 및 시작한 다음 컨테이너의 로그를 현재 터미널의 단일 흐름으로 교차 .

또한 훌륭한 사용자 경험을 위해 각각에 고유한 색상을 적용합니다.

완전히 새로운 Docker Compose 설치를 실행하면 다음 오류가 발생할 수 있습니다.

lookup registry-1.docker.io: no such host

하는 동안 다른 솔루션이 있습니다 이 일반적인 함정에 8.8.8.8 DNS가 아마도 가장 간단하기 때문입니다.

엑셀로 내보내기 반응

7. 라이프사이클 관리

마지막으로 Docker Compose의 구문을 자세히 살펴보겠습니다.

docker-compose [-f ...] [options] [COMMAND] [ARGS...]

있는 동안 많은 옵션과 명령 사용 가능 , 우리는 적어도 전체 시스템을 올바르게 활성화 및 비활성화하는 방법을 알아야 합니다.

7.1. 시작

구성에 정의된 컨테이너, 네트워크 및 볼륨을 생성하고 시작할 수 있음을 확인했습니다. 위로 :

docker-compose up

그러나 처음 이후에는 간단히 사용할 수 있습니다. 시작 서비스를 시작하려면:

docker-compose start

파일 이름이 기본 파일 이름과 다른 경우( docker-compose.yml ), 우리는 악용할 수 있습니다 -NS 그리고 –__– 파일 대체 파일 이름을 지정하는 플래그:

docker-compose -f custom-compose-file.yml start

Compose는 다음과 함께 시작할 때 백그라운드에서 데몬으로 실행할 수도 있습니다. -NS 옵션:

docker-compose up -d

7.2. 일시 휴업

활성 서비스를 안전하게 중지하기 위해 다음을 사용할 수 있습니다. 멈추다 , 모든 수정 사항과 함께 컨테이너, 볼륨 및 네트워크를 보존합니다.

docker-compose stop

프로젝트의 상태를 재설정하려면 대신 다음을 실행하기만 하면 됩니다. 아래에 , 외부 볼륨을 제외한 모든 것을 파괴합니다. :

docker-compose down

8. 결론

이 자습서에서는 Docker Compose와 작동 방식에 대해 배웠습니다.

평소와 같이 소스를 찾을 수 있습니다. docker-compose.yml 파일 GitHub에서 , 다음 이미지에서 즉시 사용할 수 있는 유용한 테스트 배터리와 함께:

#도커 #데브옵스