Docker Remote API 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

Docker는 데몬과 클라이언트 간의 통신을 할 때 로컬에서는 유닉스 소켓을 사용하고, 원격에서는 TCP 소켓을 사용합니다. 여기에 HTTP REST 형식으로 API가 구현되어 있습니다. 따라서 API가 특정 언어에 종속되어 있지 않고, 다양한 언어에서 사용할 수 있습니다.

먼저 기존의 Docker 데몬을 정지하고 TCP 소켓으로 다시 실행시켜 API를 테스트해보겠습니다.

$ sudo service docker stop
$ sudo docker -d -H tcp://0.0.0.0:4243

docker -d -H tcp://0.0.0.0:4243 형식입니다. -d 옵션을 사용하여 데몬 모드로 실행하고, -H 옵션을 사용하여 접속을 받을 IP 주소와 포트 번호를 설정합니다. Docker 데몬의 기본 포트 번호는 4243입니다.

명령을 실행하면 Docker 데몬이 foreground로 실행됩니다. 따라서 테스트를 위해 새 터미널을 실행합니다.

Docker Remote API는 HTTP REST 형식이므로 curl 명령으로 손쉽게 사용할 수 있습니다. 먼저 nginx 이미지를 받습니다.

$ curl -X POST http://127.0.0.1:4243/images/create?fromImage=nginx:latest
  • -X: POST 메서드를 사용하도록 설정합니다.
  • 이미지를 받는 Remote API는 /images/create?fromImage=<이미지 이름>:<태그>입니다.

받은 nginx 이미지로 컨테이너를 생성합니다.

$ curl -X POST -H "Content-Type: application/json" \
    -d '{ "Image":"nginx:latest", "ExposedPorts":"80/tcp" }' \
    http://127.0.0.1:4243/containers/create
{"Id":"386147f1c71ca7ee6a7013dbd2fff5d3091e41268885f954046be964b9ade39e","Warnings":null}
  • -X: POST 메서드를 사용하도록 설정합니다.
  • -H: Content-Type을 application/json으로 사용하도록 설정합니다.
  • -d: 컨테이너를 생성하기 위해 설정 데이터를 보냅니다. 여기서는 Imagenginx:latest를 설정하였고, 호스트에 포트를 연결하기 위해 ExposedPorts80/tcp를 설정하였습니다.
  • 컨테이너를 생성하는 Remote API는 /containers/create입니다.

컨테이너가 생성되면 컨테이너 ID가 출력됩니다.

이제 생성된 컨테이너를 시작합니다.

$ curl -X POST -H "Content-Type: application/json" \
    -d '{ "PortBindings": {"80/tcp": [{ "HostPort": "80"}]} }' \
    http://127.0.0.1:4243/containers/386147f1c71c/start
  • -X: POST 메서드를 사용하도록 설정합니다.
  • -H: Content-Type을 application/json으로 사용하도록 설정합니다.
  • -d: 컨테이너의 80번 포트를 외부에 노출합니다. 여기서는 PortBindings{“80/tcp”: [{ “HostPort”: “80”}]}를 설정하였습니다.
  • 컨테이너를 시작하는 Remote API는 /containers/<컨테이너 ID>/start입니다. 컨테이너 ID는 앞에서 컨테이너를 생성할 때 출력된 값을 사용합니다(12자리).

컨테이너 목록을 출력합니다.

$ curl http://127.0.0.1:4243/containers/json
[{"Command":"nginx","Created":1409246048,"Id":"386147f1c71ca7ee6a7013dbd2fff5d3091e41268885f954046be964b9ade39e","Image":"nginx:1","Names":["/angry_bartik"],"Ports":[{"IP":"0.0.0.0","PrivatePort":80,"PublicPort":80,"Type":"tcp"}],"Status":"Up 6 seconds"}

컨테이너 목록을 출력하는 Remote API는 GET 메서드에 /containers/json입니다. 정지된 컨테이너까지 출력하려면 /containers/json?all=1처럼 all=1을 붙여주면 됩니다.

이처럼 HTTP 메서드를 이용하여 Docker 데몬을 제어할 수 있습니다. HTTP REST 형식으로 된 Remote API를 그대로 사용하여 구현하는 일은 드물 것이라 생각됩니다. 또한, Remote API는 빠르게 업그레이드되고 있기 때문에 전체 API는 책에 담지 않았습니다. Remote API 목록은 다음 URL을 참조하기 바랍니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014