[Infra] 도커(docker)(2) 컨테이너 조작 기초(pull, run, ps)

업데이트:

도커(docker)(2) 컨테이너 조작 기초(pull, run, ps)

참고 링크

1. docker pull

먼저 레지스트리인 도커 허브(https://hub.docker.com/)에서 우분투 이미지를 다운로드 받아봅니다.

$ sudo -i
# docker pull utuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest

레지스트리에서 이미지를 pull받을 때는 ‘docker pull 리포지터리명:태그’ 형식으로 받게 되는데 이때 태그를 입력하지 않으면 가장 최근 태그인 latest 태그를 pull 받게 됩니다. 즉 위 명령어는 utuntu 이미지의 latest 태그 버전을 pull 받으라는 명령어 입니다. 그렇다면 우리가 pull 받은 우분투 이미지는 레지스트리 어느곳에 있었을까요?

우리가 받은 우분투 이미지는 위 그림과 같이 도커 허브(우분투)에 존재합니다.

2. pull 받은 이미지 확인

이번에는 우분투 이미지를 제대로 pull 받았는지 확인해 봅니다.

# docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    1318b700e415   2 weeks ago    72.8MB
hello-world   latest    d1165f221234   5 months ago   13.3kB

‘docker image ls’ 명령어를 이용하면 호스트내 이미지 정보를 볼 수 있습니다. 방금 pull 받은 우분투 이미지가 있는 것을 볼 수 있습니다. 우분투 이미지는 용량이 72.8MB인데 이는 우분투를 실행하기 위해 최소한의 파일만을 모았기 때문입니다.

3. 우분투 이미지 실행

이제 pull 받은 우분투 이미지를 실행해 봅시다.

# docker run ubuntu
#

pull 받은 이미지를 컨테이너로 실행 시키는 명령어는 ‘docker run 리포지터리:태그’ 입니다. 따라서 위와 같이 우분투 이미지를 컨테이너로 실행할 수 있는데 결과를 보면 아무런 변화가 없습니다. 우리는 우분투 이미지를 제대로 실행했을까요?

4. 컨테이너 프로세스 확인

우리가 앞서 기동시킨 우분투 컨테이너가 제대로 돌아가고 있는지 확인해 봅니다. 컨테이너의 프로세스는 다음과 같이 확인할 수 있습니다.

# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
06e767a25c9f   ubuntu        "bash"     46 seconds ago   Exited (0) 45 seconds ago             keen_noether
f6ce46163a32   hello-world   "/hello"   39 hours ago     Exited (0) 39 hours ago               peaceful_tesla

컨테이너의 프로세스는 ‘docker container ps -a’명령어로 확인할 수 있습니다. 결과를 보면 우분투가 실행이 되었었긴 했는데 STATUS를 보면 Exited (0)이라는 것을 알 수 있습니다. 즉, 우분투 이미지를 실행하자마자 바로 종료한 것을 알 수 있습니다.

5. 우분투 컨테이너 내부에서 bash shell 실행

그렇다면 우분투 이미지를 실행하지 마자 종료하지 않고 bash shell을 띄우고 우리가 컨테이너 속으로 들어갈수는 없을까요? 만약 이게 된다면 우분투 컨테이너에서 여러가지 조작을 할 수 있을 겁니다.

# docker run -it ubuntu bash
root@26bf20a27386:/# 

위와 같이 ‘docker run -it ubuntu d bash’ 명령어를 입력하면 우분투 이미지를 컨테이너로 기동시키고 bash 명령어를 실행해 bash가 실행되는 것을 볼 수 있습니다. 두번째 줄을 보면 호스트 주소가 바뀌어 있는 것을 볼 수 있습니다. 즉, 우분투 컨테이너 안으로 들어온 것입니다.

참고로 위 명령어에서 -it옵션의 의미는 다음과 같습니다.

  • -i: 키보드 입력을 컨테이너 표준 입력에 연결해 컨테이너 shell에 보냄
  • -t: 터미널을 통해 대화형 조작이 가능하게 함.
root@26bf20a27386:/# ls
bin  boot  dev  etc  home  lib ...

우분투 컨네이너 내부에서 ls 명령어를 입력하면 컨테이너에 존재하는 디렉토리를 볼 수 있습니다. 만약 컨테이너에서 빠져나오고 싶다면 exit를 입력하면 되지만 아직 입력하지 맙시다.

6. 다른 터미널 창에서 프로세스 확인

우리는 지금 우분투 컨테이너 내부에 존재합니다. 그렇다면 컨테이너 밖에서 볼 때 현재 우분투 컨테이너는 어떤 상태 일까요?

먼저 우분투 컨테이너 내부에 있는 터미널은 그대로두고 터미널을 하나 더 실행합니다.

터미널2

(터미널2)$ sudo -i
(터미널2)# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
26bf20a27386   ubuntu        "bash"     10 minutes ago   Up 10 minutes                         gifted_feynman

그리고 프로세스를 확인해보면 우리가 실행한 우분투 컨테이너가 10분전에 up되었다는 것을 볼 수 있습니다.

7. 터미널2를 이용해 터미널1에서 실행 중인 우분투 컨테이너 종료시키기

현재 상황은 터미널1에서 컨테이너가 실행 중에 있고 터미널2에서 컨테이너 프로세스를 확인했습니다. 그렇다면 터미널2에서 터미널1에서 실행중인 우분투 컨테이너를 종료시켜보겠습니다.

앞서 ps를 통해 확인한 결과 우분투 컨테이너의 ID는 26bf20a27386 였습니다. 따라서 터미널2에서 다음과 같은 명령어를 내립니다.

(터미널2)# docker stop 26bf20a27386
26bf20a27386

‘docker stop 컨테이너ID’를 입력하면 컨테이너ID에 해당하는 컨테이너를 멈출 수 있습니다. 위 코드를 보면 26bf20a27386 컨테이너가 종료된 것을 볼 수 있습니다. (참고로 강제 종료는 docker kill 컨테이너ID)

그리고 다시 터미널1로 이동하면 다음과 같이 변해 있습니다.

(터미널1)root@26bf20a27386:/# exit
(터미널1)#

즉, 터미널2에서 명령어를 내려 터미널1에 있던 컨테이너가 종료된 것입니다.

# docker container ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
26bf20a27386   ubuntu        "bash"     24 minutes ago   Exited (0) 8 minutes ago              gifted_feynman

그리고 다시 컨테이너 프로세스를 확인하면 STATUS가 Exited로 종료된 것을 볼 수 있습니다.

8. 실행 중인 컨테이너에 접속하기

이번에는 터미널1로 우분투 컨테이너를 실행하고 터미널2를 이용해 터미널 1에서 실행중인 컨테이너에 접속해 보겠습니다.

먼저 터미널1로 우분투 컨테이너를 실행합니다.

(터미널1)# docker run -it ubuntu bash
root@a3bcfa2ea0fd:/# 

그리고 이제 터미널2를 이용해 터미널1에서 실행한 컨테이너로 접속해보겠습니다. 먼저 터미널1에서 열었던 우분투 컨테이너의 컨테이너ID를 확인합니다.

(터미널2)# docker container ps -a
CONTAINER ID   IMAGE           COMMAND    CREATED              STATUS                      PORTS     NAMES
a3bcfa2ea0fd   ubuntu          "bash"     About a minute ago   Up About a minute                     naughty_moore

컨테이너ID를 확인했으면 해당 컨테이너로 접속해보겠습니다.

(터미널2)# docker exec -it a3bcfa2ea0fd bash
(터미널2)root@a3bcfa2ea0fd:/#

위 코드와 같이 실행중이 컨테이너로 접속하는 방법은 ‘docker exec -it 컨테이너ID 셸’입니다.