Deep Dive to

  1. Docker?
  2. Docker tools
  3. How to use on Bamboo

Docker?

  • コンテナ型仮想化
  • 仮想環境の構築手順をTEXTで記述できる

ハイパーバイザー型 vs コンテナ型

Virtual BoxやVMWareはこっち

Dockerはこっち

仮想化

  • ユーザ空間を切り分けるだけなので、起動が早い
  • ハードウェアレイヤーはホストOSと共通なのでエミュレーションが不要
  • ただし、ホストOSと同じ kernelしか使えない

コンテナ型仮想化

  • 仮想的なサーバを作り、その上で別のOSを動かす。
  • 仮想環境を起動するためには、通常のOS起動処理が必要になるので数分かかる
  • ハードウェアレイヤーにアクセスするためには、オーバーヘッドが存在する

ハイパーバイザー型仮想化

構築手順をTEXTで記述

maybe for DevOps

  • Vagrant file で仮想環境の構築手順を記述
  • アプリケーションやライブラリは、AnsibleやChef等でインストール

DevOpsの今までの定番

その他、各Cloud Service側でイメージ作成ができたり

Dockerを使う場合

FROM node:6

MAINTAINER hhoriuchi hhoriuchi@uievolution.com

RUN apt-get -y update && apt-get -y upgrade \
 && apt-get install -y --no-install-recommends build-essential python wget \
 && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app/logs

WORKDIR /app
COPY package.json .
ENV NPM_CONFIG_LOGLEVEL info
RUN npm install --production
COPY . .

EXPOSE 3000
ENV NODE_ENV $NODE_ENV
CMD ["/usr/local/bin/node", "src/app.js"]

このファイル1つで全てが記述できる。
さらに、どこの docker hostでも動かせる
Imageファイルが生成できる

Docker Hub

だいだいのアプリケーションは、
ここで公式に配布されている。
ユーザ独自の Imageも登録できる。

Docker tools

Compose

Swarm

Registry

Machine

# docker image上でコマンドを実行
$ docker run --rm -it ubuntu /bin/bash

# Dockerfile を元に docker image の構築
$ docker build -t tag

# 構築した imageの実行
$ docker start tag

# 実行中の Dockerコンテナの表示
$ docker ps -a

Docker Compose

  • 複数の Docker Containerを協調動作させるためのTool
  • 通常 Dockerでは 1 Containerに 1 Processを動かすのが通例のため、複数Processで連携する際の設定を行う
  • Docker Composeの設定も TEXTで行う
mysql:
  image: mysql:5.6
  command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
  environment:
    MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    MYSQL_DATABASE: bento_test

redis:
  image: redis

server:
  build: ..
  volumes:
    - ..:/app
  links:
    - mysql
    - redis

Docker Composeの設定ファイル例

# サービスの起動
$ docker-compose up

# サーバ上でコマンドを実行
$ docker-compose run --rm server /app/scripts/exec-unit-test.sh

Docker Composeのコマンド例

Docker Swarm

  • 複数の Docker Host上で複数の Containerを管理するためのTool
  • 最新の v1.12でリリースされたばかり
  • 今までも複数の Docker Hostを管理して、その上で Docker Containerを動かすToolは有ったが公式からもリリースされた

 

  • Amazon ECS (EC2 Container Service) や、Kubernetes、Apache Mesos 等が従来からあった
# クラスターの起動(実行すると joinに必要な tokenが表示される)
host01$ docker swarm init

# クラスターに参加
host02$ docker swarm join host01 --token=$WORKER_TOKEN
host03$ docker swarm join host01 --token=$MANAGER_TOKEN

# クラスターの状態表示
host01$ docker node list
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
74ir4572w3n9155wl2jgala4o    host01  Ready   Active        Leader
8gag9kyuf6azs4ylojkyrui4s    host02  Ready   Active        Reachable
a7kyx0ut9xn9mct2ersixuesz *  host03  Ready   Active        Reachable

# 試しに nginxをサービスとして起動する
host01$ docker service create -p 80:80 --name="nginx_sample" --replicas=3 nginx

# サービスの状態を表示
host01$ docker service ls
ID            NAME          REPLICAS  IMAGE  COMMAND
8ejer8lok06o  nginx_sample  1/3       nginx

# サービスのインスタンス数を変更
host01$ docker service scale nginx_sample=1 

Docker Composeのコマンド例

Docker Registry

  • Docker Imageを管理するためのServer
  • DockerHub (https://hub.docker.com/) を公式が提供している
  • 自前の管理サーバを用意する際に使うことになる

Docker Machine

  • Docker Containerを Linux以外のOS上で動かすためのTool
  • Docker v1.12 で、Docker for Mac, Docker for Windowsがリリースされたため不要になった

How to use on Bamboo

How to build app and CI build

  1. 今までの Build Serverの代わりに、Buildを行うためのImageを作成しRegistryに登録するJobを作成する。
    このJobは定期的に実行して、依存しているコマンドやライブラリを更新する。
  2. scriptタスクのdocker run コマンド or Bambooのdockerタスクを使って buildを実行するJobを作成する。
    実行するコマンドは、scriptファイルにしてStashに入れておく。

Know-How

$ docker run --rm -v `pwd`:/app /app/exec-unit-test.sh
  1. docker run を実行する際には、必ず --rm を付ける。
  2. Stash内のファイルを参照する時は、 -v `pwd`:/hoge でcheckout したファイルをマウントする。
    CI のテスト結果を受け取る場合も同様にマウントしておけば、local にも反映される。

     
  3. 他のプロセスに依存するテストを行う場合には、
    docker composeの runコマンドを使う。
# 最初にプロセスをクリーンアップしてからテストを実行
$ docker-compose -f docker/docker-compose-test.yml kill
$ docker-compose -f docker/docker-compose-test.yml rm --force
$ docker-compose -f docker/docker-compose-test.yml build
$ docker-compose -f docker/docker-compose-test.yml run --rm server /app/scripts/exec-unit-test.sh

# 終わったらまたクリーンアップ
$ docker-compose -f docker/docker-compose-test.yml kill
$ docker-compose -f docker/docker-compose-test.yml rm --force

DeepDive to Docker

By Hiroki Horiuchi