Docker 1.9 버전 릴리즈

어제 기다리던 Docker 1.9 버전이 릴리즈 되었습니다. 이번엔 메이저 업그레이드와 마이너 업그레이드된 특징이 꽤 많네요.

가장 먼저 눈에 들어오는건 멀티 호스트간 네트워킹입니다. 1.8에 추가되기로 되어있었는데 한번 미뤄진 기능이죠. 컨테이너간의 네트워킹이 싱글호스트만 가능했던 제약이 이제 사라졌습니다. k8s와 같은 도구를 쓰지 않아도 Docker 만으로도 해결방안이 나온게 너무 반갑네요.

두번째는 퍼시스턴스 스토리지입니다. 컨테이너 volume을 플러그인 방식으로 사용하는건 이미 1.8에 소개되었지만 이번에 좀 더 업그레이드 되었네요.

Docker Swarm이 정식버전 딱지를 달았습니다. Swarm 설명에 늘 눈에 거슬리던 문구가 ‘상용에서는 쓰지마라’ 였습니다. 그런데 이번에는 당당하게 ‘상용에 쓸 준비가 되었다.’라고 써놨네요. Docker 클러스터를 위한 솔루션이 하나 더 늘었습니다.

이런 굵직한 변화외에도 Docker 엔진이 1.9로 판올림하면서 자잘한 특징들도 많이 업그레이드 되었네요.

  • stats 명령으로 Disk I/O 측정가능
  • 컨테이너에 label을 줄수 있고 label을 이용해 필터를 걸수 있다.
  • docker 이미지 만들때 build  명령에 인자값을 줄수 있다.

더 자세한건 블로그 기사를 참고하세요.

라즈베리 파이를 위한 나노 도커 이미지

얼마전 라즈베리 파이에서 도커를 실행하는 챌린지가 열렸었다. 거기서 우승한 팀은 라즈베리파이에 웹서버 2,500개를 돌렸다. 이게 어떻게 가능할까?

이 팀이 사용한 웹서버는 rpi-nano-httpd라는 초소형 웹서버다. FASM으로 개발되어 4k바이트밖에 차지하지 않는다.

이 웹서버를 실행하는 도커 이미지가 이미 DockerHub에 올라와 있다. hypriot/rpi-nano-httpd로 검색하면 찾을수 있다. 이미지 크기는 87.7 kB (우와)

출처: http://blog.loof.fr/2015/10/how-to-run-2500-webservers-on-raspberry.html

Docker 클라우드 구축 프로젝트 d4 발표영상

10월7일 열렸던 TechPlanet2015에서 사용했던 발표자료와 영상 공유합니다. 앞 부분은 좀 짤렸지만 내용을 보는데 큰 문제는 없습니다.

당일 준비한 내용이 많아서 웃음기 빼고 평소 발표보다 조금 빠르게 했던게 기억나네요.

 

비슷한 내용으로 지난달에 readme에 글을 썼는데 밀려서 이번주에 공개됐네요. 아래 글도 참고하세요.

http://readme.skplanet.com/?p=11449

dockerui

docker는 기본적으로 CLI를 지원한다. CLI도 익숙해지면 편하지만 가끔은 UI로 쓰고 싶을때도 있다.  그런때를 위해 dockerui를 추천한다.

https://github.com/crosbymichael/dockerui/

설치에 대한 기사

http://linoxide.com/linux-how-to/setup-dockerui-web-interface-docker/?hash=931ac244-ac28-446a-8a3e-416ed7c18461&utm_medium=social&utm_source=facebookpage&utm_campaign=docker-2681022

Docker 이미지 받아서 설치하는건 사실 설명이 필요없다.

docker run -d -p 9000:9000 –privileged -v /var/run/docker.sock:/var/run/docker.sock dockerui/dockerui

 

Docker를 Jenkins 슬레이브로 사용하자

jenkins 를 단독 서버로 많이 사용하지만 마스터-슬레이브로 구성할 수 있다. 이렇게 구성하면 마스터는 슬레이브를 이용해 빌드를 진행하고 빌드결과는 컨트롤러에서 확인이 가능하다. 마스터 슬레이브 구성의 장점은 무엇일까?

  • 슬레이브를 여러개 만들어 다양한 환경에서 빌드를 진행할수 있다.
  • 시간이 오래 걸리는 빌드를 슬레이브에게 위임할수 있다.
  • 마스터는 하나이기 때문에 jenkins를 여러개 두는것에 비해 관리가 쉽다.

이 슬레이브를 docker로 만들면 아래 그림과 같은 구성이 된다.

jenkins-register2(그림 출처:http://making.meetup.com/post/122890386432/steps-towards-automated-testing-with-docker-and)

도커 슬레이브를 사용하려면 마스터서버가 도커 프로비저닝이 가능해야 한다. 이 설정은 다른 포스트를 참고한다. 마스터 서버를 만들고 나면 서버에 docker 플러그인을 설치한다.

jenkins 관리 > 시스템에서 Cloud 영역 설정을 추가한다. 기본적인 설정은 플러그인 페이지를 참조한다. 주의할 점은 docker url을 적을때 ‘http://’ 를 붙여야 하며 version은 적어주면 안된다. (이 부분은 버그로 보인다.)  설정을 하고나면 ‘test connection’ 버튼으로 설정 문제가 없는지 확인한다.

도커 서버 설정이 끝나면 슬레이브로 사용할 도커 이미지를 설정한다. 슬레이브 도커 이미지는 도커허브에 있는 evanga/jenkins-slave를 참고하여 만든다.

마스터가 슬레이브와 통신할때 ssh를 사용하기 때문에 ssh 서버를 설치하고 jenkins 사용자를 추가했다. 마스터 서버에서 슬레이브 도커 이미지를 설정할때 credential이 필요한데 이 credential을 만들때 사용자 id/password를 사용한다.

이제 Job을 추가한다. Job은 Build multi-configuration project 스타일로 만들어야 한다. 설정에서 Configuration Matrix 영역 > ‘Add axis’ 에서 ‘Slave’를 선택하면 젠킨스 설정에서 추가한 슬레이브 노드를 선택할 수 있다.

설정에 문제가 없다면 Job을 실행했을때 새로운 도커 컨테이너가 만들어져 빌드가 진행되고 빌드가 끝나면 자동으로 컨테이너가 삭제된다. 설정에 따라 컨테이너를 유지하는것도 가능하다.

참고자료

ING사 도커를 이용한 Continuous Delivery 사례

DockerConEurope 2014에서 ING 사의 CTO가 발표한 지속적인 배포(Continuous Delivery) 사례입니다. 내용을 간단히 요약해 보면

  • 실리콘 벨리 스타트업들이 기존 사업 영역을 장악하고 있다.
  • ING 같은 기업도 변화하지 않으면 살아남을수 없다고 인식
  • 애자일,스크럼, DevOps 도입을 시작
  • CEO, CTO 같은 경영진에서 Tech Driven 기업임을 선언하고 강하게 주도
  • DevOps 팀으로 조직구로 변화, 개발자들의 도전을 환영, 파트너 십 강화
  • Docker 같은 오픈소스를 이용해 마이크로 서비스 플랫폼 구축
  • 빌드서버, 테스트 서버, 기능 테스트를 위한 환경 구축
  • High Speed with Low Cost 를 달성

제가 요즘 재밌게 보고있는 Akka도 사용하고 있네요. ㅎ

http://blog.docker.com/2014/12/dockercon-europe-keynote-continuous-delivery-in-the-enterprise-by-henk-kolk-ing/

Jenkins로 Docker 이미지 만들기

빌드서버로 많이 사용하는 Jenkins를 도커 컨테이너로 실행하고, 이 컨테이너를 이용해 도커 이미지를 만들고 실행하는 방법에 대해 알아보자.

도커허브 Jenkins 공식 이미지로 Jenkins 컨테이너를 만들수 있다.

이렇게 만든 Jenkins 서버로 도커 이미지를 빌드하려면 몇가지 설정을 추가해야 한다.

  1. Docker 소켓 파일에 대한 접근 권한
  2. Docker 클라이언트와 실행권한

첫번째, Docker 소켓에 대한 접근을 가능하게 하려면 run 명령을 실행할때 v(Volume) 옵션을 이용해 docker.sock 파일을 공유하면 된다.

두번째, docker 클라이언트를 실행하는 가장 간단한 방법은 호스트 서버의 docker 클라이언트를 공유하는 것이다.

도커 명령은 root 권한을 필요로 한다. 도커 컨테이너에서 도커 명령을 실행하는것을 dind(Docker-in-Docker)라고 보통 부른다. 도커 run 명령을 실행할때 privileged 옵션을 준다.

그런데 jenkins 이미지는 이 옵션이 안먹힌다. 이유는 사용자가 root가 아니기 때문인데 공식 Jenkins 이미지 Dockerfile을 열어보면 기본 사용자가 jenkins로 되어 있다.

jenkins 사용자가 Docker 명령어를 사용할 수 있도록 root 권한을 부여해 보자.  이 설정은 실행 옵션만으로는 어렵고 Jenkins 도커 이미지를 다시 만들어야 한다. 최신 jenkins 이미지를 베이스 이미지로 하는 Dockerfile을 만든다.

필요한 플러그인을 plugins.txt 파일에 pluginId로 나열하면 원하는 플러그인이 설치된 이미지가 만들어진다.

이제 도커 이미지를 만든다.

이 이미지를 이용해 jenkins를 실행하면 Job에서 도커 명령을 마음대로 사용할 수 있다.

docker 이미지를 주기적으로 빌드하면 빌드 중간에 생기는 이미지들이 늘어난다. 빌드중에 생기는 이미지를 지우고 싶다면 –rm=true 옵션을 준다.

참고자료

Docker 컨테이너 /etc/hosts 파일 수정하기

Docker 컨테이너를 만들때 사내 사이트 dns에 대한 정보를 hosts 파일에 넣어야 하는 상황이 생겼습니다. 처음에는 간단하게 생각했습니다.

표준 이미지를 만들때 표준으로 사용하는 hosts 파일을 복사하자.

Dockerfile의 COPY 명령어로 해결될줄 알았는데 해당 url에 대한 ip가 다르게 나와서 확인해보니 아래 링크를 찾았습니다.

Editing networking config files

Starting with Docker v.1.2.0, you can now edit /etc/hosts, /etc/hostname and /etc/resolve.conf in a running container. This is useful if you need to install bind or other services that might override one of those files.

Note, however, that changes to these files will not be saved by docker commit, nor will they be saved during docker run. That means they won’t be saved in the image, nor will they persist when a container is restarted; they will only “stick” in a running container.

출처: https://docs.docker.com/articles/networking/

요약하면 /etc/hosts, /etc/hostname, /etc/resolve.conf 와 같은 네트워크 설정 파일을 실행중인 컨테이너에서만 유지된다는 설명입니다. 이를 지원하는 옵션이 RUN 명령에 들어있습니다.
$ /docker run -ti –add-host db-static:86.75.30.9 ubuntu cat /etc/hosts

RUN 명령어 문서: https://docs.docker.com/reference/run/
–add-host 옵션뒤에 dns:ip 와 같이 적어주면 etc/hosts 파일안에 내용이 추가된것을 확인할 수 있습니다.

이 설정을 docker-compose.yml에서도 추가할수 있습니다.

extra_hosts:

– “somehost:162.242.195.82”

extra_hosts는 docker 클라이언트의 –add-host와 동일하게 맵핑됩니다.

Dockerfile에서 Docker 설치

docker 이미지를 만들다 보면 docker를 설치해야 하는 경우가 있다. curl을 활용하면 Docker 설치 작업을 간단하게 자동화 할 수 있다. 다음 Dockerfile을 살펴보자.

[code lang=”perl”]ENV DOCKER_VERSION 1.6.0
RUN apt-get update
apt-get install -y sudo
rm -rf /var/lib/apt/lists/*
RUN curl -sSL -O https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_VERSION}
&& chmod +x docker-${DOCKER_VERSION}
&& sudo mv docker-${DOCKER_VERSION} /usr/local/bin/docker[/code]

docker 바이너리 파일을 다운로드 받아서 실행권한을 추가하고 /usr/local/bin으로 이동시킨다. 버전은 직접 써주기 보다는 환경변수로 정의하고 사용하는게 나중에 버전을 변경할때 편하다.

wget을 이용할수도 있다.
[code lang=”perl”]RUN apt-get install wget -y
&& wget -qO- https://get.docker.com/ | sh[/code]

DockerCon 2015 키노트 요약

CIHJBlCUkAAJHvl

DockerCon 2015(http://www.dockercon.com/)의 키노트 연사는 Docker사 CEO 벤 갈럽(Ben Golub)과 CTO 솔로몬 하이츠 입니다. 두명의 발표에서 주요 내용을 요약했습니다.

Thank you to xxx

Docker는 기존의 기술을 활용한 오픈소스일 뿐이라고 폄하하는 사람들도 있습니다. 오히려 그런 기술을 만든 사람들에게 감사의 메시지를 전합니다.

dockercon_keynote1

Growth Statistics

2014년과 비교했을때 몇 % 늘었다는 표현이 무색할정도 급속한 성장입니다.

  • 컨트리뷰터는 460->1,300으로 183%,
  • GitHub내 프로젝트는 6,500->40,000으로 515%
  • 취업 사이트 Indeed 기준으로 Docker 관련 Job도 2,500->43,000으로  1720% 늘었네요.

스크린샷 2015-06-23 오후 1.38.57

App Have Fundamentally Changed

마이크로 서비스, 클라우드의 등장으로 서비스 근간부터 바뀌고 있습니다.

스크린샷 2015-06-23 오후 1.53.08

The Future of Distributed Application in 5 Steps

컨테이너 애플리케이션의 미래로 보는게 맞겠죠. 현재는 1,2단계쯤 와있고 3단계가 진행중입니다.

스크린샷 2015-06-23 오후 1.56.43

Docker in Production

Docker 한다고 하면 가장 많이 듣는 이야기가 ‘운영’에 적용할수 있는가 인데요. Project -> Solution -> Ecosystem -> Movement로 발전해왔죠. Ecosystem만 보더라도 이미 수많은 기존 업체들이 Docker를 지원하고 있습니다. 이미 알고있는 네트워크이나 보안에 대한 이슈는 현재 진행중이니 해결될거 같구요. 실서비스에 이미 쓰고 있다는 글로벌 기업도 많으니 가능하다고 봅니다. 오히려 문제는 기업내에 Docker를 잘 아는 사람이 적다는것이 아닐까요.

스크린샷 2015-06-23 오후 2.00.31

스크린샷 2015-06-24 오후 1.43.17

솔로몬 하이츠는 Docker의 Misson을 이야기합니다.

Our mission is to build tools of mass innovation.

최근 Docker는 개발자와 인터넷간에 놓여있는 서버들을 프로그래밍 가능하도록 만들기 위한 도구를 만들기 위해 노력해왔다

스크린샷 2015-06-23 오후 2.19.13

4가지 Big Goal을 기준으로 발표를 진행하는데

Goal1: Reinvent programming tool box for building distributed applications

기존의 도구들이 분산 애플리케이션을 만드는데 적합하지 않았다. 그래서 그에 맞는 도구를 만들어서 제공하겠다. 근본 문제를 해결할수 있는 가능한 간단한 해결책을 제공하는것을 반복하는게 핵심

CIHlRVKWcAQo6lO

분산 애플리케이션을 개발할때 발생하는 문제를 5개 나열합니다.

  1. runtime: docker로 해결
  2. packaging & distribution: dockr registry로 해결
  3. service composition: docker compose로 해결
  4. machine management: 어떻게 여러 머신에 내 코드를 실행할수 있을까
    1. docker machine으로 해결
  5. clustering: 스케쥴링 이슈
    1. docker swarm으로 해결
  6. networking
    1. 네트워크는 애플리케이션의 일부로 봐야한다.
    2. SocketPlane 인수를 언급
    3. Docker Network 소개. 아직 실험적 기능, 다음 분기에나 나올것으로 예상
      1. Multi host networking out of the box

      2. 토폴리지내 가상 네트워크, 보안정책, 방화벽 기능

    4. Standard Service discovery

이제 남은 문제들은 무엇이고 어떻게 해결할것인가에 대한 질문을 던집니다. Docker의 실험적 기능을 공개하고 있으니 피드백을 달라

https://github.com/docker/docker/tree/master/experimental

Docker Plugins

Docker는 4가지 확장 포인트를 제공한다. Network, Volume, Schedule, Service Discovery

Goal 2: build better plumbing

도커는 이미 많은 요소들을 재사용하고 있죠. 새로 만들지 말고 기존것을 활용하고 개발하는것은 다른곳에서 활용할수 있도록 만들자.

dockerkey3

The Docker Plumbing Project

  • Security관련 도구 Notary
  • runC
    • 가볍고 이식성있는 컨테이너 런타임
    • OCP에 코드 기부(https://github.com/opencontainers/runc)

dockerkey2

Goal 3: promote to open standard

Open Container Project

도커의 CTO 솔로몬 하이츠는 이렇게 말하면서 OCP를 소개했습니다.

업계 표준이라면 적합한 표준을 만들어야 하는 책임이 있다.

You are the de facto standard. Now it’s your responsibility to make it a proper standard

OCP는 도커뿐 아니라 CoreOS의 rocket등 다양한 컨테이너 포맷이 상호운영될수 있는 표준 컨테이너 스펙을 정의하는 비영리 프로젝트입니다. 도커,MS,IBM,HP,CoreOS, Intel 등 많은 기업들이 파운딩 멤버로 참여합니다. OCP를 잘 소개한 TC 기사를 읽어보세요.

Docker는 많은 IT 기업이 관심을 갖고 지켜보는 오픈소스입니다. Docker 사도 잘하고 있지만 너무 많은 영역을 직접 하려고 하는것은 아닌가 우려도 되네요. OCP 같은 컨테이너 자체에 대한 분야에 더 집중하고 다른 영역은 CoreOS 같은 회사가 리딩하도록 하면 컨테이너 관련 이슈들이 더 빨리해결되지 않을까요.

ps) 2일째 키노트에서 라즈베리파이에 도커를 실행하는 데모를 보여주네요.

DockerCon 15 2일째 키노트

http://blog.hypriot.com/post/dockercon2015/