docker, Remote API 사용하기

샤워하다 문득, Docker도 Remote API가 있을까, 있을꺼야, 없을리가 없어라고 생각하고 찾아보았더니, Restful 형식으로 있다. 대박~… 이 의미는 원격에서 제어가 가능하고, 웹으로 관리페이지 하나 만들어서, 원격에서 container 핸들링 등을 할 수 있다는 의미다. 너무 좋아지려고 한다. ㅎ 그래서, docker를 설치하면, 기본적으로는 enable되지 있지 않지만, remote api를 열어보도록 한다.

Environment
Linux: Ubuntu 14.04
Docker: v1.5.0
IP( docker가 설치된 Server IP ): 192.168.0.11

$ sudo vi /etc/init/docker.conf
아래와 같이 추가하고, 저장하고 나온다.
DOCKER_OPTS=’-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock’

$ sudo service docker restart

나의 노트북(Win8)에서, Curl을 이용해서, Remote API로 Docker 접근하기
D:/> curl -X GET http://192.168.0.11:4243/images/json

output은 pretty하게 나오지는 않지만, pretty하게 정리하면 아래와 같이 나온다. 짜~잔… 감격… ^^

[
   {
      “Created”: 1428769336,
      “Id”: “cf37bdca4c62d05f35e3889a654e0f646960fb1484f55107aba1b99196b3a9ae”,
      “ParentId”: “5aa5bb09bfac6c5025c4fb848c75cbd54017724880207ded85d56aa0c6c42bca”,
      “RepoTags”: [
         “kevin/redis2:latest”
      ],
      “Size”: 0,
      “VirtualSize”: 211124743
   },
   {
      “Created”: 1428768000,
      “Id”: “1f27f7da1397fb81990f54ef1c882228587076946bf26b1ec2172c3008b95b3c”,
      “ParentId”: “d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07”,
      “RepoTags”: [
         “kevin/redis:init”
      ],
      “Size”: 177,
      “VirtualSize”: 188300733
   },
   {
      “Created”: 1428754141,
      “Id”: “b3fcce26a6d125634903cedd28e0d74c30a9e2c1e548cb266492e5b4dcc26d45”,
      “ParentId”: “d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07”,
      “RepoTags”: [
         “ubuntu:git”
      ],
      “Size”: 149,
      “VirtualSize”: 188300705
   },
   {
      “Created”: 1426832207,
      “Id”: “d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07”,
      “ParentId”: “9fec74352904baf5ab5237caa39a84b0af5c593dc7cc08839e2ba65193024507”,
      “RepoTags”: [
         “ubuntu:latest”,
         “ubuntu:trusty”,
         “ubuntu:trusty-20150320”,
         “ubuntu:14.04”,
         “ubuntu:14.04.2”
      ],
      “Size”: 0,
      “VirtualSize”: 188300556
   },
   {
      “Created”: 1426832162,
      “Id”: “9c5e4be642b799060baa07b826968128ff66d2ced86f6098f6d9f5845f2d35dd”,
      “ParentId”: “72dffce15bf2df5afebfbe91515463a1629dc6a9233ede1346e80cd97da606ac”,
      “RepoTags”: [
         “ubuntu:precise”,
         “ubuntu:precise-20150320”
      ],
      “Size”: 0,
      “VirtualSize”: 131886863
   },
   {
      “Created”: 1420066679,
      “Id”: “e45a5af57b00862e5ef5782a9925979a02ba2b12dff832fd0991335f4a11e5c5”,
      “ParentId”: “31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d”,
      “RepoTags”: [
         “hello-world:latest”
      ],
      “Size”: 0,
      “VirtualSize”: 910
   },
   {
      “Created”: 1401292614,
      “Id”: “31fa814ba25ae3426f8710df7a48d567d4022527ef2c14964bb8bc45e653417c”,
      “ParentId”: “a15f98c467482e15cae7bede2eccf45b698ee0ca5fd18ea3120c7c35e4f5e842”,
      “RepoTags”: [
         “training/webapp:latest”
      ],
      “Size”: 0,
      “VirtualSize”: 278804536
   }
]

Reference
https://docs.docker.com/reference/api/docker_remote_api_v1.15/
http://www.virtuallyghetto.com/2014/07/quick-tip-how-to-enable-docker-remote-api.html

docker 알아보기

docker를 접한지 얼마되지 않고, 공부 중이라, 어떻게 활용해야 할지는 좀 생각해봐야 하는데, 우선 활용은 예를 들어, redis, elasticsearch, rabbitmq, mariadb 등과 같은 오픈 소스 서버들을 설치하여 환경을 구축한 후 다른 image로 만들고 재활용함으로서, 개발을 위한 시스템셋업시간을 줄일 수 있다. 서버개발을 하다보면, 시스템 구성/설정 등이 반, 개발 반으로 느껴지니까,,, 그리고, 개발공부를 위해, hyper-v를 사용했는데, DB 따로, App서버 따로 하다보니, 물리메모리를 많이 사용해서, 비효율적이다. 그렇지만, docker를 쓰면, image로 만들어서, container로 올리면 되니까, 관리하기도 쉽고, 시스템 자원도 효율적으로 쓸 수 있어서, 좋은듯하다. 무엇보다, 가상환경을 써서 분산환경을 공부하거나 개발할 때, hyper-v 보다 다루기가 수월하고, images도 가벼워서, 다른 사람들과 공유가 쉬운듯 하다. 그리고 배포, 자동화 활용 아이디어를 생각하면, 개발에 더 집중할 수 있으리라 믿는다. 시스템설정 반, 개발 반… ㅎㅎㅎ

Development Environment
Linux: ubuntu server 14.04
Docker: v 1.5.0

설치하기
$ wget -qO- https://get.docker.com/ | sh

설치확인
$ which docker
/usr/bin/docker

버전확인
$ docker -v
Docker version 1.5.0, build a8a31ef

방화벽 오픈
$ sudo ufw allow 4243/tcp
Rules updated
Rules updated (v6)

root 권한 부여 ( 명령어 실행 시, 대부분 root 권한 필요 )
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart

ubuntu 이미지 다운로드 받기
$ docker pull ubuntu

docker image 보기
$ docker images

docker image 다 보기
$ docker images -a

docker container 보기
$ docker ps

docker container 다 보기
$ docker ps -a

docker image(REPOSITORY: ubuntu, TAG: 14.04)에서 container 만들기, -i는 실행 시, container안으로 들어간다.
$ docker run -i -t ubuntu:14.04 /bin/bash

docker container 안에서 main으로 돌아오기
$ exit

docker image(REPOSITORY: ubuntu, TAG: 14.04)에서 container 만들기,
-d는 실행 시, container안으로 들어가지 않는다. -i와 반대되는 옵션
$ docker run -d -t ubuntu:14.04 /bin/bash

docker image(REPOSITORY: ubuntu, TAG: 14.04)에서 container 만들기, -p는 포트포워딩 옵션
external inbound port가 9000, internal inbound port가 8000일 때,
즉, 외부에서 9000번으로 들어가면, 내부에서 8000번으로 포워딩되어, 컨테이너 내부에 8000번 서버가 있으면 접속이된다.
$ docker run -d -p 9000:8000 -t ubuntu:14.04 /bin/bash

docker container 리스트 보기
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fb06ae8a994 ubuntu:14.04 “/bin/bash” 15 hours ago Exited (0) 10 hours ago thirsty_brattain

docker container에 접속하기
$ docker attach 9fb06ae8a994

## TIP ##
CONTAINER ID를 두글자 치고, TAB을 누르면 자동완성이 된다.

docker container 안에서 main으로 돌아오기
$ exit

docker container 시작하기
$ docker restart 9fb06ae8a994

docker container 삭제하기
$ docker rm 9fb06ae8a994

docker container 변경사항 확인하기
$ docker diff 9fb06ae8a994

docker image 만들기
$ docker commit 9fb06ae8a994 kevin/ubuntu:development

docker image 삭제하기
$ docker rmi kevin/ubuntu:development

다음은…
docker image push하기
$ docker push …

Reference
https://docs.docker.com/installation/ubuntulinux/

docker를 시작하며…

도커(Docker) 튜토리얼 : 깐 김에 배포까지
http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

이 글을 보며, 그냥 docker의 매력에 빠져들었다.
무언가 다양하게 응용해볼 수 있겠다는 생각이 든다.
프로젝트를 할 때면, 개발 반, 시스템 설정 반인듯한데, 사실 개발도 그렇지만, 개발을 시키기 위한 개발이나 세팅시간이 더 드는 듯하다. 그런데, 짜잔… docker는 이를 해결해 줄 수 있는 것이라 믿는다. automation만이 개발 시간을 절약할 수 있어서, 그 시간에 개발에 더 집중할 수 있도록 만들어 준다. 그리고 개발 시, virtual machine을 사용했는데, 그렇다고 virtual machine을 안띄울 수는 없지만, linux 하나는 정도 띄워서, docker를 그 안에서 사용함으로서, 다양한 시도를 빠르게 구성하게끔 도와줄듯하고, 시스템 리소스, 특히 메모리 부분에서 많이 절약해서 사용할 수 있다고 본다.