땃쥐네

[Docker] docker run : 도커에서 컨테이너 실행 본문

DevOps/Docker

[Docker] docker run : 도커에서 컨테이너 실행

ttasjwi 2022. 12. 4. 16:18

 

이번 글에서는 도커 이미지로 컨테이너로서 실행시키는 docker run 명령을 실행해보고, 내부적인 동작 원리를 간략하게나마 살펴볼 것이다. 


1. 도커에서 hello-world 실행해보기

1.1 터미널에서 실행

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pulling fs layer
2db29710123e: Download complete
2db29710123e: Pull complete
Digest: sha256:faa03e786c97f07ef34423fccceeec2398ec8a5759259f94d99078f264e9d7af
Status: Downloaded newer image for hello-world:latest

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

 

docker run 명령어로 hello-world를 통해 실행하면 위와 같은 로그를 확인할 수 있는데,

내부적으로 이 한 문장이 실행되기 까지의 동작원리를 살펴볼 필요가 있다.

1.2 흐름

1. 사용자가 run 명령어로 도커 클라이언트를 통해 hello-world를 통해 컨테이너를 실행해달라고 요청한다.

 

2. 도커 클라이언트는 도커 데몬에 접속해 hello-world 이름의 이미지에서 컨테이너를 생성할 것을 요청한다.

 

3. 도커 데몬이 hello-world 이미지를 로컬에서 1차적으로 조회한다. 하지만 도커 데몬은 hello-world 이미지를 갖고 있지 않으므로 도커 허브 서버의 도커 레지스트리에서, 도커 이미지를 다운로드(pull)해온다.

 

4. 도커 데몬이 hello-world 이미지로부터 신규 컨테이너를 생성하고, 컨테이너가 실행되면 hello-world 이미지에서 정의된 로직대로 메시지를 출력

 

5. 도커 데몬은 이 출력문을 도커 클라이언트로 전달

 

6. 도커 클라이언트는 이 출력문을 터미널로 전달


2. 도커 엔진의 컴포넌트

2.1 도커 클라이언트 - 도커 데몬

 

도커 엔진은 크게 3개의 컴포넌트로 구성되어 있다.

- 도커 클라이언트 : 도커 명령을 받고 결과를 출력하는 역할

- REST API : REST API를 도커 데몬에게 전달할 수 있음

- 도커 데몬(서버) : 백그라운드에서 컨테이너 시작, 운영, 정지 등을 수행

 

예제에서는 도커 클라이언트를 통해, 도커 데몬에 연결을 했다.

 

2.2 도커 이미지와 도커 컨테이너

 

 

2.2.1 도커 이미지

- 도커 이미지는 애플리케이션을 실행하는데 필요한 모든 파일, 그리고 그것을 실행하는 방법을 한 데 모아놓은 것이다.

- stateless : '상태를 저장하지 않는' -> 이미지 자체는 한번 만들어지면 상태를 변경할 수 없다.

- 네트워크를 전송하거나, '도커 레지스트리'에 저장할 수 있다. 동일한 상태의 이미지를 가져와 여러 환경에서 실행할 수 있다.

- 이름이나 버전을 지정할 수도 있으며 파일로 저장할 수도 있다.

- 베이스 이미지 : 모든 이미지는 그 기반에 이미지가 하나 존재하는데 대체적으로 운영체제(Ubuntu, CentOS, ...) 를 둔다. 물론 사용자 커스텀 베이스 이미지를 만들어서 둘 수 있긴 하지만 그런 경우는 거의 없다.

- 레이어링 : 도커는 이미지 위에 다른 이미지를 추가하여 새로운 이미지를 만드는 식으로 기능을 확장, 계층화할 수 있다. 이때 이미지를 새로 추가하거나 일부 계층만 변경될 경우 새로 설치/변경되는 부분만 추가/변경되므로 저장공간 및 네트워크 전송 시 대역폭을 절약할 수 있다.

2.2.2 도커 컨테이너

- 위와 같은 방식으로 만들어진, 도커 이미지를 기반으로 실행된 인스턴스가 도커 컨테이너다.

- 도커 컨테이너는 메모리 상에서 실행된 프로그램이므로 프로세스이다.

- 하나의 도커 이미지로부터 여러 대의 도커 컨테이너를 실행할 수 있다.

- stateful : 컨테이너를 사용하면서 컨테이너의 상태를 변경할 수 있고, 변경된 상태를 저장할 수 있다. (이미지로 만들지 않고 컨테이너를 제거하면, 제거된다.)


3. docker run 명령어 확인해보기

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[OPTIONS]를 기반으로, ~ 이미지를 실행하도록 하고 [command]를 실행하도록 한다.

실행을 마친 컨테이너는 종료된다.

 

기본적으로 docker run 명령어에 대한 사용법은 docker의 공식 레퍼런스 문서에서 제공되고 있다.

눈여겨 볼만한 주요 옵션을 몇 가지 확인해보면 다음과 같다.

 

 

1. -i, --interactive : 대화식 모드 열기

2. -t : tty(단말 디바이스) 할당

docker run -it ubuntu:22.04 /bin/bash

 

-it 옵션은 주로 위와 같이 같이 붙여서 사용하여, 셸에 접속할 때 사용한다.

 

이 명령에서는  터미널을 통해 접속하여 /bin/bash 명령을 실행했으므로 실시간으로 도커 컨테이너의 터미널을 통해 명령을 전달할 수 있다.

 

3. -d : 백그라운드에서 컨테이너 실행 후 컨테이너 ID를 출력

docker run -d -t ubuntu:22.04
  • 기본적으로 컨테이너를 실행하고, 빠져나가면 컨테이너가 종료된다.
  • 백그라운드에서 계속 실행되어야할 때가 있는데 이럴 경우 -d 옵션을 붙여주면 된다.
  • 웹 서버와 같이, 백그라운드에서 계속 운영하는 애플리케이션을 동작 시킬 경우 이 옵션을 사용하면 된다. 

 

4. --rm : 컨테이너 종료 시 자동으로 컨테이너 제거

5. -v : 호스트 경로, 컨테이너 경로의 공유 볼륨 설정 (이후 별도로 다룰 예정이다.)

6. -p : 호스트 포트 - 컨테이너 포트 연결 (이후에 별도로 다룰 예정이다.)

7. -env : 컨테이너의 환경 변수 지정(이후 글에서 추가적으로 다룰 예정이다.)


 

Comments