일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스
- docker
- 자바
- 백준
- 네트워크
- 데이터베이스
- 도커
- 스프링부트
- CI/CD
- restControllerAdvice
- yaml-resource-bundle
- 트랜잭션
- 국제화
- Effective Java
- 벨먼-포드
- http
- HandlerExceptionResolver
- Spring
- 메시지
- 파이썬
- java
- JIRA
- AWS
- 스프링
- 토이프로젝트
- 커스텀예외
- 이펙티브 자바
- http 완벽가이드
- githubactions
- kotlinglogging
- Today
- Total
땃쥐네
[Docker] docker run : 도커에서 컨테이너 실행 본문
이번 글에서는 도커 이미지로 컨테이너로서 실행시키는 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 : 컨테이너의 환경 변수 지정(이후 글에서 추가적으로 다룰 예정이다.)
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 컨테이너 상태 (0) | 2022.12.21 |
---|---|
[Docker] 도커 이미지를 빌드하는 기본적인 방법 (0) | 2022.12.04 |
[Docker] 도커 허브에서 이미지를 가져와 실행하기 (0) | 2022.12.04 |
[Docker] 도커 설치 (0) | 2022.12.02 |
[Docker] 도커 소개, 도커의 필요성 (0) | 2022.12.02 |