티스토리 뷰

이 글은 쉽게 이해하고 설명하기 위해 의도적으로 왜곡한… 혹은 몰라서 왜곡된… 내용을 포함하고 있다.

잘못된 부분에 대한 지적질이나 더 쉽게 이해하고 설명할 수 있는 제안은 언제든지 환영이지만, 진실을 향한 열정(?)은 참아주시길…

진실을 알고 싶은 분들을 위해서 곳곳에 진실로 가는 링크를 걸어두었지만… 때론… 저 너머에 있는 진실을 모르는 편이 나을 수도…(먼산)


(나름대로) 용어 정리

  1. 도커(docker)리눅스 컨테이너(linux container; LXC)를 관리하는 도구(tool)다.
  2. 도커 컨테이너(docker container)는 도커가 관리하는 리눅스 컨테이너 프로세스다. 기술적으로는 가상머신(virtual machine; vm)이 아니다. 그렇지만 초(!)경량 가상머신이라고 생각하면 이해하기 쉽다.
  3. 도커 호스트는 하나 이상의 도커 컨테이너를 실행하는 리눅스 머신이다. 쉽게 말해 도커 서버다.
  4. 도커 데몬은 도커 호스트에서 실행하면서 도커 클라이언트의 요청을 받아 도커 컨테이너를 실행/종료/관리한다. 쉽게 말해 도커 서버 프로세스다.
  5. 도커 클라이언트docker 명령을 실행하는 머신이다. 쉽게 말해 바로 앞에 있는 머신/프로그램이다. 도커 클라이언트는 도커 호스트와 다른 머신일 수 도 있고, 리눅스가 아니어도 된다.
  6. 도커 이미지는 도커 컨테이너의 초기 상태를 기록한 파일이다. 말하자면 파일시스템을 효율적으로 압축한 파일이다(iso 파일처럼). 도커 이미지는 버저닝되며(git commit처럼), 상속되며(git branch처럼), 원격에 보관할수도 있고(git push처럼), 원격에서 내려받을 수도 있다(git pull처럼).
  7. 도커 허브는 수많은 개발자들이 다양한 도커 이미지를 올리고/받고/검색할 수 있는 공식 도커 이미지 저장소(repository)다.

백문이 불여일견! 내가 좋아하는 화이트페이퍼 스타일(?)로 그려보면:


docker 명령 요약

옵션없이 docker를 실행해보면 사용할 수 있는 커맨드 목록을 포함한 뻔한~ 도움말이 나온다:

$ docker
Usage: docker [OPTIONS] COMMAND [arg...]
 -H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use
A self-sufficient runtime for linux containers.
Commands:
    attach    Attach to a running container
...

옵션없이 커맨드만 지정해서 docker를 실행해보면 해당 커맨드의 뻔한~ 도움말이 나온다:

$ docker run
 Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
  -a, --attach=[]            Attach to stdin, stdout or stderr.
...


도커 데몬 실행(도커 호스트에서만)

$ docker -d ...

대부분 도커 호스트가 부팅될 때 자동으로 도커 데몬이 실행되므로 추가 설정은 필요없다.

도커 호스트와 도커 클라이언트가 다른 머신(진짜든 가짜든)이라면 tcp 소켓으로 요청을 받을 수 있도록 추가 설정이 필요한데, 이건 호스트의 리눅스 배포판에 따라 다르니까… 생략.


도커 호스트 지정(도커 호스트의 별도의 머신(진짜든 가짜든)일 경우에만)

매번 -H 옵션을 사용하거나:

$ docker -H tcp://192.168.xxx.xxx:2375 ...

한 번만 DOCKER_HOST 환경 변수를 잡아줘야 한다:

$ export DOCKER_HOST="tcp://192.168.xxx.xxx:2375"
$ docker ...


컨테이너 관리


컨테이너 목록 보기

실행 중인 컨테이너만 보려면:

$ docker ps

중지된(그러나 아직 삭제되지 않아서 다시 시작할 수 있는) 컨테이너도 보려면:

$ docker ps -a


새 컨테이너 실행

새 장비를 구매해서, 미리 만들어둔 이미지를 설치하고, 전원을 켜는 거다.

$ docker run [options] <image> [command] [args...]

예: 도커 이미지 저장소가 제공하는 공식 nginx 이미지를 탑재한 컨테이너를 실행. 도커 호스트(192.168.xxx.xxx)의 8080 포트를 nginx 컨테이너의 80 포트로, /www 디렉토리를 /usr/local/nginx/html 디렉토리로 매핑.

$ mkdir -p /www ; echo 'hello' > /www/index.html
$ docker run -d -p 8080:80 -v /www:/usr/local/nginx/html:ro nginx
29940322a6c69aafe14dc58d608b3e43ff6043b698e3a4e334f9b067289d00db
$ docker ps
CONTAINER ID  IMAGE         COMMAND  CREATED        STATUS        PORTS                 NAMES
29940322a6c6  nginx:latest  nginx    5 seconds ago  Up 8 seconds  0.0.0.0:8080->80/tcp  loving_hypatia
$ curl http://192.168.xxx.xxx:8080
hello

컨테이너를 만드는 과정은 매우 중요하다. 조만간 별도로 다룰 기회에 있을지 어떨지…

자세한 내용은 Docker Run Reference를 참조하시길…

IMHO, 컨테이너를 만드는 명령과, 시작하는 명령이 분리되지 않고 run으로 합쳐놓은 건… 좋은 선택이 아닌 듯…


(중지된) 컨테이너 시작

전원을 켜는(부팅하는) 거다.

$ docker start [options] <container...>


(실행 중인) 컨테이너 재시작

콘솔에서 Ctrl+Alt+Del 혹은 reboot하는 거다.

$ docker restart [options] <container...>


(실행 중인) 컨테이너 중지(SIGTERM)

shutdown하고 전원을 끄는 거다.

$ docker stop [options] <container...>


(실행 중인) 컨테이너를 강제 중지(SIGKILL)

강제로 전원을 끄는(플러그를 뽑아버리는) 거다.

$ docker kill [options] <container...>


(중지된) 컨테이너 삭제

서버 장비를 폐기하는 거다.

$ docker rm [options] <container...>

NOTE

뻔한 듯 뻔하지 않은 얘기를 하면… 컨테이너를 삭제(rm; 장비 폐기)하기 전에 이미지를 만들어(commit; 백업) 두지 않으면 실행(run; 장비 구입) 이후에 생긴 변경은 복구할 방법은 없다.


컨테이너/이미지의 상세 정보 조회

$ docker inspect [options] <container|image...>

예: 지정한 컨테이너의 IP 주소를 얻으려면:

$ docker inspect docker inspect --format='{{.NetworkSettings.IPAddress}}' 29940322a6c6


컨테이너의 로그 보기

$ docker logs [options] <container>

예: 지정한 컨테이너의 로그(stdout/err)를 계속 보려면:

$ docker logs -t 29940322a6c6


컨테이너의 프로세스 보기

$ docker top [options] <container> [ps option]


컨테이너의 파일시스템 변경사항 보기

$ docker diff [options] <container>


이미지 관리


(실행 가능한) 이미지 목록 보기

$ docker images [options]


도커 허브에서 이미지 검색

$ docker search [options] <term>


도커 허브에서 이미지 내려받기

$ docker pull [options] <image>

예: 도커 허브에서 nginx가 기본으로 설치되어 있는 이미지를 내려 받으려면:

$ docker pull nginx
$ docker images
REPOSITORY  TAG     IMAGE ID      CREATED      VIRTUAL SIZE
nginx       latest  61e8f94e1d65  39 hours ago 492.7 MB
...
$ docker run -d -p 80:80 nginx
...


도커 허브에 이미지 올리기

$ docker push [options] <image>

NOTE

이미지를 올리려면 도커 허브에 가입해야 한다. 공개된 이미지는 무료지만, 비공개 이미지는 유료! (맛뵈기로 비공개 이미지 한 개는 공짜)


Dockerfile로 부터 이미지 만들기

$ docker build [options] <path>

이미지를 만드는 과정은 매우 중요하다. 조만간 별도로 다룰 기회에 있을지 어떨지…

자세한 내용은 Dockefile Reference를 참조하시길…


컨테이너로 부터 이미지 만들기(snapshot)

백업!

$ docker commit [options] <container> <image>

NOTE

뻔한 듯 뻔하지 않은 얘기를 재방송하면: 컨테이너를 삭제(rm; 장비 폐기)하기 전에 이미지를 만들어(commit; 백업) 두지 않으면 실행(run; 장비 구입) 이후에 생긴 변경은 복구할 방법은 없다.


이미지 삭제

백업 디스크를 폐기한다

$ docker rmi [options] <image...>

예: 종료된 컨테이너가 사용헀던 이미지 모두 삭제

$ docker rmi $(docker ps -aq)

that’s all folks

저작자 표시 동일 조건 변경 허락
신고
Creative Commons License
댓글
댓글쓰기 폼