컨테이너화된 애플리케이션 빌드하고 공유하기
컨테이너화된 애플리케이션 빌드하고 공유하기
애플리케이션은 특정 런타임, 라이브러리, 데이터베이스, 지원 도구에 의존할 수 있어요. Docker는 이런 의존성을 애플리케이션과 함께 패키징하므로, 각 머신을 손으로 준비하지 않고도 일관되게 실행할 수 있어요. 이 15분 튜토리얼에서 컨테이너를 실행하고, 멀티 컨테이너 애플리케이션을 시작하고, 애플리케이션을 이미지로 패키징하고, Docker Hub를 통해 이미지를 공유해요.
출처: 문서
본문
애플리케이션은 특정 런타임, 라이브러리, 데이터베이스, 지원 도구에 의존할 수 있어요. Docker는 이런 의존성을 애플리케이션과 함께 패키징하므로, 각 머신을 손으로 준비하지 않고도 일관되게 실행할 수 있어요.
이 15분 튜토리얼에서 컨테이너를 실행하고, 멀티 컨테이너 애플리케이션을 시작하고, 애플리케이션을 이미지로 패키징하고, Docker Hub를 통해 이미지를 공유해요.
시작 전에
- Docker Desktop을 설치하고 시작해요.
- Git을 설치해요.
- Docker 계정을 만들어요.
컨테이너 실행
다른 사람이 Docker용으로 패키징한 작은 웹 애플리케이션부터 시작해요. Docker는 애플리케이션을 이미지로 배포해요. 이미지는 애플리케이션과 그에 필요한 모든 것을 담은 바로 실행 가능한 패키지예요. 컨테이너는 이미지의 실행 중인 인스턴스예요.
Docker Hub에서 이미지를 다운로드해요.
$ docker pull docker/welcome-to-docker
이미지에서 컨테이너를 시작해요.
$ docker run --detach --name welcome --publish 8080:80 docker/welcome-to-docker
이 명령은 백그라운드에서 컨테이너를 실행하고(--detach), 이름을 welcome으로 지정하며(--name), 웹 서버를 머신의 포트 8080에서 사용할 수 있게 해요(--publish 8080:80). 마지막 인자는 실행할 이미지를 식별해요.
http://localhost:8080 을 열어 애플리케이션을 확인해요.
이미지를 다운로드하고 그 이미지에서 컨테이너 하나를 시작했어요.
계속 진행하기 전에 컨테이너를 제거해요.
$ docker rm --force welcome
이 명령은 실행 중인 애플리케이션을 제거해요. 이미지는 로컬에 그대로 남으므로 Docker가 나중에 또 다른 컨테이너를 만들 수 있어요.
애플리케이션 스택 실행
첫 번째 애플리케이션은 컨테이너 하나만 필요했어요. 애플리케이션은 프론트엔드, API, 데이터베이스처럼 여러 부분으로 이루어지는 경우가 많아요. 각 부분을 별도의 docker run 명령으로 시작할 수도 있지만, 그 구성과 연결을 서로 동기화해 유지해야 해요.
Docker Compose는 compose.yaml 파일에 애플리케이션의 모든 부분을 기술하고 그것들을 함께 관리해요. Compose는 Docker Desktop에 포함되어 있어요.
준비된 투두 애플리케이션으로 시도해 봐요. 프로젝트를 클론하고 디렉터리를 열어요.
$ git clone https://github.com/docker/getting-started-todo-app
$ cd getting-started-todo-app
프로젝트의 compose.yaml 파일은 프론트엔드, API, 데이터베이스, 데이터베이스 관리 인터페이스, 프록시의 다섯 개 서비스를 정의해요. 서비스는 애플리케이션의 한 부분을 나타내며 자체 컨테이너에서 실행돼요.
전체 개발 스택을 시작해요.
$ docker compose up --build --detach
docker compose up 명령은 compose.yaml을 읽고 서비스를 시작해요. --build 옵션은 프로젝트에서 프론트엔드와 API 이미지를 빌드하고, --detach는 컨테이너를 백그라운드에서 계속 실행하게 해요. Compose는 또한 지원 서비스의 이미지를 풀하고 컨테이너들을 연결해요.
http://localhost 를 열고 투두 리스트에 항목을 추가해 보세요.
Compose가 시작한 컨테이너를 확인해요.
$ docker compose ps
각 행은 애플리케이션의 서비스 중 하나를 위한 컨테이너를 나타내요. 프로젝트는 명령들의 모음을 보존하는 대신, 전체 스택을 하나의 버전 관리되는 정의에 유지해요.
이미지 빌드
지금까지 게시된 이미지를 실행하고, Compose로 개발 스택을 빌드하고 관리했어요. 이제 투두 애플리케이션의 프론트엔드와 API를 함께 패키징한 나만의 이미지를 빌드해 봐요.
저장소에는 이미지를 빌드하기 위한 지침 세트인 Dockerfile이 들어 있어요. ``을 여러분의 Docker 사용자 이름으로 바꾼 다음 실행해요.
$ docker build --tag /getting-started-todo-app .
--tag 옵션은 이미지에 이름을 부여해요. 사용자 이름 접두사는 이미지가 Docker Hub의 어디에 저장될지 식별해요. 마지막 .은 Docker에게 현재 디렉터리에서 Dockerfile과 애플리케이션 소스를 찾으라고 알려 줘요.
welcome 이미지 때처럼 여러분의 이미지에서 컨테이너를 만들어요.
$ docker run --detach --name todo --publish 8080:3000 /getting-started-todo-app
http://localhost:8080 을 열어요. 이번에는 여러분이 빌드한 이미지에서 프론트엔드와 API가 함께 실행되고 있어요.
이미지 공유
이미지는 레지스트리를 통해 공유할 수 있어요. Docker Hub는 이미지를 저장하고 다른 머신과 배포 시스템에서 사용할 수 있게 하는 레지스트리예요.
Docker Home에서 여러분의 Docker 사용자 이름 아래에 getting-started-todo-app이라는 공개 저장소를 만들어요.
명령줄에서 로그인한 다음 이미지를 푸시해요.
$ docker login
$ docker push /getting-started-todo-app
docker push 명령은 이미지를 Docker Hub에 업로드해요. Docker Home에서 저장소를 열어 확인해요. 다른 머신이나 배포 시스템이 같은 이미지를 풀하고 실행할 수 있어요.
정리
단일 컨테이너와 개발 스택을 제거해요.
$ docker rm --force todo
$ docker compose down --volumes
배운 것
다른 사람이 패키징한 소프트웨어를 실행하고, Compose로 멀티 컨테이너 애플리케이션을 시작하고, 나만의 이미지를 빌드하고 게시했어요. 이미지는 애플리케이션을 패키징하고, 컨테이너는 그 이미지를 실행하며, Compose는 여러 컨테이너를 조정하고, 레지스트리는 이미지를 한 머신 너머로 사용할 수 있게 해요.
다음 단계
이 튜토리얼의 개념을 더 자세히 탐구해요.
나만의 애플리케이션을 컨테이너화하려면 언어별 Docker 가이드를 선택하세요.