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

업데이트:

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

참고링크

운영체제 프론트엔드 백엔드 데이터베이스 인프라
리눅스구조 js필터 아파치에러로그 행삭제 아파치스쿱
프로세스 헬로월드 웹서버개념 ES기초 로그분석
네임스페이스 프로젝트생성 아파치설치 MySQL기초 beeline
디렉토리 헤더생성 flask연동 큐브리드 하둡기초
리다이렉션 async-get 장고MsSQL연결 null공백 나이파이
쓰레드 async-post 장고MySQL연결 MySQL설치(win) 백본
라즈베리파이설치 로그인페이지 장고inpectdb MySQL테이블생성 제플린
OSI7계층소개   장고read   SSL인증
OSI1계층   장고insert   커버로스
OSI2계층   장고put   도커개념
OSI3계층   장고del   도커설치
OSI4계층   flask한글요청   도커기초
OSI5,6,7계층       도커이미지
DNS서버       컨테이너네트워크
DHCP       도커API
bashrc       도커컴포즈
bash       도커볼륨
ifconfig       장고이미지
소켓프로그래밍       도커postgre
리눅스유저생성       도커이미지삭제
netstat포트열기       도커Redis
컴파일러       k8s구조
운영체제vs커널       k8s설치
작업스케쥴링       k8s서비스배포
디스크추가       POD네트워크
aws유저추가       퍼시스턴트볼륨
기초명령어       k8s에러
포트번호        

참고 링크

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 셸’입니다.

참고: 도커 컨테이너 모두 삭제

읻단 컨테이너가 무엇무엇이 있는지 알아보겠습니다.

$ docker container ls -a
CONTAINER ID   IMAGE           COMMAND    CREATED      STATUS                    PORTS     NAMES
26fcb671e9ef   ubuntu          "bash"     4 days ago   Exited (127) 4 days ago             distracted_shannon
2865c136227b   my-ubuntu:0.1   "bash"     4 days ago   Exited (0) 4 days ago               focused_gates
78fdc2bab0f0   ubuntu          "bash"     4 days ago   Exited (0) 4 days ago               gifted_sutherland
c08f31b6e454   ubuntu          "bash"     5 days ago   Exited (137) 5 days ago             keen_moore
3439fbf4ca04   2dc39ba059dc    "bash"     5 days ago   Exited (0) 5 days ago               relaxed_wilbur
ac7544a4c067   hello-world     "/hello"   5 days ago   Exited (0) 5 days ago               loving_beaver

위 코드는 컨테이너 리스트를 출력한 결과입니다. 우리가 원하는 것은 위 결과에서 containerID만 필요합니다. 이를 위해 다음과 같이 입력합시다.

$ docker container ls -aq
26fcb671e9ef
2865c136227b
78fdc2bab0f0
c08f31b6e454
3439fbf4ca04
ac7544a4c067

위 코드를 보면 컨테이너ID만 출력되는 것을 알 수 있습니다. 우리는 위 컨테이너를 모두 지우고 싶습니다. 그러면 다음과 같이 입력합시다.

$ docker container rm -f $(docker container ls -aq)
26fcb671e9ef
2865c136227b
78fdc2bab0f0
c08f31b6e454
3439fbf4ca04
ac7544a4c067

자 이제 컨테이너가 모두 지워졌습니다.

$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

컨테이너 리스트를 확인하면 깨끗하게 모두 지워진 것을 볼 수 있습니다.