Dockercon 2018 SF 1일차 제너럴 센션

지난 6월13일 도커콘2018이 열렸습니다. 1일차 제너럴세션에 나온 내용을 간단히 정리해봤습니다.

새로운 CEO 스티브싱(Steve Singh) 발표

컨테이너가 리눅스이고, 윈도우이고, 데이터센터이며 싱글 클라우드다.

도커는 이제 글로벌 스케일로 성장하고 있으며 DevOps와 이노베이션의 중심에 있다.

새로운 키워드도  소개합니다.

  • Choice: 클라우드, OS에 종속되지 않게 해준다.
  • Agility: 생산성, 효율증가
  • Security: 어플리케이션으로부터 데이터 분리

에코 시스템과 커뮤니의 증가도 계속이어지고 있다. MIT 에서 진행하는 AI 코드 챌리지 Battle Code 같은 새로운 커뮤니티도 보이네요.

스타크래프트 Brood War를 도커로 실행하는 시도가 있다는것도 재미있습니다.

Product Manager Gareth Rushgrove 발표

개발자들은 보통 3개의 에디터를 사용한다. 그런데 에디터 유형보다 특이하게 눈에 띄는건 ‘Docker Desktop’ 입니다. 데모가 이어지는데 윈도우기반의 솔루션들이 대부분인거 보면 윈도우 컨테이너의 새로운 이름이 아닌가 하는 생각이 듭니다.

Rashmi Kumar & Andrew Zitney – McKessen

포춘500대 기업에 들어가는 헬스케어 회사, 작년 매출이 $200 빌리언. ㅎㅎ

Docker, k8s 기반으로 인프라를 구축했군요.

위 그림만 보면 Lean과 DevOps를 살짝 결합해 놓은 모습인데 괜찮아 보입니다. 문제를 정의하는것으로 시작해서 파이프라인 기반의 빠른 개발로 해결책을 제공하네요.

클라우드 네이티브가 빠질수 없죠. 기존 레거시를 도커를 기반으로 마이그레이션하고 있네요.

Erin Chapple, VP Microsoft 발표

MS는 이미 2014년부터 Docker를 윈도우 서버에서 실행하기 위한 노력을 진행해 왔습니다. 2016년에는 비록 윈도우 이미지만 가능하지만 윈도우 컨테이너를 네이티브 수준에서 구동하기도 했죠. 작년 도커사가 EE를 출시하며 윈도우 서버도 EE 버전을 출시했군요.

이제는 베타를 넘어 운영환경에서 쓸수 있다고 합니다.  컨테이너 운영도 k8s로 가능한 수준까지 올라왔군요. MS 참 대단합니다.

제 생각에 위 슬라이드가 오늘 발표의 하이라이트가 아닐까 합니다. 윈도우,리눅스 컨테이너를 DockerEE 를 통해서 관리할 수 있다. 오케스트레이션 도구는 Swarm, k8s 중에 선택할 수 있고, 데모 중간에 살짝 보이는 화면 GUI 같은데 깔끔하네요. Docker Cloud 를 기반으로 만든거 같습니다. CLI 는 Docker Compose 쓰는 느낌이 나네요.

뭐랄까요. 마이크로소프트가 더이상 도커사의 파트너가 아니라 주인인거 같다는 인상을 지울수가 없네요. 몇달전 솔로몬하익스가 떠나고 벤헬럽 CEO가 바뀐게 우연일까요.

원본영상

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]