docker inside containers

28
コンテナの中のコンテナ ~Docker inside containers~ 株式会社シャノン Platform Technologyグループ 藤倉 和明

Upload: kazuaki-fujikura

Post on 13-Apr-2017

1.715 views

Category:

Engineering


0 download

TRANSCRIPT

コンテナの中のコンテナ ~Docker inside containers~

株式会社シャノン Platform Technologyグループ 藤倉 和明

1

お?

2

3

OpenVZコンテナの中で Docker動かせたら色々捗りそう

4

試してみた

5

環境

ホストサーバ :AWSのEC2 instance-type : m3.medium ホストサーバOS : OpenVZ (2.6.32-042stab106.4)

Amazon EC2

6

セットアップ

042stab105.4以降のOpenVZを用意 vzctl 4.9以降のバージョンを用意

※ Paravirtualの場合はOpenVZカーネルをビルドする必要有り

7

セットアップ

とりあえず流れに沿って コマンドを実行&実行して OpenVZコンテナを立ち上げる

8

セットアップ

CentOS6の場合はOpenVZコンテナ内で cgroup用のmountを実施する必要がある

9

コンテナの中でDockerを起動!

Docker daemon 起動したっぽい

10

docker runでコンテナ起動 centos imageをpullし始めた

# docker run –i –t centos /bin/bash

11

Docker daemon

Dockerコンテナ

あっさり起動

12

Hostから見たプロセスツリー

OpenVZ コンテナのinit ->

Docker daemonの下にDocker container のプロセスツリー ->

13

Amazon EC2

container1 container2

Host instance

ディレクトリ構造はこんな感じだった

/vz/root/< container1 _id>

/var/lib/docker/

/

/vz/root/< container2 _id>

/var/lib/docker/

container1のdockerのディレクトリはHost instanceから見て /vz/root/< container1 _id>/var/lib/docker/

14

Amazon EC2

eth0

container1 container2

veth1 veth2

eth0 eth0

br0

Host instance

ネットワーク構造はこんな感じになってた

docker0

veth_docker1

eth0

docker0

veth_docker1

eth0

Bridgeを使って親子間のネットワーク接続

15

仮想サーバ(EC2)の中に 仮想サーバ(OpenVZ)立てて

さらに仮想サーバ(Docker)立てた感じ

16

その他試してみた事

1:自分の環境をそのままimport 2:HostサーバでDocker daemon起動

17

自分の環境をimport

今動かしている自分の開発環境をDocker container 化して検証する事ができますよ でできる。 excludes.listは/dev/とか/proc/とか/sys/を除外するように記述する。

1:tar cfzp /tmp/iamge.tar.gz / -X /tmp/excludes.list # 容量等要注意! 2:cat iamge.tar.gz | docker import - myserver/v1 3:docker run –I –t -p 8080:8080 myserver/v1 /bin/bash

18

自分の環境をimport

これができると、自分の環境をそのまま試して壊せる。 opensslとかglibcとかのバージョン上げてみたいじゃん? 自分の環境でDeployの検証とか手軽にしたいじゃん? もう怖くないよ!

19

HostサーバでDocker daemon起動

OpenVZコンテナでbridgeとか、netfilter(iptables)が使えない場合もあるので、それを回避する手段を考えてみた

20

Amazon EC2

eth0

container1

veth1

eth0

br0

Host instance

今回試した構成はこんな感じになってたのを

docker0

veth_docker1

eth0

Docker client

Docker container

21

Amazon EC2

eth0

container1

veth1

eth0

br0

Host instance

こんな感じにしてみた

docker0

veth_docker1

eth0 Docker client

Docker container

22

どゆこと?

23

Hostサーバでdocker daemonを起動させる。その時のオプションに一工夫 こんな感じでdaemon起動させると OpenVZコンテナ内にリポジトリが出来て、docker daemonと通信するsocketファイルができる。

# docker -H unix:///vz/root/<ctid>/var/run/docker.sock --graph=/vz/root/<ctid>/var/lib/docker/ -d

24

Amazon EC2

eth0

container1

veth1

eth0

br0

Host instance

利用者目線ではcontainers in container 的な使い方ができる

docker0

veth_docker1

eth0 Docker client

Docker container OpenVZ コンテナ内からHostサーバで起動してるDocker daemonの操作ができる!

docker run ~

※ 注意点 ※ Host instanceとOpenVZ containerではDockerのバージョンを合わせておくこと。APIバージョン違うとコケるよ

25

Docker便利だね

これでもっと開発が楽しくなる?

26

シャノンでは一緒に楽しく開発してくれる メンバーを募集中です!

楽しい開発環境を提供する事に悦びを感じられるインフラエンジニアも募集中です!

https://www.green-japan.com/company/1632

27

おしまい

※ 本スライドは2016/03/09の社内 勉強会での資料を修正したものです