도커
컨테이너
실행

도커 컨테이너 실행

이번 포스팅은 도커 컨테이너 실행 관련 자주 하는 질문 Top 5를 뽑아 봤습니다. 도커는 문서화가 잘 되어 있는 서비스 중 하나이지만, 언제나 내가 딱 원하는 질문은 찾기 어렵기 마련입니다. 한번쯤 아래 질문 목록과 같은 궁금증을 가졌던 분이라면 도움이 될 것입니다.

1. 도커 컨테이너 실행 명령어 (이미지 실행)

도커 컨테이너 실행 명령어는 docker container run 입니다.

이 명령어는 docker run 명령어와 동일한 기능을 수행하며, 도커가 모던한 명령어 구조로 개편하면서 새롭게 추가한 명령어입니다. 앞으로 알아볼 다른 명령어와 함께 사용할 때도 docker container run 이 훨씬 직관적이고 쉽게 구분이 되니, 이 명령어를 사용하길 추천합니다.

기본적인 docker container run 명령어의 형태는 다음과 같습니다:

$ docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • [OPTIONS]: 컨테이너를 실행하는데 사용되는 선택적 파라미터입니다. 예를 들어, -d는 컨테이너를 백그라운드에서 실행하고, -p는 호스트와 컨테이너 간의 포트 매핑을 설정하며, -v는 볼륨을 마운트하는데 사용됩니다.
  • IMAGE: 컨테이너를 실행하기 위한 도커 이미지이며 필수적으로 명시해야 합니다. 이는 로컬에 있는 이미지일 수도 있고, Docker Hub 등의 원격 레지스트리에 있는 이미지일 수도 있습니다.
  • [COMMAND]: 컨테이너가 시작될 때 실행될 명령어입니다. 선택적인 파라미터로, 만약 이 값을 명시했을 경우, IMAGE 부분에 명시한 도커 이미지의 Dockerfile 내부 CMD 지시어 대신 명시한 명령어를 실행합니다.
  • [ARG]: [COMMAND]에 전달되는 인수이며, 선택적 파라미터입니다.

예제로 확인해보겠습니다.

$ docker container run -d -p 8080:80 --name my_container nginx

여기서 사용한 옵션값들을 설명하자면, 다음과 같습니다.

  • -d: 컨테이너를 백그라운드에서 실행합니다 (detach mode).
  • -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다.
  • --name my_container: 컨테이너의 이름을 my_container로 설정합니다.
  • nginx: 최신 버전의 공식 nginx 도커 이미지를 기반으로 컨테이너를 실행합니다. 만약 로컬 환경에 해당 버전의 nginx 이미지가 없다면, Docker Hub에서 다운로드 받은 후 진행됩니다.

즉, 위 명령어는 nginx 이미지를 기반으로 my_container라는 이름의 컨테이너를 생성하고, 호스트의 8080 포트를 컨테이너의 80 포트에 매핑하며, 컨테이너를 백그라운드에서 실행합니다.

2. 컨테이너 실행 안됨 해결

섹션 1에서 본 것처럼 docker container run 명령어를 사용했는데도 컨테이너가 제대로 실행되지 않아 당황스러운 경험을 할 수 있습니다. 도커 컨테이너가 실행이 안 되는 원인은 정말 다양하지만, 그 중 일반적인 몇 가지 경우와 해결책만 정리해봅니다.

2.1. 이미지가 존재하지 않음

도커 컨테이너를 실행하려면 해당 컨테이너의 이미지가 로컬 시스템에 존재하거나 Docker Hub 등의 원격 레지스트리에서 다운로드할 수 있어야 합니다. 만약 이미지가 존재하지 않는데 다운로드가 진행되지 않는다면, 네트워크 상황을 확인해보고 docker image pull 명령어로 이미지를 수동으로 다운로드한 후 컨테이너를 실행해보세요.

2.2. Docker 서비스가 실행되지 않음

도커 서비스가 실행되지 않고 있다면 컨테이너를 실행할 수 없습니다. 이 경우, 리눅스는 systemctl start docker 명령어를, MacOS와 Windows는 Docker Desktop을 실행한 후 도커가 제대로 동작하고 있는지 작업표시줄 아이콘으로 확인해보세요.

2.3. 컨테이너에 필요한 리소스가 부족함

컨테이너는 많은 CPU나 메모리를 필요로 하는데, 시스템에 충분한 리소스가 없다면 컨테이너가 실행되지 않을 수 있습니다. 이 경우, 쓸모 없는 응용프로그램이나 컨테이너를 종료해서 필요한 리소스를 확보한 후 컨테이너를 실행해야 합니다.

2.4. 컨테이너 설정 오류

Dockerfile이나 docker container run 명령어에 잘못된 설정이 포함되어 있다면 컨테이너가 실행되지 않을 수 있습니다. 이 경우, 설정을 확인하고 문제를 수정한 후 컨테이너를 다시 실행해야 합니다. 섹션 1을 다시 한번 읽고 실행해보세요.

2.5. 컨테이너가 즉시 종료됨

컨테이너의 실행 명령이 빠르게 종료되면 (예를 들어, 'Hello, World!'를 출력하는 명령 등), 컨테이너는 실행 후 즉시 종료되어 실행되지 않는 것처럼 보일 수 있습니다. 이 경우, 컨테이너가 계속 실행되도록 명령을 변경하거나, docker container logs 명령을 사용하여 컨테이너의 출력을 확인해야 합니다.

이런 문제들을 해결하는 데도 여전히 문제가 발생한다면, docker container logs [container_id] 명령어를 사용하여 컨테이너의 로그를 확인하거나, docker container run 명령에 -it 옵션을 추가하여 대화형 모드로 컨테이너를 실행하고 문제를 직접 확인해볼 수 있습니다. 이 부분은 섹션 5를 참고해주세요.

3. 컨테이너 자동 실행 훅은 계속 실행 하는 방법

도커 컨테이너를 자동으로 실행하려면 여러 가지 방법이 있습니다. 가장 일반적인 방법은 Docker 재시작 정책을 사용하거나 Docker Compose를 사용하는 것입니다.

3.1. Docker 재시작 정책

도커는 컨테이너가 실패했을 때, 또는 도커 데몬(백그라운드에서 모든 도커 프로세스를 관리하는 프로그램)이 시작될 때 컨테이너를 자동으로 재시작하는 재시작 정책을 제공합니다. 이를 사용하여 컨테이너를 자동으로 실행할 수 있습니다.

재시작 정책을 지정하기 위해서는, docker container run 명령어에 --restart 옵션을 추가하여 설정합니다. 재시작 정책에는 no, on-failure, always, unless-stopped 등 직관적인 옵션이 있습니다.

예를 들어, 다음 명령어는 컨테이너가 종료되면 항상 재시작하도록 설정합니다:

$ docker run -d --restart always my-container

3,2. Docker Compose

도커 컴포즈는 여러 컨테이너를 정의하고 관리할 수 있는 도구입니다. 이러한 도커 컴포즈를 사용하여 컨테이너를 자동으로 시작할 수 있습니다.

도커 컴포즈는 YAML 파일 형식을 사용하여 서비스를 정의합니다. 이 파일 내에서 restart 정책을 설정하여 컨테이너가 자동으로 시작하도록 할 수 있습니다. 예를 들어, 다음은 docker-compose.yml 파일의 예입니다:

version: "3"
 
services:
  web:
    image: my-web-app
    restart: always
...

이 설정을 사용하면 my-web-app 서비스는 항상 자동으로 시작됩니다.

이외에도 Docker Swarm, Kubernetes 같은 컨테이너 오케스트레이션 도구를 사용하여 컨테이너를 자동으로 시작하고 관리할 수 있습니다. 이러한 도구는 컨테이너를 클러스터 내에서 스케줄링하고, 스케일링하고, 복구하는 데 유용합니다.

4. 컨테이너 id 실행 방법

질문 1에서 살펴본 docker container run 명령어는 새로운 컨테이너를 만들고 실행합니다. 만약, 이미 만들어진 컨테이너를 재실행하고자 할 때는 컨테이너 id 실행 방법을 따라야 합니다.

필요한 명령어는 2가지 입니다.

우선, 정지된 컨테이너의 ID 를 확인하기 위해 다음 명령어를 입력하고,

$ docker container ls --all

알아낸 컨테이너 ID 의 일부를 복사해서 다음 명령어와 실행합니다.

$ docker container start [container-id]

5. 컨테이너 sh 실행 방법

도커 컨테이너에서 Shell (sh) 스크립트를 실행하려면 docker container exec 명령어를 사용하면 됩니다. 이를 통해 실행 중인 컨테이너 내에서 새로운 프로세스를 시작할 수 있습니다.

다음은 Docker 컨테이너에서 쉘을 실행하는 명령어입니다

$ docker container exec -it [container_id] /bin/sh

여기서 [container_id]는 실행 중인 Docker 컨테이너의 ID입니다. -it 옵션은 컨테이너와의 대화형 터미널 세션을 시작하며, /bin/sh는 실행할 명령어입니다.

만약 컨테이너가 /bin/sh를 지원하지 않고 /bin/bash만 지원하는 경우에는 다음과 같이 입력할 수 있습니다.

$ docker container exec -it [container_id] /bin/bash

이렇게 하면 컨테이너 내에서 Shell 세션을 시작하고, 직접 명령어를 입력하여 파일을 조작하거나 프로세스를 실행하는 등의 작업을 수행할 수 있습니다.

6. 마치며

이번 포스팅은 도커 컨테이너 실행 명령어와 실행 안됨 해결 방법, 컨테이너 자동 실행 혹은 계속 실행 방법, 컨테이너 id 로 실행하는 방법 그리고 컨테이너에서 sh 를 비롯한 쉘을 실행하는 방법을 알아보았습니다. 도커로 새로운 컨테이너를 생성하고 실행할 때, 이 포스트 내용이 도움이 되길 바랍니다.

copyright for docker container run

© 2023 All rights reserved.