소개
이 랩에서는 docker create 명령을 사용하여 Docker 컨테이너를 즉시 시작하지 않고 준비하는 방법을 배우게 됩니다. 이를 통해 실행 전에 컨테이너와 볼륨을 구성할 수 있습니다. Ubuntu 이미지를 사용하여 컨테이너를 생성하고, 생성 상태를 확인한 다음, 생성된 컨테이너를 시작하고 연결하는 것으로 시작합니다.
또한, docker create를 사용하여 볼륨을 초기화하고, 이후 다른 컨테이너에서 이 초기화된 볼륨을 활용하는 방법을 살펴볼 것입니다. 이 실습을 통해 컨테이너 수명 주기 및 데이터 지속성을 관리하는 데 있어 docker create 명령이 제공하는 유연성과 제어 기능을 직접 경험할 수 있습니다.
시작하지 않고 컨테이너 생성하기
이 단계에서는 Docker 컨테이너를 즉시 시작하지 않고 생성하는 방법을 배우게 됩니다. 이는 컨테이너가 실행되기 전에 컨테이너의 구성 또는 볼륨을 설정하려는 경우 유용합니다.
먼저, Docker Hub 에서 ubuntu 이미지를 가져오겠습니다. 이 이미지는 컨테이너를 생성하는 데 사용됩니다.
docker pull ubuntu:latest
이미지가 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다. 다운로드가 완료되면 이미지를 나열하여 이미지가 로컬에서 사용 가능한지 확인할 수 있습니다.
docker images
이제 ubuntu 이미지에서 my-ubuntu-container라는 컨테이너를 생성합니다. 이를 위해 docker create 명령을 사용합니다. -it 플래그는 일반적으로 대화형 컨테이너에 사용되지만, docker create는 컨테이너를 설정만 할 뿐 실행하지는 않습니다. 여기서는 컨테이너를 결국 실행하는 방식과의 일관성을 위해 포함했습니다.
docker create -it --name my-ubuntu-container ubuntu:latest
docker create 명령은 지정된 이미지 위에 쓰기 가능한 컨테이너 레이어를 생성하고 지정된 명령을 실행할 준비를 합니다. 컨테이너를 시작하지는 않습니다. 컨테이너 ID 인 긴 문자열이 출력으로 표시됩니다.
컨테이너가 생성되었지만 실행되지 않고 있는지 확인하려면 중지된 컨테이너를 포함하여 모든 컨테이너를 나열할 수 있습니다.
docker ps -a
출력에서 my-ubuntu-container라는 컨테이너가 Created 상태로 표시되어야 합니다. 이는 컨테이너가 성공적으로 생성되었지만 아직 실행되지 않았음을 확인합니다.
생성된 컨테이너 시작 및 연결
이전 단계에서는 my-ubuntu-container라는 Docker 컨테이너를 생성했지만 시작하지 않았습니다. 이 단계에서는 이 생성된 컨테이너를 시작하고 터미널을 표준 입력, 출력 및 오류 스트림에 연결하는 방법을 배우게 됩니다.
컨테이너를 시작하려면 docker start 명령을 사용하고 컨테이너 이름을 입력합니다.
docker start my-ubuntu-container
이 명령은 컨테이너를 시작합니다. 그러나 기본적으로 백그라운드에서 실행됩니다. 컨테이너와 상호 작용하려면 컨테이너에 연결해야 합니다.
실행 중인 컨테이너에 연결하려면 docker attach 명령을 사용하고 컨테이너 이름을 입력합니다.
docker attach my-ubuntu-container
이 명령을 실행하면 터미널이 컨테이너의 셸에 연결됩니다. Ubuntu 컨테이너 내부의 셸과 유사한 명령 프롬프트가 표시됩니다. 일반적으로 root@<container-id>:/#와 같은 형태입니다.
이제 컨테이너 내부에 있으므로 컨테이너 내에서 명령을 실행할 수 있습니다. 예를 들어, 운영 체제 버전을 확인해 보겠습니다.
lsb_release -a
컨테이너 내에서 실행 중인 Ubuntu 버전을 보여주는 출력을 볼 수 있습니다.
컨테이너를 중지하지 않고 종료하려면 Ctrl + P를 누른 다음 Ctrl + Q를 누릅니다. 이렇게 하면 터미널이 컨테이너에서 분리되어 컨테이너가 백그라운드에서 계속 실행됩니다.
연결된 상태에서 단순히 exit를 입력하거나 Ctrl + D를 누르면 컨테이너가 중지됩니다.
분리 후, 실행 중인 컨테이너를 나열하여 컨테이너가 여전히 실행 중인지 확인할 수 있습니다.
docker ps
my-ubuntu-container가 실행 중임을 나타내는 상태로 나열되어야 합니다.
docker create 를 사용하여 볼륨 초기화
이 단계에서는 docker create 명령을 사용하여 Docker 볼륨을 초기화하는 방법을 배우게 됩니다. 이 방법을 사용하면 컨테이너의 이미지에서 초기 데이터로 볼륨을 채우기 위해 특별히 컨테이너를 생성할 수 있습니다.
먼저, ubuntu 이미지에서 volume-initializer라는 새 컨테이너를 생성해 보겠습니다. 이 컨테이너는 볼륨을 초기화하는 데 임시로 사용됩니다. -v 플래그를 사용하여 초기화하려는 볼륨과 컨테이너 내부의 마운트 지점을 지정합니다. 볼륨 이름을 my-initialized-volume으로 지정하고 컨테이너 내부의 /app_data에 마운트합니다.
docker create -v my-initialized-volume:/app_data --name volume-initializer ubuntu:latest
이 명령은 컨테이너를 생성하고, 볼륨이 아직 존재하지 않는 경우 볼륨을 생성합니다. -v my-initialized-volume:/app_data 부분은 Docker 에게 my-initialized-volume이라는 볼륨을 생성하고 컨테이너 내부의 /app_data 디렉토리에 마운트하도록 지시합니다.
이제 이 컨테이너를 시작해 보겠습니다. 볼륨이 있는 컨테이너가 처음 시작될 때, 볼륨이 비어 있으면 Docker 는 마운트 지점으로 지정된 디렉토리의 내용을 이미지에서 볼륨으로 복사합니다.
docker start volume-initializer
이 컨테이너는 초기화를 위한 것이고 장기간 실행되는 프로세스가 없으므로 시작된 후 즉시 중지될 것입니다.
모든 컨테이너를 나열하여 컨테이너가 중지되었는지 확인할 수 있습니다.
docker ps -a
volume-initializer가 Exited 상태로 표시되어야 합니다.
my-initialized-volume 볼륨이 생성되었는지 확인하려면 모든 Docker 볼륨을 나열할 수 있습니다.
docker volume ls
볼륨 목록에 my-initialized-volume이 표시되어야 합니다.
이 시점에서 my-initialized-volume 볼륨에는 ubuntu:latest 이미지의 /app_data 디렉토리에 있던 초기 데이터가 포함되어 있습니다.
다른 컨테이너에서 docker create 로 초기화된 볼륨 사용
이전 단계에서는 임시 컨테이너를 생성하고 시작하여 my-initialized-volume이라는 Docker 볼륨을 초기화했습니다. 이제 이 초기화된 볼륨을 다른 컨테이너에서 사용하는 방법을 배우게 됩니다. 이는 볼륨이 데이터를 유지하고 컨테이너 간에 공유될 수 있음을 보여줍니다.
먼저, ubuntu 이미지에서 data-consumer라는 새 컨테이너를 생성해 보겠습니다. 이번에는 컨테이너를 직접 실행하고 기존 my-initialized-volume을 이 새 컨테이너 내부의 /data 디렉토리에 마운트합니다.
docker run -it --name data-consumer -v my-initialized-volume:/data ubuntu:latest /bin/bash
이 명령을 자세히 살펴보겠습니다.
docker run: 이 명령은 새 컨테이너를 생성하고 시작합니다.-it: 이 플래그는 가상 TTY 를 할당하고 stdin 을 열어두어 대화형 사용을 허용합니다.--name data-consumer: 이 옵션은 새 컨테이너에data-consumer라는 이름을 할당합니다.-v my-initialized-volume:/data: 이것이 핵심 부분입니다. 기존 볼륨my-initialized-volume을data-consumer컨테이너 내부의/data디렉토리에 마운트합니다.ubuntu:latest: 컨테이너에 사용할 이미지를 지정합니다./bin/bash: 컨테이너 내에서 실행할 명령으로, bash 셸을 시작합니다.
이 명령을 실행하면 data-consumer 컨테이너 내부의 bash 셸에 연결됩니다.
이제 data-consumer 컨테이너 내부에 있으므로 my-initialized-volume이 마운트된 /data 디렉토리로 이동합니다.
cd /data
그런 다음 이 디렉토리의 내용을 나열하여 이전 단계에서 초기화된 데이터를 볼 수 있습니다. 정확한 내용은 볼륨이 초기화될 때 ubuntu:latest 이미지의 /app_data 디렉토리에 있던 내용에 따라 달라집니다.
ls -l
Ubuntu 이미지의 /app_data 디렉토리에서 my-initialized-volume으로 복사된 파일과 디렉토리를 볼 수 있습니다. 이는 볼륨이 성공적으로 초기화되었고 이제 이 새 컨테이너에서 사용되고 있음을 확인합니다.
data-consumer 컨테이너를 종료하려면 단순히 exit를 입력합니다.
exit
이렇게 하면 data-consumer 컨테이너가 중지되고 호스트 머신의 터미널로 돌아갑니다.
모든 컨테이너를 나열하여 data-consumer 컨테이너가 종료되었는지 확인할 수 있습니다.
docker ps -a
data-consumer가 Exited 상태로 표시되어야 합니다. my-initialized-volume은 여전히 존재하며 데이터를 유지합니다.
요약
이 랩에서는 docker create 명령을 사용하여 Docker 컨테이너를 즉시 시작하지 않고 준비하는 방법을 배웠습니다. 여기에는 이미지를 가져오고, docker create를 사용하여 해당 이미지에서 컨테이너를 생성하고, "Created" 상태를 확인하는 작업이 포함되었습니다. 그런 다음 생성된 컨테이너를 시작하고 연결하는 방법을 배우면서 컨테이너 생성과 실행의 분리를 보여주었습니다.
또한, 이 랩에서는 docker create를 사용하여 Docker 볼륨을 초기화하고, 이 초기화된 볼륨을 다른 컨테이너에서 사용하는 방법을 다루었습니다. 이는 docker create가 실행 중인 컨테이너에서 마운트되고 사용되기 전에 볼륨과 같은 인프라 구성 요소를 설정하는 데 어떻게 사용될 수 있는지를 보여주었습니다.



