Deep Dive to
- Docker?
- Docker tools
- 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
- 今までの Build Serverの代わりに、Buildを行うためのImageを作成しRegistryに登録するJobを作成する。
このJobは定期的に実行して、依存しているコマンドやライブラリを更新する。 - scriptタスクのdocker run コマンド or Bambooのdockerタスクを使って buildを実行するJobを作成する。
実行するコマンドは、scriptファイルにしてStashに入れておく。
Know-How
$ docker run --rm -v `pwd`:/app /app/exec-unit-test.sh
- docker run を実行する際には、必ず --rm を付ける。
- Stash内のファイルを参照する時は、 -v `pwd`:/hoge でcheckout したファイルをマウントする。
CI のテスト結果を受け取る場合も同様にマウントしておけば、local にも反映される。
- 他のプロセスに依存するテストを行う場合には、
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
DeepDive to Docker
- 823