-
Docker 사용방법 - 1. 남이 만든 이미지 써보기카테고리 없음 2019. 10. 1. 00:36
이전글 : [Docker 소개 및 설치 방법]
이전 글 에서 도커(Docker)는 무엇인지, 간단한 개념과 원리에 대해서 알아보고, 설치방법에 대해서 다뤘다. 사실 뭐든 잘 모르겠어도, 설치해보고 냅다 써보면 대충 감이 오는 경우가 많으므로, 굳이 이해 안되는거 억지로 잡고 있는 것보다 그냥 써보는 것도 좋은 방법이다. 본 포스트는 Docker Toolbox 환경에서 썻지만, 도커 명령어 관련해서는 다른 환경에서도 같으니 똑같이 따라하면 된다.
도커 이미지(Docker Image)는 컨테이너가 실행되고 동작하기 위한 파일시스템, 설정값들, 각종 라이브러리, 컨테이너가 동작하기 위한 코드 등을 엮어서 만든 파일이다. 이미지는 레이어(Layer)라는 단위로 겹겹이 쌓여있는 형태이며, 이미지를 받게되면 이미지를 동작하기 위해 필요한 레이어들을 받고, 순서대로 엮어서 하나의 이미지를 만들게 된다. 여튼 우리가 이번에 할 일은 도커 이미지를 다운받고, 컨테이너를 실행시켜 보도록 한다.
도커 명령어는 기본적으로 docker 라는 이름의 바이너리를 통해서 실행 되기때문에, 모든 도커 명령어는 "docker [옵션] 명령어" 로 이루어진다. 그리고 도커 이미지는 기본적으로 도커 허브를 통해서 공유되고, 기본 도커 명령어를 사용하면 이 허브에 있는 이미지를 가져오게 된다. 허브에 가보면 정말 많은 이미지들을 공유하고 있고, 잘만든 이미지들이 많기 때문에 필요한 것을 검색해서 사용하면 된다.
1. 이미지 받고, 실행시키기
docker pull <image>:<tag> example : docker pull ubuntu:18.04
pull 명령어는 허브에서 이미지를 로컬로 다운받는 명령어이다. 도커 이미지 이름은 <이미지명>:<태그> 의 형태이다. 태그는 이미지의 버전 관리를 위해서 주로 사용되며, 태그에 latest를 넣으면 최신 버전의 이미지를 받을 수 있다. 태그에는 숫자만 들어가는건 아니고, 일반 문자열을 넣어도 상관없다.
이미지를 받으면 [그림1]과 같이 다운로드가 되는데, 보면 하나가 다운로드 되는 것이 아니라 여러 파일이 다운로드 되는 것을 볼 수 있는데 이게 앞에서 말했던 레이어(Layer)이다. 우분투 이미지는 4개의 레이어로 구성되어 있는 것이다. 받아진 이미지를 분석해보고 싶다면 "docker inspect ubuntu:18.04" 와 같이 입력하면 해당 이미지가 어떻게 구성되어있는지 결과를 볼 수 있다.
docker run [options] <image>:<tag> [command] [args] example : docker run ubuntu:18.04 docker run -name malatto --rm –it ubuntu:18.04 /bin/bash docker run -name malatto --rm –it -v "//c/path/what/you/want/to/mount" ubuntu:18.04 /bin/bash
run 명령어는 이미지를 컨테이너로 만들고 시작(start)하는 명령어이다. pull 명령어를 쓰고 run 명령어를 실행해도 되지만, 사실 run 명령어만 실행해도 클라이언트에 이미지가 없다면 자동으로 허브에서 이미지를 다운받고 실행한다.
예제 첫 번째 명령어는 단순히 컨테이너를 실행시키기만 하고, 쉘 접속은 하지 않는다. 따로 command를 넣어주지 않으면, 컨테이너 내부에서 실행되는 프로세스가 없기 때문에 컨테이너는 바로 실행되자마자 바로 종료되버린다. 두 번째 명령어는 컨테이너를 실행시키면서, 컨테이너에 이름을 붙이고(malatto) bash 쉘을 띄워서 터미널 입력이 가능하도록 한다.
-it 옵션은 쉘을 실행시켜서 사용자 입/출력을 하기 위한 옵션이다. 컨테이너에 터미널을 붙여서, 쉘을 사용하기 위해서는 반드시 필요한 옵션이다.
--rm 옵션은 컨테이너가 종료되었을 때, 자동으로 컨테이너를 삭제한다. 컨테이너는 프로세스처럼 메모리에 상주하게 된다. 컨테이너를 종료하면, 컨테이너가 삭제되는게 아니라, 단순히 중단된 상태로 존재하게 되며, 다시 컨테이너를 시작하면, 컨테이너가 종료된 시점부터 다시 실행된다. 컨테이너가 실행되면 이미지 레이어 위에 추가로 컨테이너 실행중에 변경사항을 저장하기 위한 레이어가 올라가게 되는데, 컨테이너 실행중에만 변경 사항들이 유지된다. 만약 컨테이너 실행중에 변경된 내용들을 유지하고 싶다면 컨테이너를 삭제하면 안된다. 하지만 컨테이너를 매번 깔끔하게 실행하고 싶다면 컨테이너 종료시 자동으로 삭제되도록 --rm 옵션을 사용하면 편리하다. 하지만 중요한 데이터가 날아갈 수 있으니 정말 조심해서 사용해야 한다.
-v 옵션은 컨테이너 외부의 디렉토리를 컨테이너 안에 마운트(mount)시킬 수 있는 옵션으로, 컨테이너 내/외부에서 해당 디렉토리에 접근해서 읽거나 쓰기가 가능하다. 컨테이너가 실수로 삭제될 경우, 컨테이너 실행 중 추가된 데이터도 함께 삭제되버리기 때문에, 중요 데이터는 컨테이너 외부 디렉토리를 마운트해서 마운트된 디렉토리에 저장하는게 좋다. 또한 컨테이너 외부에서 내부로 파일을 쉽게 전달 할 수 있는 것도 편리하다.
--name 옵션은 컨테이너에 이름을 붙이는 옵션이다.
컨테이너를 실행시키면, 각 컨테이너에는 [그림2]와 같은 Container id가 부여되는데, 이 id를 이용해서 컨테이너 관리를 하게된다. 하지만 이 컨테이너 id는 매번 입력하기가 힘들기 때문에, 컨테이너에 따로 이름을 붙여주면 편하게 컨테이너를 관리할 수 있다.
이외에도 run 명령어에는 정말 다양한 옵션들이 있는데, 우선 이정도만 알아도 간단하게 사용하는데는 문제가 없다. 만약 도커를 이용해서 서비스를 구동해야할 경우 네트워크 설정이라던지, 환경변수 설정 등을 같이 해줘야 하는데 해당 내용은 추후에 다루기로 한다.
run 옵션 : https://docs.docker.com/engine/reference/run/
run 명령어를 실행하면, [그림3]과 같이 bash 쉘이 실행되면서 ubuntu 파일시스템을 사용할 수 있게 된다.
2. 이미지, 컨테이너 주무르기(시작,중단,삭제..)
docker images
현재 로컬에 있는 이미지들 정보를 출력한다.
docker ps docker ps -a
ps 명령어는 현재 실행중인 컨테이너의 정보를 출력하고, -a 옵션은 중단된 컨테이너까지 모두 출력한다.
docker stop [name or container id] docker start [name or container id] docker attach [name or container id]
start/stop 명령어는 컨테이너를 시작/중단 하는 명령어이다. --rm 명령어를 사용해서 run 한 컨테이너의 경우, stop 명령어를 실행했을 때, 컨테이너가 자동으로 삭제해버리기 때문에 주의해야한다. 컨테이너는 실행중인 프로세스가 없으면 중단(stop)되기 때문에, 이 점을 참고해서 명령어를 사용하면 된다. 예를 들어, 처음에 run으로 /bin/bash를 실행해서 쉘에 접속하고, 작업을 한 뒤, exit를 하면 /bin/bash가 종료되면서 모든 프로세스가 종료되기 때문에 컨테이너가 중단된다.
attach 명령어는 호스트의 stdin stdout stderr 를 실행중인 컨테이너에 붙이기 위한 명령어로, 호스트에서 컨테이너에 접속하기 위한 명령어로 사용된다. 예를들어, 우분투 컨테이너에서 bash 쉘이 실행중일 때, attach 명령어를 사용하면, 호스트의 터미널에서 bash 쉘에 붙게된다.
docker exec [options] name [command] example: docker exec -it cosyp /bin/bash
exec 명령어는 실행중인 컨테이너에 명령어를 전달해 실행시키는 명령어이다. 옵션은 run 명령어와 유사한 것이 많다. 하나의 컨테이너에 추가 쉘을 사용하고 싶다면 위 예시 명령어와 같이 입력하면 된다.
docker rm [name or container id] [name or container id] .. docker rmi [image id] [image id] .. docker container prune docker image prune example: docker rm -f $(docker ps -a -q) docker rmi -f $(docker images)
rm과 rmi는 각각 컨테이너를 삭제하고, 이미지를 삭제하는 명령어이다. container prune 명령어는 중지된 모든 컨테이너를 삭제하고, image prune은 모든 dangling image들을 삭제한다. dangling image는 이미지를 만들던중 실패를 했거나, 아무 컨테이너와도 연결되어있지 않은 이미지, 이미지에 이름이 없는 경우 (<none>) 등을 말하며, 이런 쓸모없는 이미지들을 한번에 삭제한다.
예제 명령어 중 첫 번째는, 실행중인, 존재하는 모든 컨테이너를 삭제하는 명령어이고, 두 번째는 모든 이미지들을 삭제하는 명령어이다.
이렇게 리눅스 이미지를 다운받아서 컨테이너를 실행시키면 되는데, 이 때 우분투 이미지는 파일시스템이 순수 그 자체이기 때문에 원래 일반적으로 리눅스를 설치하면 자동으로 설정되던 것들을 직접해줘야한다. apt의 경우 반드시 처음에 apt-get update 를 해줘야하고, 사용자 계정에서 sudo 명령어를 사용하게 하기 위해서 sudoers를 직접 등록해줘야 하는 등의 초기 작업을 해야 한다.
간단한 데모
이 정도의 명령어를 사용하면, 간단하게 도커를 사용하는데 지장은 없다. 이미지를 다운받고, 컨테이너를 실행시켜서 사용하다가, 적절히 필요에 따라 삭제해주면 된다. 이후에는 나만의 도커 이미지를 직접 만들어 보는 방법에 대해서 알아보도록 하겠다.
도커 명령어 : https://docs.docker.com/reference/