[ Docker ] Container & Image

dev_taehyun·2020년 9월 28일
0

Docker

목록 보기
2/2
post-thumbnail

[ Docker ]

본 글은 [ 시작하세요! 도커 / 쿠버네티스 ] 저서를 참고로 작성하였습니다.

Client & Server

도커를 설치하고 docker version 이라는 명령어를 한 번 입력해보자. 그러면 아래 이미지와 같은 내용을 확인할 수 있다. 특이한 점은 ClientServer 로 나뉜다는 점인데 이는 앞선 기본 개념에서 설명했던 것처럼 클라이언트에서 서버에 명령을 전달하면 서버가 이를 실행시킨다는 것을 알 수 있다. ( docker version 명령어는 dockver -v 와 다르다. -v 옵션의 경우 단순히 도커의 버전만 알려줄 뿐 clientserver 에 대한 개별적인 정보는 제공해주지 않는다.)

Container & Image

이제 docker run 명령어를 통해 컨테이너를 생성해보자. ubuntu:19.10 는 컨테이너를 생성하기 위한 이미지 이름을 의미한다. 다시 말하자면 docker run unutun: 19.10 이라는 명령을 통해 ubuntu:19.10 이미지를 가진 컨테이너를 생성한 것이다. 이에 대한 출력물을 자세히 살펴보면 우선 첫 줄에 Unable to find image 'ubuntu:19.10' locally 라는 문장을 볼 수 있다. 이는 생성하려는 ubuntu: 19.10 이라는 이미지가 로컬 도커 엔진에 존재하지 않기 때문이다. 따라서 도커 허브에서 자동으로 이미지를 내려받아 만들게 된다.

이제 다시 한 번 docker run 명령어를 통해 만든 컨테이너로 접속해보자. docker run -i -t ubuntu:19.10 /bin/bash 명령을 통해서 이미 만든 ubuntu:19.10 에 접속하여 bash 쉘을 사용하는 방법이다. -i 옵션의 경우 ineractive를 의미하는 것으로 표준 입력(STDIN)을 가능하게 해주고 -t 옵션의 경우 PTY(Pseudo TTY)를 설정해준다. 따라서 -i-t 옵션을 통해 입출력이 가능하게 해준다. 접속 이후 ls 명령어를 통해 확인해보면 아무것도 설치되어 있지 않다는 것을 알 수 있다. 이후 exit 를 통해 쉘을 종료하고 docker ps 명령어를 통해 동작 중인 컨테이너를 확인해보면 아무 것도 없는 것을 알 수 있다. (이때 -i , -t 옵션은 합쳐서 -it 로 사용할 수 있다. 그리고 /bin/bash 를 입력하지 않아도 내장되어 있기 때문에 run 했을 때 자동으로 bash 쉘을 사용할 수 있다.)

PTY(Pseudo TTY): 외부의 원격 접속을 위한 가상 콘솔을 의미한다. 참고로 TTY는 TeleTypeWrite의 준말이다.

exit 명령어를 사용했을 때 우리는 컨테이너가 자동으로 종료되는 것을 확인했다. 그렇다면 자동으로 종료되지 않게 하기 위해서는 어떻게 해야 할까? Ctrl + p 를 누른 다음 q 를 누르면 종료되지 않고 유지된다. 이후 docker ps 를 통해 확인해보면 컨테이너가 종료되지 않고 동작하고 있는 것을 확인할 수 있다. 여기서 주의할 점은 다시 해당 컨테이너에 들어가서 그 컨테이너를 유지하면 하나의 컨테이너만 동작하는 것이 아니라 두 개의 컨테이너 모두 독립적으로 동작하고 있다는 점이다. 따라서 아래 이미지처럼 docker ps 를 통해 확인해보면 51 로 시작하는 컨테이너 하나와 82 로 시작하는 컨테이너 하나가 독립적으로 동작하고 있다는 것을 알 수 있다. 동작 중인 컨테이너는 docker kill 명령을 통해 종료시킬 수 있다.

그렇다면 run 을 통한 접속 말고는 컨테이너에 접근할 방법이 없는 것일까? 우선 새로운 컨테이너 하나를 생성하자. 이번에는 docker pull 명령어를 통해 가장 최신의 우분투 이미지를 받아왔다. ubuntu 라는 이름의 이미지 뒤에 latest 태그를 통해 최신 버전을 받아올 수 있다. (콜론( : ) 뒤에 오는 것을 태그라 부른다.) 그 다음 docker images 명령을 통해 생성된 이미지들을 확인할 수 있다. 앞서 만든 ubuntu:19.10 과 방금 만든 ubuntu:latest 가 존재하는 것을 볼 수 있다. 이후 docker create -it 명령을 통해 ubuntu:latest 라는 이미지를 가진, 입출력이 가능한 컨테이너를 만든다. 이전에 만든 ubuntu:19.10 이미지를 가지고 있는 컨테이너의 경우 별도의 이름을 지정해주지 않았지만 이번에는 --name 옵션을 통해서 컨테이너의 이름을 ubuntu 라 지정해주었다. 이후 docker startdocker attach 를 통해 컨테이너를 실행시키고 내부로 들어갔다. 컨테이너를 정지시킨 이후 docker ps 를 통해 확인해보면 ubuntu 라는 이름을 가진 컨테이너가 동작 중인 것을 알 수 있다. 굳이 run 명령어를 사용하지 않더라도 pull , create , start , attach 과정을 통해서 해당 컨테이너에 접속할 수 있지만 아무래도 run 명령어를 사용하는 것이 훨씬 간단하니 앞으로는 run 을 쓰자!

이제 docker ps 명령어에 -a 옵션을 추가하여 정지된 컨테이너를 포함한 모든 컨테이너를 확인해보자. 우선 여기서 몇 가지 사항을 확인해보고 넘어가자.

  1. CONTAINER ID: 컨테이너에게 자동으로 할당되는 고유한 ID다. 이때 ID는 무작위 16진수 해시값으로 이뤄져 있는데 ps 명령을 통해서는 그 일부분만 확인할 수 있어 docker inspect 명령어를 통해 전체 ID를 확인할 수 있다.
  2. IMAGE: 컨테이너를 생성할 때 사용된 이미지의 이름이다.
  3. COMMAND: 컨테이너가 시작될 때 실행될 명령어다. /bin/bash 가 내장되어 있기 때문에 굳이 /bin/bash 를 매번 적어주지 않아도 바로 bash 쉘을 사용할 수 있는 것을 알 수 있다.
  4. STATUS: 컨테이너의 상태를 확인할 수 있다. Up 의 경우 현재 실행 중인 컨테이너, Exited 의 경우 종료, Pause 의 경우 일시 중지된 상태를 의미한다.
  5. PORTS: 컨테이너가 개방한 포트와 호스트에 연결한 포트를 보여준다.
  6. NAMES: 컨테이너의 이름을 보여주는데 --name 옵션을 사용하지 않을 경우 임의로 형용사와 명사를 조합해 이름을 설정한다.

컨테이너는 dokcer rm 명령어를 통해 삭제할 수 있는데 이때 뒤에 해당 컨테이너의 ID 또는 이름을 적어주면 된다. 아래 이미지를 통해 kind_edison 이름의 컨테이너가 정상적으로 삭제된 것을 알 수 있다.

컨테이너를 하나씩 지우기 귀찮을 수 있다. 이럴 때는 docker container prune 명령어를 통해 모든 컨테이너를 한 번에 삭제할 수 있다. 그런데 다시 docker ps -a 를 통해 컨테이너를 확인해보니 아까 실행 중이었던 컨테이너가 지워지지 않은 것을 알 수 있다. 도커에서는 동작 중인 컨테이너를 삭제할 수 없기 때문이다. 따라서 우선적으로 동작을 멈춰야 한다.

dokcer ps 명령어에 -q 옵션을 붙이면 컨테이너의 ID만 보여준다. docker stop 명령어를 통해서 컨테이너를 중지시키고 다시 docker rm 명령어를 통해 해당 컨테이너를 정상적으로 삭제했다. 이때 뒤에 $(docker ps -a -q) 명령어를 붙여줌으로서 컨테이너의 ID만 보이게 하였다. 물론 이렇게 중지시키고 삭제하는 방법 외에도 단순히 -f 옵션을 통해 강제로 삭제할 수도 있다.

profile
글 쓰는 개발자입니다.

0개의 댓글