docker container start 명령으로 컨테이너 재시작하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker container start 명령어를 사용하여 중지된 컨테이너를 다시 시작하는 방법을 배우게 됩니다. 먼저 hello-worldubuntu 이미지를 사용하여 컨테이너를 생성하고 중지하는 것으로 시작합니다.

그 후, 단순히 시작하는 것, 출력을 연결하여 시작하는 것, 대화형으로 시작하는 것을 포함하여 중지된 컨테이너를 시작하는 다양한 방법을 탐색합니다. 이는 컨테이너 수명 주기를 관리하기 위한 docker container start 명령어의 유연성을 보여줍니다.

컨테이너 생성 및 중지

이 단계에서는 Docker 컨테이너를 생성하고 중지하는 방법을 배우게 됩니다. 컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI 를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다.

먼저, hello-world 이미지를 Docker Hub 에서 가져오겠습니다. 이것은 테스트에 유용한 매우 작은 이미지입니다.

docker pull hello-world

이미지가 가져와지고 압축 해제되고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

이제 hello-world 이미지에서 컨테이너를 생성하고 실행해 보겠습니다. 이 명령을 실행하면 Docker 는 새 컨테이너를 생성하고 이미지에 지정된 명령을 실행합니다. hello-world의 경우, 명령은 단순히 메시지를 출력한 다음 종료됩니다.

docker run hello-world

다음과 유사한 출력을 볼 수 있습니다.

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

이 출력은 컨테이너가 성공적으로 실행되어 메시지를 출력했음을 확인합니다. 컨테이너의 명령이 완료되었으므로 컨테이너가 중지되었습니다.

중지된 컨테이너를 포함하여 시스템의 컨테이너를 보려면 docker ps -a 명령을 사용할 수 있습니다.

docker ps -a

컨테이너 목록이 표시됩니다. hello-world 컨테이너가 목록에 있어야 하며 상태는 Exited여야 합니다.

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                      PORTS    NAMES
...            hello-world   "/hello"   About a minute ago   Exited (0) 58 seconds ago            ...

이제 다른 컨테이너를 생성해 보겠습니다. 이번에는 ubuntu 이미지를 사용하고 컨테이너를 잠시 동안 실행 상태로 유지하는 명령을 실행합니다. sleep 명령을 사용하여 컨테이너를 10 초 동안 활성 상태로 유지합니다.

먼저, ubuntu 이미지를 가져옵니다.

docker pull ubuntu

이미지가 가져와지고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

이제 ubuntu 이미지에서 컨테이너를 실행하고 sleep 10 명령을 실행합니다. 컨테이너가 백그라운드에서 실행되고 터미널을 차단하지 않도록 detached 모드 (-d) 로 실행합니다.

docker run -d ubuntu sleep 10

이 명령은 컨테이너 ID 를 출력합니다.

[container_id]

docker ps를 사용하여 실행 중인 컨테이너를 확인합니다.

docker ps

ubuntu 컨테이너가 Up 상태로 나열되어야 합니다.

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS         PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About a minute ago   Up 5 seconds            ...

약 10 초 후에 sleep 10 명령이 완료되고 컨테이너가 중지됩니다. docker ps -a를 다시 사용하여 중지된 컨테이너를 포함한 모든 컨테이너를 확인합니다.

docker ps -a

ubuntu 컨테이너의 상태는 이제 Exited여야 합니다.

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About a minute ago   Exited (0) 5 seconds ago             ...
...

마지막으로, docker stop 명령을 사용하여 ubuntu 컨테이너를 수동으로 중지해 보겠습니다. ID 또는 이름으로 실행 중인 컨테이너를 중지할 수 있습니다. 컨테이너를 실행했을 때 출력된 컨테이너 ID 를 사용합니다. [container_id]를 실제 ubuntu 컨테이너의 ID 로 바꿉니다.

docker stop [container_id]

이 명령은 중지된 컨테이너 ID 를 출력합니다.

[container_id]

docker ps를 다시 사용하여 컨테이너가 더 이상 실행되지 않는지 확인합니다.

docker ps

ubuntu 컨테이너는 실행 중인 컨테이너 목록에 나타나지 않아야 합니다.

중지된 컨테이너 시작

이전 단계에서는 ubuntu 이미지를 기반으로 컨테이너를 생성하고 중지했습니다. 이 단계에서는 중지된 컨테이너를 시작하는 방법을 배우게 됩니다.

먼저, 생성한 ubuntu 컨테이너의 ID 를 찾기 위해 중지된 컨테이너를 포함한 모든 컨테이너를 나열해 보겠습니다.

docker ps -a

ubuntu 이미지를 사용하고 상태가 Exited인 컨테이너를 찾습니다. 해당 CONTAINER ID를 적어둡니다.

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS                      PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Exited (0) 4 minutes ago             ...
...

이제 docker start 명령어를 사용하고 컨테이너 ID 를 입력하여 이 중지된 컨테이너를 시작할 수 있습니다. [container_id]를 실제 ubuntu 컨테이너의 ID 로 바꿉니다.

docker start [container_id]

이 명령은 시작된 컨테이너 ID 를 출력합니다.

[container_id]

docker ps를 사용하여 컨테이너가 현재 실행 중인지 확인합니다.

docker ps

ubuntu 컨테이너가 Up 상태로 나열되어야 합니다.

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS         PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Up 5 seconds            ...

이 컨테이너의 원래 명령이 sleep 10이었으므로 컨테이너는 10 초 동안 실행된 다음 다시 중지됩니다. 몇 초 후에 docker ps -a를 다시 실행하여 상태를 확인합니다.

docker ps -a

ubuntu 컨테이너는 이제 다시 Exited 상태여야 합니다.

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS                       PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Exited (0) 5 seconds ago              ...
...

중지된 컨테이너를 시작하는 것은 새 컨테이너를 생성하지 않고 이전 컨테이너 인스턴스의 작업 또는 상태를 재개하려는 경우 유용합니다.

컨테이너 시작 및 출력 연결

이전 단계에서 컨테이너를 생성하고 시작했습니다. detached 모드 (-d) 에서 docker run 또는 docker start를 사용했을 때 컨테이너는 백그라운드에서 실행되었습니다. 때로는 컨테이너가 실행되는 동안 출력을 보고 싶을 수 있습니다. 이 단계에서는 컨테이너를 시작하고 표준 출력 및 표준 오류 스트림에 연결하는 방법을 배우게 됩니다.

먼저, 5 초 동안 매초 메시지를 출력하는 새 컨테이너를 생성해 보겠습니다. 다시 ubuntu 이미지를 사용합니다.

docker run -d ubuntu /bin/bash -c 'for i in {1..5}; do echo "Hello from container $i"; sleep 1; done'

이 명령은 detached 모드 (-d) 로 컨테이너를 생성하고 실행합니다. 컨테이너 내부에서 실행되는 명령은 5 번 반복하여 메시지를 출력하고 각 반복에서 1 초 동안 대기하는 bash 스크립트입니다. 출력되는 컨테이너 ID 를 적어둡니다.

[container_id]

이제 이 실행 중인 컨테이너에 연결하여 출력을 확인해 보겠습니다. docker attach 명령어를 사용하고 컨테이너 ID 를 입력합니다. [container_id]를 실제 ubuntu 컨테이너의 ID 로 바꿉니다.

docker attach [container_id]

터미널에 컨테이너의 출력이 표시되어야 합니다.

Hello from container 1
Hello from container 2
Hello from container 3
Hello from container 4
Hello from container 5

루프가 완료되면 컨테이너가 중지되고 터미널 프롬프트로 돌아갑니다.

이미 중지된 컨테이너에 연결하면 docker attach 명령이 즉시 종료됩니다.

모든 컨테이너를 나열하여 컨테이너가 중지되었는지 확인해 보겠습니다.

docker ps -a

/bin/bash -c 'for i in {1..5}; do echo "Hello from container $i"; sleep 1; done' 명령이 있는 컨테이너가 Exited 상태로 표시되어야 합니다.

CONTAINER ID   IMAGE    COMMAND                  CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "/bin/bash -c 'for i…"   About a minute ago   Exited (0) 5 seconds ago             ...

컨테이너에 연결하는 것은 장기간 실행되는 프로세스의 출력을 모니터링하거나 디버깅 목적으로 유용합니다.

컨테이너 대화형으로 시작

이전 단계에서는 명령을 실행한 다음 종료되거나 백그라운드에서 실행되는 컨테이너를 실행했습니다. 가상 머신이나 원격 서버와 마찬가지로 컨테이너와 상호 작용하려는 경우가 많습니다. 이 단계에서는 컨테이너를 대화형으로 시작하고 컨테이너 내에서 셸 프롬프트를 얻는 방법을 배우게 됩니다.

컨테이너를 대화형으로 실행하려면 -i-t 플래그와 함께 docker run 명령을 사용합니다.

  • -i 플래그는 연결되지 않은 경우에도 표준 입력 (STDIN) 을 열어 둡니다. 이는 대화형 프로세스에 필요합니다.
  • -t 플래그는 셸 프롬프트에 필요한 pseudo-TTY 를 할당합니다.

ubuntu 컨테이너를 실행하고 /bin/bash 명령을 실행하여 컨테이너 내에서 bash 셸을 얻습니다.

docker run -it ubuntu /bin/bash

이 명령을 실행하면 다음과 같은 셸 프롬프트가 표시됩니다.

root@[container_id]:/#

이는 현재 root 사용자로 실행 중인 ubuntu 컨테이너 내에 있음을 나타냅니다. 이 컨테이너 내에서 표준 Linux 명령을 실행할 수 있습니다. 예를 들어 운영 체제 버전을 확인해 보겠습니다.

cat /etc/os-release

Ubuntu 컨테이너 내에서 실행 중임을 확인하는 다음과 유사한 출력이 표시되어야 합니다.

NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=jammy
UBUNTU_CODENAME=jammy

현재 디렉토리의 파일을 나열하는 것과 같은 다른 명령도 시도할 수 있습니다.

ls

Ubuntu 시스템의 표준 루트 디렉토리 내용을 볼 수 있습니다.

컨테이너를 종료하고 호스트 터미널로 돌아가려면 컨테이너의 셸 프롬프트에서 exit를 입력하면 됩니다.

exit

셸을 종료하면 주 프로세스 (/bin/bash) 가 완료되었으므로 컨테이너가 중지됩니다.

모든 컨테이너를 나열하여 컨테이너가 중지되었는지 확인해 보겠습니다.

docker ps -a

/bin/bash 명령이 있는 컨테이너가 Exited 상태로 표시되어야 합니다.

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "/bin/bash"   About a minute ago   Exited (0) 5 seconds ago             ...
...

컨테이너를 대화형으로 실행하는 것은 컨테이너 이미지를 탐색하고, 컨테이너 내에서 애플리케이션을 디버깅하고, 관리 작업을 수행하는 데 필수적입니다.

요약

이 Lab 에서는 docker rundocker stop 명령을 사용하여 Docker 컨테이너를 생성하고 중지하는 방법을 배웠습니다. docker pull을 사용하여 이미지를 가져오는 연습을 했고, docker ps -a를 사용하여 컨테이너 상태를 확인했습니다. 또한 즉시 종료되는 컨테이너 (hello-world) 와 일정 기간 동안 실행되는 컨테이너 (sleep을 사용한 ubuntu) 를 생성했습니다.

그런 다음 docker start 명령을 사용하여 중지된 컨테이너를 다시 시작하는 다양한 방법을 살펴보았습니다. 컨테이너를 간단하게 시작하는 방법, -a 플래그를 사용하여 컨테이너를 시작하고 출력에 연결하는 방법, 그리고 -i 플래그를 사용하여 컨테이너를 대화형으로 시작하여 실행 중인 컨테이너 내에서 명령을 실행하는 방법을 배웠습니다.