본문 바로가기
320x100
320x100

Docker Desktop을 받으면 일단 기본적으로 docker, docker-compose, docker machine이 설치가 된다

그래서 docker 명령어를 쓸 수 있다

 

도커 desktop을 실행 후 터미널을 열어서 docker를 입력해보자

이제 도커(2)번 글에서 입력했던 Docker Hub에서 도커 이미지를 받아서 실행시켜보는 것을 해본다

도커 도움말 보기

docker --help

 

간단한 명령어 및 복잡한 명령어들이 나온다

 

도커 이미지 검색

docker search --help

보통 명령어에 나오는 [ ] 는 필수값이 아닌 options를 의미한다(없어도 된다는 의미)

그래서 우리가 원하는 우분투 이미지를 검색해보자

docker search ubuntu

라고 입력

우분투와 관련된 이미지 목록들이 뜨고, 공식적으로 해당 제조사가 만든 이미지라면 OFFICIAL에 [OK] 표시가 있고, 특정 유저 혹은 개인이 만든 이미지라면 아무 표시도 없다 이것을 잘 보고 판단하도록 하자

우리가 어떤 라이브러리를 도입할때, 깃허브에서 official인지, star개수, 최근 commit 날짜 등을 보곤 한다 그거와 관련해서 잘 보고 다운받자

 

도커 이미지 받기

docker pull --help

우분투이미지를 받아본다

맨 끝에 태그명을 생략하면 latest 버전을 받는다

docker pull ubuntu

이미지를 다 다운받으면 이미지 취약점 및 권장 사항을 볼 것인지 명령어가 뜬다 => 생략하자

 

도커 이미지 다운로드 목록 확인

도커 이미지가 잘 받아졌나 확인해보자

docker images --help

docker images

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

이제 이 우분투 이미지로 컨테이너를 만들어보자

docker create --help

docker create ubuntu

컨테이너를 만들면 고유한 CONTAINER ID를 반환해준다

또한 컨테이너 이름을 지정하지 않으면 알아서 자동으로 만들어준다

도커 컨테이너 확인

컨테이너가 만들어졌나 확인해보자

docker ps --help

docker ps

아무것도 뜨지 않는다. 이유는? 저 위에 스크린샷의 -a, --all 설명을 보면 (default shows just running)이라고 써 있다

우리는 컨테이너를 만든거지, 실행을 한건 아니기때문이다

docker ps -a

같은 ubuntu 이미지로 컨테이너를 하나 더 만들어서 확인해보자

docker create ubuntu
docker ps -a

컨테이너 이름으로 아무거나 생긴게 웃긴다..ㅎ

STATUS를 보면 Created라고 떠 있다

이제 컨테이너를 실행시켜보자

도커 컨테이너 실행

docker start --help

만들어진 도커 컨테이너를 실행시키는 명령어이다

추후에 나올 docker run 명령어와의 차이점은 [run] 명령어로 새 컨테이너를 만들고 시작하면, 이전 컨테이너의 기타 설정이 날라가는 데 반해, start는 단순히 컨테이너를 시작하는 명령어이다

docker ps -a
docker ps -a | grep "thirsty" | awk '{print $1}'
docker start $(docker ps -a | grep "thirsty" | awk '{print $1}')

grep은 regex를 지원하며 awk는 필터링된 결과의 n번째 칼럼을 출력하는 역할을 한다

하지만 이 ubuntu 컨테이너는 실행하고 바로 종료된다(Exited)

컨테이너는 지정된 프로세스를 실행하는 것을 기본적으로한다.

왜냐하면 기본적으로 컨테이너가 띄워질때는 CMD 또는 ENTRYPOINT로 명령을 전달하지 않는다면, 주입된 명령어가 없기 때문에 바로 종료된다

 

이번에는 container id가 아닌 container name으로 실행시켜보자

컨테이너는 곧바로 종료된다. 그럼 어떻게 계속 실행되는 컨테이너를 만들 수 있을까?

1. 우분투를 일단 계속 실행되게 하고 내부적으로 exec 명령어로 /bin/sh를 실행하거나

2. 컨테이너를 만들 때 CMD또는 ENTRYPOINT 스크립트를 지정해주거나

3. docker run명령어로 실행할때 it옵션을 줘서 /bin/bash 인자를 전달해주면 된다

일단 1번 방식으로 우분투를 계속 띄워지게 만들어보자. 이번에는 헷갈리지 않게 컨테이너 이름도 지정해주자(ub-loop)

그리고 컨테이너를 실행시킨 후(start), docker 컨테이너 프로세스 목록을 조회해 보자

docker create --name ub-loop ubuntu /bin/sh -c "while true; do sleep 1; done"
docker start ub-loop
docker ps -a

여기에서 /bin/sh에 -c를 주면 ;를 구분자로 해서 여러 명령을 순차적으로 넘길 수 있다

이번에는 기존 컨테이너와 다르게 STATUS가 Up 이라고 떠 있다!!

컨테이너 내부로 명령어를 전달해보자

(실행중인) 도커 컨테이너에 명령어 전달(실행)

컨테이너 내부로 ls 명령어를 전달해 실행시켜보자

docker exec -it ub-loop ls

이번에는 대화형 쉘을 사용해서 내부로 한번 진입해서 명령어를 실행해보자

docker exec -it ub-loop /bin/bash
> echo hello
> ls
> ls -alh

* 컨테이너가 도커에서 실행되고 있음을 알리는 마커파일인 .dockerenv파일도 확인할 수 있다

컨테이너 외부로 나가려면 exit를 입력하면 된다

 

(실행중인) 도커 컨테이너 종료

docker ps -a
docker stop ub-loop
docker ps -a

전부 다 Exited 상태가 돼서 종료된 것을 볼 수 있다

근데 이렇게 실행중이지도 않은 도커 컨테이너들이 여러개 떠 있으면 보기 싫지 않은가?

그럼 사용하지 않는 컨테이너를 삭제시켜보자

 

도커 컨테이너 삭제

종료된(stop) 컨테이너만 지울 수 있으며(rm-remove), -f옵션을 주면 실행 중인 컨테이너를 종료하고, 삭제한다

테스트해보자

docker ps -a
docker rm ub-loop
docker ps -a

컨테이너가 삭제되서 3개가 2개로 된 것을 볼 수 있다

 

도커 컨테이너 생성/실행 & 명령어 전달/실행 1큐에

지금까지 한 작업은 컨테이너를 만들고, 컨테이너를 실행하고, 명령어를 전달하는 과정을 step by step으로 했다

이 모든 과정을 docker run 명령어로 1번에 가능하다

물론 컨테이너가 뜨는 의의는 계속 돌아가야하는 인스턴스(서버, DB)를 제외하고는 인자로 받은 명령(CMD)를 처리하면, 종료되게 되어있다는 점을 기억하자

docker run --help

run 명령어의 경우에는 워낙 많은 옵션들이 있어서, 옵션 설명만 해도 한 포스팅이 될 정도다

 

- 그냥 실행

docker run -it ubuntu /bin/bash

- 컨테이너 이름 주고 실행

docker run -it --name test2 ubuntu /bin/bash

- 백그라운드로 실행

docker run -d -it --name test2 ubuntu /bin/bash

docker run -it ubuntu /bin/bash

터미널의 새로운 탭을 열어서(cmd + T) docker ps -a 명령어를 입력해보면 컨테이너가 실행 중인 것(UP STATUS)을 볼 수 있다

exit로 명령어를 종료하고

다시 프로세스를 확인해보면 종료가 된 것을 볼 수 있다

test2라는 컨테이너명으로 띄운다

docker run -it --name test2 ubuntu /bin/bash

test3이라는 컨테이너명으로 띄우며 백그라운드로 띄운다

docker run -d -it --name test3 ubuntu /bin/bash
docker exec -it test3 /bin/bash

exit로 나간 후에도 컨테이너는 떠있다

도커 이미지 삭제하기

사용하지 않는 컨테이너를 삭제 하는것은

docker stop [컨테이너이름/ID]
docker rm [컨테이너 이름/ID]

이었다

그럼 이미지를 삭제하는 명령어는 뭘까?

docker rmi [이미지 이름/ID]

일단 테스트 이미지를 2개 받아보자

docker pull golang

docker pull nginx

docker pull golang
docker pull nginx
docker images

golang 이미지를 제거해보자

docker images
docker rmi golang

실행되고 있지 않은 컨테이너 & 이미지 등등 한꺼번에 삭제하기

계속 작업을 하다보면 컨테이너, 이미지, 볼륨, 네트워크 등등 미사용 리소스들이 늘어난다

하나하나 이미지, 컨테이너를 지우고 있는다면.. 비효율적일 것이다

그럴때 사용할 수 있는 prune이라는 명령어가 있다

이 명령만 특별히 docker prune xxx가 아니라 docker [목표] prune 명령으로 입력하게 된다

docker [목표] prune
[목표]: container, image, volume, network, system

사용하지 않는 컨테이너, 이미지, 볼륨, 네트워크 등을 없앤다

참고로 system은  사용하지 않는 컨테이너, 이미지, 볼륨, 네트워크 등을 한번에 없애주는 명령인자다

 

일단 컨테이너부터 테스를 위해 여러개 띄워놓고, 몇개만 종료시켜본다

docker run -d -it ubuntu /bin/bash
docker run -d -it ubuntu /bin/bash
docker run -d -it ubuntu /bin/bash
docker run -d -it ubuntu /bin/bash

docker ps -a

docker stop dreamy_franklin
docker stop hardcore_brahmagupta

docker ps -a

종료된  dreamy_franklin, hardcore_brahmagupta, nice_sinoussi 컨테이너가 사라지길 기대해본다

docker container prune

실행중인 컨테이너를 제외한 나머지가 삭제된 것을 볼 수 있다

그럼 이미지들도 테스트해보자

docker ps -a
docker images

nginx와 ubuntu 이미지를 기반으로 한 컨테이너를 몇개 띄웠다

그리고 docker image prune을 하면 python 이미지가 지워지길 기대해본다

image prune은 build할때 이름이 붙어있지 않은 dangling된 이미지들만 삭제를 하기 때문에 컨테이너로 띄워놓지 않은 미사용 이미지들까지 지우려면 -a옵션을 주면 된다

docker image prune -a
docker images

이 모든 명령어들은 사실 docker [타겟] prune --help로 볼 수 있다

docker container prune --help
docker image prune --help
docker volume prune --help
docker network prune --help

다음 포스팅은 docker desktop(GUI)로 보는 법을 짧막하게 올리려고 한다

그리고 docker run에 관련해서는 volume, network(internal/external port), env 등등 너무나도 옵션이 다양하기에

이것도 따로 준비중이다

어차피 우리의 최종 목표는 Dockerfile 작성과 docker-compose...그리고 k8s이다!! 후훗

 

참고

도커 명령어 reference

https://docs.docker.com/engine/reference/run/

 

Docker run reference

Configure containers at runtime

docs.docker.com

 

320x100

댓글