웹사이트 검색

CentOS 7에서 Docker Compose를 설치하고 사용하는 방법


소개

Docker는 소프트웨어 컨테이너 내에서 Linux 애플리케이션 배포를 자동화하는 훌륭한 도구이지만 잠재력을 최대한 활용하려면 애플리케이션의 각 구성 요소가 자체 컨테이너에서 실행되는 것이 가장 좋습니다. 구성 요소가 많은 복잡한 애플리케이션의 경우 모든 컨테이너를 오케스트레이션하여 함께 시작 및 종료(서로 대화는 말할 것도 없고)하는 것은 빠르게 다루기 어려워질 수 있습니다.

Docker 커뮤니티는 단일 YAML 파일을 사용하여 모든 Docker 컨테이너 및 구성을 오케스트레이션할 수 있는 Fig라는 인기 있는 솔루션을 내놓았습니다. 이것이 인기를 끌면서 Docker 팀은 현재 사용되지 않는 Fig 소스를 기반으로 Docker Compose를 만들기로 결정했습니다. Docker Compose를 사용하면 사용자가 시작, 종료, 컨테이너 내 연결 및 볼륨 설정을 포함하여 Docker 컨테이너의 프로세스를 보다 쉽게 조정할 수 있습니다.

이 자습서에서는 다중 컨테이너 애플리케이션을 관리하는 데 도움이 되는 최신 버전의 Docker Compose를 설치하고 소프트웨어의 기본 명령을 탐색합니다.

Docker 및 Docker Compose 개념

Docker Compose를 사용하려면 다양한 Docker 개념을 하나로 결합해야 하므로 시작하기 전에 잠시 시간을 내어 관련된 다양한 개념을 검토해 보겠습니다. 볼륨, 링크, 포트 포워딩과 같은 Docker 개념에 이미 익숙하다면 다음 섹션으로 건너뛸 수 있습니다.

도커 이미지

각 Docker 컨테이너는 Docker 이미지의 로컬 인스턴스입니다. Docker 이미지를 완전한 Linux 설치로 생각할 수 있습니다. 일반적으로 최소 설치에는 이미지를 실행하는 데 필요한 최소한의 패키지만 포함됩니다. 이러한 이미지는 호스트 시스템의 커널을 사용하지만 Docker 컨테이너 내에서 실행 중이고 자체 파일 시스템만 보기 때문에 Ubuntu 호스트에서 CentOS와 같은 배포판을 실행하는 것이 완벽하게 가능합니다(또는 그 반대도 가능).

대부분의 Docker 이미지는 Docker 팀에서 관리하는 Docker Hub를 통해 배포됩니다. 가장 인기 있는 오픈 소스 프로젝트에는 소프트웨어를 배포하는 데 사용할 수 있는 Docker 레지스트리에 해당 이미지가 업로드되어 있습니다. 가능한 경우 "공식\ 이미지를 가져오는 것이 가장 좋습니다. Docker 팀에서 Docker 모범 사례를 따르도록 보장하기 때문입니다.

Docker 이미지 간의 통신

Docker 컨테이너는 호스트 시스템에서 격리됩니다. 즉, 기본적으로 호스트 시스템은 Docker 컨테이너 내부의 파일 시스템에 액세스할 수 없으며 네트워크를 통해 통신할 수 있는 수단도 없습니다. 이로 인해 Docker 컨테이너 내에서 실행되는 이미지의 구성 및 작업이 어려울 수 있습니다.

Docker에는 이 문제를 해결하는 세 가지 주요 방법이 있습니다. 첫 번째이자 가장 일반적인 방법은 Docker가 Docker 컨테이너 내부에 설정될 환경 변수를 지정하도록 하는 것입니다. 그런 다음 Docker 컨테이너 내에서 실행되는 코드는 시작 시 이러한 환경 변수의 값을 확인하고 이를 사용하여 적절하게 구성합니다.

일반적으로 사용되는 또 다른 방법은 Docker 데이터 볼륨입니다. Docker 볼륨은 내부 및 공유의 두 가지 유형으로 제공됩니다.

내부 볼륨을 지정한다는 것은 특정 Docker 컨테이너에 대해 지정하는 폴더의 경우 컨테이너가 제거될 때 데이터가 유지됨을 의미합니다. 예를 들어 로그 파일이 지속되도록 하려면 내부 /var/log 볼륨을 지정할 수 있습니다.

공유 볼륨은 Docker 컨테이너 내부의 폴더를 호스트 시스템의 폴더에 매핑합니다. 이를 통해 Docker 컨테이너와 호스트 시스템 간에 파일을 쉽게 공유할 수 있습니다.

Docker 컨테이너와 통신하는 세 번째 방법은 네트워크를 통하는 것입니다. Docker는 포트 전달뿐만 아니라 링크를 통해 서로 다른 Docker 컨테이너 간의 통신을 허용하므로 Docker 컨테이너 내부의 포트를 호스트 서버의 포트로 전달할 수 있습니다. 예를 들어 WordPress 및 MariaDB Docker 컨테이너가 서로 통신할 수 있도록 링크를 만들고 포트 전달을 사용하여 사용자가 연결할 수 있도록 WordPress를 외부 세계에 노출할 수 있습니다.

전제 조건

이 문서를 따르려면 다음이 필요합니다.

  • CentOS 7 서버, sudo 권한이 있는 루트가 아닌 사용자로 설정(자세한 내용은 CentOS 7의 초기 서버 설정 참조)\n
  • CentOS 7에서 Docker를 설치 및 사용하는 방법의 1단계 및 2단계 지침에 따라 설치된 Docker\n

이것들이 제자리에 있으면 따라갈 준비가 된 것입니다.

1단계 - Docker Compose 설치

최신 릴리스를 얻으려면 Docker 문서를 주도하고 Docker의 GitHub 리포지토리에 있는 바이너리에서 Docker Compose를 설치하십시오.

현재 릴리스를 확인하고 필요한 경우 아래 명령에서 업데이트하십시오.

  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

다음으로 바이너리를 실행 가능하도록 권한을 설정합니다.

  1. sudo chmod +x /usr/local/bin/docker-compose

그런 다음 버전을 확인하여 설치가 성공했는지 확인합니다.

  1. docker-compose --version

이렇게 하면 설치한 버전이 인쇄됩니다.

Output
docker-compose version 1.23.2, build 1110ad01

이제 Docker Compose가 설치되었으므로 "Hello World\ 예제를 실행할 준비가 되었습니다.

2단계 - Docker Compose로 컨테이너 실행

공개 Docker 레지스트리인 Docker Hub에는 데모 및 테스트를 위한 간단한 "Hello World\ 이미지가 포함되어 있습니다. 단일 이미지를 호출하는 YAML 파일인 Docker Compose를 사용하여 컨테이너를 실행하는 데 필요한 최소 구성을 보여줍니다.

먼저 YAML 파일용 디렉터리를 만듭니다.

  1. mkdir hello-world

그런 다음 디렉토리로 변경하십시오.

  1. cd hello-world

이제 즐겨 사용하는 텍스트 편집기를 사용하여 YAML 파일을 생성합니다. 이 튜토리얼에서는 Vi를 사용합니다.

  1. vi docker-compose.yml

i를 눌러 삽입 모드로 들어간 후 다음 내용을 파일에 넣습니다.

my-test:
  image: hello-world

첫 번째 줄은 컨테이너 이름의 일부입니다. 두 번째 줄은 컨테이너를 만드는 데 사용할 이미지를 지정합니다. docker-compose up 명령을 실행하면 지정된 이름 hello-world로 로컬 이미지를 찾습니다.

이 위치에서 ESC를 눌러 삽입 모드를 종료합니다. :x를 입력한 다음 ENTER를 입력하여 파일을 저장하고 종료합니다.

시스템의 이미지를 수동으로 보려면 docker images 명령을 사용하세요.

  1. docker images

로컬 이미지가 전혀 없으면 열 머리글만 표시됩니다.

Output
REPOSITORY TAG IMAGE ID CREATED SIZE

이제 ~/hello-world 디렉터리에 있는 동안 다음 명령을 실행하여 컨테이너를 만듭니다.

  1. docker-compose up

명령을 처음 실행할 때 hello-world라는 로컬 이미지가 없으면 Docker Compose는 Docker Hub 공개 리포지토리에서 해당 이미지를 가져옵니다.

Output
Pulling my-test (hello-world:)... latest: Pulling from library/hello-world 1b930d010525: Pull complete . . .

이미지를 가져온 후 docker-compose는 컨테이너를 만들고 연결하고 hello 프로그램을 실행합니다. 그러면 설치가 제대로 작동하는지 확인됩니다.

Output
. . . Creating helloworld_my-test_1... Attaching to helloworld_my-test_1 my-test_1 | my-test_1 | Hello from Docker. my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 | . . .

그런 다음 수행한 작업에 대한 설명을 인쇄합니다.

Output
. . . my-test_1 | To generate this message, Docker took the following steps: my-test_1 | 1. The Docker client contacted the Docker daemon. my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. my-test_1 | (amd64) my-test_1 | 3. The Docker daemon created a new container from that image which runs the my-test_1 | executable that produces the output you are currently reading. my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it my-test_1 | to your terminal. . . .

Docker 컨테이너는 명령이 활성화되어 있는 동안에만 실행되므로 hello 실행이 완료되면 컨테이너가 중지됩니다. 결과적으로 활성 프로세스를 보면 열 헤더가 나타나지만 hello-world 컨테이너는 실행 중이 아니기 때문에 나열되지 않습니다.

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

활성 컨테이너뿐만 아니라 모든 컨테이너를 표시하려면 -a 플래그를 사용하십시오.

  1. docker ps -a
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50a99a0beebd hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1

컨테이너 실행을 테스트했으므로 이제 몇 가지 기본 Docker Compose 명령을 탐색할 수 있습니다.

3단계 — Docker Compose 명령어 배우기

Docker Compose를 시작하기 위해 이 섹션에서는 docker-compose 도구가 지원하는 일반 명령을 살펴봅니다.

docker-compose 명령은 디렉토리별로 작동합니다. 하나의 컴퓨터에서 여러 그룹의 Docker 컨테이너를 실행할 수 있습니다. 각 컨테이너에 대해 하나의 디렉터리를 만들고 각 디렉터리에 대해 하나의 docker-compose.yml 파일을 만드십시오.

지금까지 docker-compose up을 직접 실행했으며 여기에서 CTRL-C를 사용하여 컨테이너를 종료할 수 있습니다. 이를 통해 터미널 창에 디버그 메시지를 표시할 수 있습니다. 그러나 이것은 이상적이지 않습니다. 프로덕션에서 실행할 때 docker-compose가 서비스처럼 작동하도록 하는 것이 더 강력합니다. 이를 수행하는 한 가지 간단한 방법은 세션을 up할 때 -d 옵션을 추가하는 것입니다.

docker-compose up -d

docker-compose는 이제 백그라운드로 분기됩니다.

Docker 컨테이너 그룹(중지된 컨테이너와 현재 실행 중인 컨테이너 모두)을 표시하려면 다음 명령을 사용하십시오.

docker-compose ps -a

컨테이너가 중지되면 다음 예와 같이 StateExited로 나열됩니다.

Output
Name Command State Ports ------------------------------------------------ hello-world_my-test_1 /hello Exit 0

실행 중인 컨테이너에 Up이 표시됩니다.

Output
Name Command State Ports --------------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp

애플리케이션 그룹에 대해 실행 중인 모든 Docker 컨테이너를 중지하려면 Docker 그룹을 시작하는 데 사용한 docker-compose.yml 파일과 동일한 디렉토리에서 다음 명령을 실행하십시오.

docker-compose stop

참고: docker-compose kill은 더 강력하게 종료해야 하는 경우에도 사용할 수 있습니다.

경우에 따라 Docker 컨테이너는 이전 정보를 내부 볼륨에 저장합니다. 처음부터 시작하려면 rm 명령을 사용하여 컨테이너 그룹을 구성하는 모든 컨테이너를 완전히 삭제할 수 있습니다.

docker-compose rm 

Docker 컨테이너 및 .yml 파일이 포함된 디렉터리가 아닌 다른 디렉터리에서 이러한 명령을 시도하면 오류가 반환됩니다.

Output
ERROR: Can't find a suitable configuration file in this directory or any parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml

이 섹션에서는 Docker Compose로 컨테이너를 조작하는 방법에 대한 기본 사항을 다뤘습니다. 컨테이너를 더 잘 제어해야 하는 경우 Docker 컨테이너의 파일 시스템에 액세스하고 컨테이너 내부의 명령 프롬프트에서 작업할 수 있습니다. 프로세스는 다음 섹션에서 설명합니다.

4단계 - Docker 컨테이너 파일 시스템에 액세스

컨테이너 내부의 명령 프롬프트에서 작업하고 해당 파일 시스템에 액세스하려면 docker exec 명령을 사용할 수 있습니다.

"Hello World\ 예제는 실행 후 종료되므로 docker exec를 테스트하려면 계속 실행할 컨테이너를 시작하세요. 이 자습서에서는 Docker Hub의 Nginx 이미지를 사용하세요.

nginx라는 새 디렉토리를 만들고 그 디렉토리로 이동합니다.

  1. mkdir ~/nginx
  2. cd ~/nginx

다음으로 새 디렉터리에 docker-compose.yml 파일을 만들고 텍스트 편집기에서 엽니다.

  1. vi docker-compose.yml

다음으로 파일에 다음 줄을 추가합니다.

nginx:
  image: nginx

파일을 저장하고 종료합니다. 다음 명령을 사용하여 Nginx 컨테이너를 백그라운드 프로세스로 시작합니다.

  1. docker-compose up -d

Docker Compose는 Nginx 이미지를 다운로드하고 컨테이너는 백그라운드에서 시작됩니다.

이제 컨테이너의 CONTAINER ID가 필요합니다. 다음 명령으로 실행 중인 모든 컨테이너를 나열합니다.

  1. docker ps

다음과 유사한 내용이 표시됩니다.

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b86b6699714c nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 80/tcp nginx_nginx_1

이 컨테이너 내부의 파일 시스템을 변경하려면 해당 ID(이 예에서는 b86b6699714c)를 가져오고 docker exec를 사용하여 컨테이너:

  1. docker exec -it b86b6699714c /bin/bash

-t 옵션은 터미널을 열고 -i 옵션은 터미널을 대화식으로 만듭니다. /bin/bash는 실행 중인 컨테이너에 대한 bash 셸을 엽니다.

그러면 다음과 유사한 컨테이너에 대한 bash 프롬프트가 표시됩니다.

root@b86b6699714c:/#

여기에서 컨테이너 내부의 명령 프롬프트에서 작업할 수 있습니다. 그러나 데이터 볼륨의 일부로 저장된 디렉토리에 있지 않으면 컨테이너가 다시 시작되는 즉시 변경 사항이 사라집니다. 또한 대부분의 Docker 이미지는 최소한의 Linux 설치로 생성되므로 익숙한 일부 명령줄 유틸리티 및 도구가 없을 수도 있습니다.

결론

이제 Docker Compose를 설치하고 "Hello World\ 예제를 실행하여 설치를 테스트했으며 몇 가지 기본 명령을 탐색했습니다.

"Hello World\ 예제는 설치를 확인했지만 간단한 구성은 Docker 컨테이너 그룹을 동시에 작동 및 중지할 수 있는 Docker Compose의 주요 이점 중 하나를 보여주지 않습니다. Docker Compose가 작동하는 경우 Ubuntu 16.04에서 Docker 및 Docker Compose를 사용하여 지속적 통합 테스트 환경을 구성하는 방법을 확인하세요. 이 자습서는 Ubuntu 16.04 및 18.04에 맞춰져 있지만 CentOS 7에 맞게 단계를 조정할 수 있습니다.