테키테크 TEKITECH

[Docker] 도커 엔진 실행부터 이미지로 컨테이너 실행까지 (MacOS+CLI 환경) - 2. Docker Container 생성 본문

Tech/Ops

[Docker] 도커 엔진 실행부터 이미지로 컨테이너 실행까지 (MacOS+CLI 환경) - 2. Docker Container 생성

TEKI 2021. 9. 6. 21:28

실습 계획

1. Docker Image(Ubuntu) 다운로드
2. Docker Container 생성
    2-1. 도커 이미지로 도커 컨테이너 만들기
    2-2. Docker Run 주요 옵션

3. Docker Container 사용하기

 


 

도커 이미지가 생겼으니 이제 이걸로 컨테이너를 만들어볼 차례이다.

 

1. 도커 이미지로 도커 컨테이너 만들기

도커 이미지를 run 하여 컨테이너를 만들려면 아래 명령어를 사용하면 된다.

docker run -it --name [새 컨테이너 이름] [이미지 이름 또는 ID]:[이미지 TAG]

그러면 우분투 OS가 담긴 컨테이너가 예쁘게 만들어진다.
컨테이너를 실행함과 동시에 컨테이너 내부로 들어가기 때문에 하고 싶은 것을 한 다음 exit으로 빠져나오면 된다.
OS는 뭔지, 파일시스템은 어떤 구조인지 등 컨테이너의 모양을 간단하게 확인해보았다.
컨테이너를 빠져나와서 확인해보니 컨테이너가 Exited인 상태로 남아있는 것을 확인할 수 있다.

Docker Container 정석대로 만들기

그런데 명령어가 좀 복잡하다.
옵션도 많고, 컨테이너와 이미지의 정보도 넣어주어야 한다.

각각 역할이 무엇이고, 왜 필요한지, 그리고 어떤 차이를 만들어내는지 실험해보기로 했다.

 

2. Docker Run 주요 옵션

위에서 사용한 옵션은 i,t, 그리고 name까지 세 가지이다. 이 중에서 i와 t 옵션은 컨테이너를 사용하는 거의 모든 경우 꼭 필요한 기능이기 때문에 이 둘은 도커 이미지를 실행하기 위해 필수로 설정해주어야 한다고 이야기한다.

  • -i 옵션: 터미널과 컨테이너 간의 명령 전달을 유지하기 위해 적용
  • -t 옵션: tty를 사용해서 bash를 사용할 수 있도록 하기 위해 적용
  • --name 옵션: 컨테이너의 이름을 지정해주기 위해 사용

그 외에도 백그라운드에서 실행할 때 사용하는 -d옵션 등 다양한 옵션들이 있다. 이건 나중에 필요할 때 구글링하도록 하자. 오늘은 이 세 가지 옵션을 빼고 컨테이너를 만들면 어떻게 되는지 하나씩 시도해보았다.

 

[1] i 옵션 없이 컨테이너 만들기

i 옵션은 터미널과 컨테이너 간의 명령 전달을 유지하도록 설정한다고 했다. 즉, i 옵션 없이 컨테이너를 만든다면, 컨테이너 내에서 입력하는 그 어떠한 명령도 도커 데몬으로 전달되지 않을 것이다. 실제로 컨테이너에서는 아무런 입력도 되지 않았다. exit을 하지 못해서 컨테이너를 실행시킨 프로세스를 종료해주었다.

i 옵션을 주지 않으면 터미널에서는 아무것도 할 수 없다!

도커 컨테이너는 호스트OS 입장에서는 하나의 프로세스이다. 즉, 도커 컨테이너를 실행하는 프로세스를 종료하면 이렇게 에러가 난 컨테이너를 끌 수 있다. 컨테이너를 실행하는 프로세스는 프로세스 목록에서 컨테이너를 실행하면서 사용한 컨테이너나 이미지의 이름을 검색하면 쉽게 찾을 수 있다. 단, 프로세스 kill은 실행 중인 컨테이너를 강제로 종료시키지만, 컨테이너 자체를 삭제해주지는 않는다. 

ps -ef | grep "my_ubuntu_without_i"
kill -9 [프로세스 ID]

 

[2] t 옵션 없이 컨테이너 만들기

t 옵션은 bash를 사용할 수 있게 한다고 하지만 이 옵션이 빠지면 어떤 실행 결과가 나올 지 예상할 수 없었다. 막상 실행해보니 재미있는 결과가 나왔다.

bash로 접근하지 못하는 컨테이너

위 터미널은 컨테이너를 생성한 것인데 아무런 결과가 나타나지 않았다. 그래서 아래에 터미널을 하나 더 켜서 확인해보았더니 컨테이너는 잘 생성되었고, 계속 실행되고 있었다. ([1]번 컨테이너는 아직 돌고있다). 이 옵션을 필수가 아닌 옵션으로 둔 이유가 무엇인지 궁금해졌다. 다음 실습 시간에 이 컨테이너를 사용하는 방법을 찾아봐야겠다.

아까 캡쳐를 못해서 이번에 프로세스 kill에 대한 내용을 조금 추가하려고 한다. 컨테이너를 실행하면 두 가지 프로세스가 실행된다. 하나는 명령어를 입력하여 전달하는 프로세스(10975)이고, 다른 하나는 실제로 컨테이너를 실행하는 프로세스(10978)이다. 두 가지 프로세스가 어떻게 생겼는지 궁금하니까 캡쳐해보았다.

프로세스 kill

10978만 kill 해도 명령 프로세스는 해야할 일을 다 했기 때문에 알아서 종료된다.

  

[3] name 옵션 없이 컨테이너 만들기

이 옵션은 비교적 직관적이다. 바로 시도해보았다.

내가 아는 hertz(car rental 업체)는 전혀 elegant하지 않다

 

이상한 이름이 생겼다. 한 번 더 시도해보았다.

 

 

 

작명이 세상에서 제일 어려운 개발자를 배려하는 친절한 도커.

 


새로 알게 된 내용

도커 컨테이너는 프로세스이다
필수 옵션 없이 도커 컨테이너를 만들어보면서 프로세스 Kill을 통해 컨테이너를 종료시켜보았다.
이 과정을 통해서 도커 컨테이너가 프로세스라는 개념을 명확하게 이해할 수 있었다.
이에 대해 더 찾아보다가 도커에 대해 고민한 내용을 적은 블로그를 통해 좀 더 잘 이해할 수 있었다.
참고 >> 개발자가 처음 Docker 접할때 오는 멘붕 몇가지

막혔던 문제와 해결 방법

X

더 공부해볼 문제

도커는 어떻게 이름을 짓는걸까? vocabulary list를 두고 조합하는거면 단어가 몇 개나 있을까?

고민해볼 문제

X

오늘의 생각

리눅스는 재미있다.
도커도 재미있다.

반응형
Comments