[Infra] 도커(docker)(2) 컨테이너 조작 기초(pull, run, ps)
업데이트:
도커(docker)(2) 컨테이너 조작 기초(pull, run, ps)
참고링크
참고 링크
- (0)도커의 개념
- (1)도커 설치하기, hello world!
- (2)도커 컨테이너 조작 기초(pull, run, ps)
- (3)도커 이미지 변경 후 저장(commit)
- (4)도커 컨테이너 네트워크
- (5)도커 API 이미지 빌드 및 컨테이너 실행
- (6)도커 컴포즈를 활용한 여러 개의 Flask, Nginx 배포
- (7)도커 볼륨을 이용한 데이터 관리
- (1)쿠버네티스 구조
- (2)쿠버네티스 설치
- (3)쿠버네티스 서비스 배포하기
- (4)컨테이너 IP와 파드 IP의 관계
- (5)퍼시스턴트 볼륨 스토리지
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
컨테이너 리스트를 확인하면 깨끗하게 모두 지워진 것을 볼 수 있습니다.