웹사이트 검색

Ubuntu 14.04에서 Docker Compose를 설치하고 사용하는 방법


소개

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

Docker 커뮤니티는 단일 YAML 파일을 사용하여 모든 Docker 컨테이너 및 구성을 오케스트레이션할 수 있는 Fig라는 인기 있는 솔루션을 내놓았습니다. 이것이 인기를 끌면서 Docker 팀은 결국 Fig 소스를 기반으로 자체 버전을 만들기로 결정했습니다. 그들은 그것을 Docker Compose라고 불렀습니다. 즉, Docker 컨테이너의 오케스트레이션 프로세스(예: 시작, 종료, 컨테이너 내 연결 및 볼륨 설정)를 정말 쉽게 처리할 수 있습니다.

이 기사를 마치면 Docker 및 Docker Compose가 설치되고 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 컨테이너 간의 통신을 허용하므로 Docker 컨테이너 내부의 포트를 호스트 서버의 포트로 전달할 수 있습니다. 예를 들어 WordPress 및 MariaDB Docker 컨테이너가 서로 통신하고 사용자가 연결할 수 있도록 WordPress를 외부 세계에 노출하는 포트 전달을 허용하는 링크를 만들 수 있습니다.

전제 조건

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

  • 우분투 14.04 물방울
  • sudo 권한이 있는 루트가 아닌 사용자(Ubuntu 14.04의 초기 서버 설정에 설정 방법이 설명되어 있음)

1단계 - 도커 설치

먼저 아직 Docker를 설치하지 않았다면 Docker를 설치합니다. Docker를 설치하는 가장 빠른 방법은 설치 스크립트를 다운로드하여 설치하는 것입니다(sudo 암호를 묻는 메시지가 표시됨).

  1. wget -qO- https://get.docker.com/ | sh

위의 명령은 Docker 팀이 작성한 작은 설치 스크립트를 다운로드하고 실행합니다. 타사 스크립트를 신뢰하지 않거나 스크립트가 수행하는 작업에 대한 자세한 내용을 보려면 설치 설명서의 지침을 확인하십시오.

사용자가 올바르게 구성되지 않은 경우 Docker로 작업하기가 어렵습니다. 따라서 다음 명령을 사용하여 사용자를 docker 그룹에 추가하십시오.

sudo usermod -aG docker $(whoami)

새 그룹을 활성화하려면 서버에서 로그아웃했다가 다시 로그인하십시오.

참고: Docker 사용 방법에 대한 자세한 내용은 Docker 설치 및 사용 방법: 시작하기의 Docker 사용 방법 섹션을 참조하십시오.

2단계 - Docker Compose 설치

이제 Docker를 설치했으므로 Docker Compose를 설치하겠습니다. 먼저 python-pip를 전제 조건으로 설치합니다.

  1. sudo apt-get -y install python-pip

그런 다음 Docker Compose를 설치할 수 있습니다.

  1. sudo pip install docker-compose

3단계 — Docker Compose로 컨테이너 실행

공개 Docker 레지스트리인 Docker Hub에는 간단한 Hello World 이미지가 포함되어 있습니다. 이제 Docker Compose가 설치되었으므로 이 간단한 예제로 테스트해 보겠습니다.

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

  1. mkdir hello-world

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

  1. cd hello-world

이제 즐겨 사용하는 텍스트 편집기를 사용하여 YAML 파일을 생성합니다(nano 사용).

  1. nano docker-compose.yml

다음 내용을 파일에 넣고 파일을 저장한 다음 텍스트 편집기를 종료합니다.

my-test:
  image: hello-world

첫 번째 줄은 컨테이너 이름의 일부로 사용됩니다. 두 번째 줄은 컨테이너를 만드는 데 사용할 이미지를 지정합니다. 이미지는 공식 Docker Hub 리포지토리에서 다운로드됩니다.

여전히 ~/hello-world 디렉터리에 있는 동안 다음 명령을 실행하여 컨테이너를 생성합니다.

  1. docker-compose up

출력은 다음으로 시작해야 합니다.

Output of docker-compose up
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 |

그러면 출력에서 Docker가 수행하는 작업을 설명합니다.

  1. Docker 클라이언트가 Docker 데몬에 연결했습니다.
  2. Docker 데몬이 Docker Hub에서 \hello-world 이미지를 가져왔습니다.
  3. Docker 데몬은 해당 이미지에서 현재 읽고 있는 출력을 생성하는 실행 파일을 실행하는 새 컨테이너를 생성했습니다.
  4. Docker 데몬은 해당 출력을 Docker 클라이언트로 스트리밍하여 터미널로 보냈습니다.

프로세스가 저절로 종료되지 않으면 CTRL-C를 누르십시오.

이 간단한 테스트는 Docker 컨테이너 그룹을 동시에 작동 및 중지할 수 있는 Docker Compose의 주요 이점 중 하나를 보여주지 않습니다. Ubuntu 14.04에서 Docker Compose와 함께 Wordpress 및 PhpMyAdmin을 설치하는 방법 문서에서는 Docker Compose를 사용하여 3개의 컨테이너를 하나의 애플리케이션 그룹으로 실행하는 방법을 보여줍니다.

4단계 — 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

예를 들어 다음은 helloworld_my-test_1 컨테이너가 중지되었음을 보여줍니다.

Output of `docker-compose ps`
Name Command State Ports ----------------------------------------------- helloworld_my-test_1 /hello Exit 0

실행 중인 컨테이너는 Up 상태를 표시합니다.

Output of `docker-compose ps`
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 from wrong directory
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, fig.yml, fig.yaml

5단계 - Docker 컨테이너 파일 시스템에 액세스(선택사항)

컨테이너 내부의 명령 프롬프트에서 작업해야 하는 경우 docker exec 명령을 사용할 수 있습니다.

Hello World! 예제는 실행 후 종료되므로 docker exec를 사용하여 컨테이너의 파일 시스템에 액세스할 수 있도록 계속 실행할 컨테이너를 시작해야 합니다. . Docker Hub의 Nginx 이미지를 살펴보겠습니다.

새 디렉토리를 만들고 변경하십시오.

  1. mkdir ~/nginx && cd $_

새 디렉터리에 docker-compose.yml 파일을 만듭니다.

  1. nano docker-compose.yml

다음을 붙여넣습니다.

nginx:
  image: nginx

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

  1. docker-compose up -d

Nginx 이미지가 다운로드되고 컨테이너가 백그라운드에서 시작됩니다.

이제 컨테이너의 CONTAINER ID가 필요합니다. 실행 중인 모든 컨테이너 목록:

  1. docker ps

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

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1

참고: 실행 중인 컨테이너만 docker ps 명령으로 나열됩니다.

이 컨테이너 내부의 파일 시스템을 변경하려면 해당 ID(이 예에서는 e90e12f70418)를 가져와 docker exec를 사용하여 내부에서 셸을 시작합니다. 컨테이너:

  1. docker exec -it e90e12f70418 /bin/bash

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

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

root@e90e12f70418:/#

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

결론

좋습니다. Docker Compose의 기본 개념과 이를 설치하고 실행하는 방법을 다룹니다. Docker Compose를 사용하여 애플리케이션을 배포하는 방법에 대한 보다 복잡한 예는 Ubuntu 14.04 자습서에서 Docker Compose를 사용하여 Wordpress 및 PHPMyAdmin 배포를 확인하세요.

docker-compose.yml 파일에 대한 구성 옵션의 전체 목록은 Compose 파일 참조를 참조하세요.