tkhrsskの日記

技術ネタなど

Linux計測系コマンド

CentOS 7.0 向けインストール手順

dstat

いろいろ統計情報まとめ

$ sudo yum install -y dstat

htop

topの拡張版

$ sudo yum install -y epel-release
$ sudo yum install -y htop

iperf3

ネットワークパフォーマンス測定

$ sudo yum install -y iperf3

sar(sysstat)

sar(System Admin Reporter:システム管理者向けレポーター)

$ sudo yum install -y sysstat
$ sudo systemctl start sysstat
$ sudo systemctl enable sysstat

Docker Hubのイメージサイズ

Docker Hubには公式・非公式含め、いろいろと便利そうなイメージが、 たくさんあがっています。

docker pullで、簡単に取得できるのはいいのですが、 これってpullし終わるまでイメージのサイズがわからないのでしょうか?

...なさそうなんで、いくつかpullしたイメージをメモ。

[2016/5/14追記] タグのページ見に行けばわかるようです。 https://hub.docker.com/r/library/redmine/tags/

イメージサイズ (pull後のdocker images)

基本イメージ

ubuntu              latest              5ba9dab47459        2 weeks ago         192.7 MB
centos              latest              dade6cb4530a        12 days ago         210.1 MB

一般的なコマンドを一通りいれるとこれくらいなのかな。

ミドルウェア

nginx               latest              4b5657a3d162        3 weeks ago         91.64 MB

100MB 切るとシンプルだなぁと思う。

Webアプリ系

Redmine
sameersbn/redmine   latest              4d0b53e01808        2 weeks ago         612.9 MB

→ よく紹介されているけど、起動しなかった... 以下、フロントエンドで起動したときのログ。

$ docker run -it -p 80:80 -v /home/core/redmine/files:/redmine/files -v /home/core/redmine/mysql:/var/lib/mysql sameersbn/redmine
ERROR:
  Please configure the database connection.
  Refer http://git.io/JkE-cw for more information.
  Cannot continue without a database. Aborting...

[2015/2/25追記]

単にDBサーバーが立ち上がってないだけでした。 公式ページを参考にMySQLサーバーのコンテナを立ち上げて、link指定したら、無事起動しました。

$ mkdir -p /opt/mysql/data
$ sudo chcon -Rt svirt_sandbox_file_t /opt/mysql/data
$ docker run --name=mysql -d \
  -e 'DB_NAME=redmine_production' -e 'DB_USER=redmine' -e 'DB_PASS=password'\
  -v /opt/mysql/data:/var/lib/mysql \
  sameersbn/mysql:latest
$ mkdir -p /opt/redmine/data
$ sudo chcon -Rt svirt_sandbox_file_t /opt/redmine/data
$ docker run --name=redmine -it --rm --link mysql:mysql \
  -v /opt/redmine/data:/home/redmine/data \
  sameersbn/redmine:2.6.2

Jenkins

jenkins             1.580.2             41001f44325b        6 weeks ago         661.5 MB   
jenkins             latest              41001f44325b        6 weeks ago         661.5 MB   
DevHub
ysaotome/devhub     latest              96b89a8369e1        8 weeks ago         857.8 MB

→ すんなり動きました!

永続化するためのディレクトリはどこだろう...

その他

Weave
zettio/weavetools   0.9.0               6c2dd751b59c        2 weeks ago         5.138 MB
zettio/weavetools   latest              6c2dd751b59c        2 weeks ago         5.138 MB
zettio/weave        0.9.0               efb52cb2a3b8        2 weeks ago         11.35 MB
zettio/weave        latest              efb52cb2a3b8        2 weeks ago         11.35 MB

→ 軽い!本当に小さなバイナリ入っているだけなんだろうなぁ。 イメージの中身、goでコンパイルされたたstaticなELFがひとつと、設定ファイル?が数個あるだけのようでした。

参考サイト

  • Dockerイメージのベストプラクティス

【翻訳】いいDockerイメージを構築するには? ーDockerfileのベストプラクティス | インフラ・ミドルウェア | POSTD

  • サイズの削減に関する記事。

気づいたらガジェ獣: docker exportとdocker importでdockerイメージのサイズを小さくする

docker exportは、最新のスナップショットを吐き出すのに対し、docker saveは履歴情 報も保存するのですね。

正確には、コンテナ(実行状態or実行結果)を保存するのが export、イメージを保存するのが saveのようです。

Docker 公式オーケストレーションツール(Machine, Swarm, Compose)

2014/12/4に、Docker公式で発表されたオーケストレーションツール

  • Docker Machine
  • Docker Swarm
  • Docker Compose

について、理解したことと、参考サイトをメモ。

■公式発表記事

Announcing Docker Machine, Swarm, and Compose for Orchestrating Distributed Apps | Docker Blog

全然関係ないけど、記事内にある英語のa.k.a.は、also known asの略で、"~で知られている"という意味だそうな。別名とか、通称とか、ニックネーム・あだ名という意味も。

cloud native, microservices architecture, twelve-factor apps あたりは、さらっと説明できるといいですね。。

Cloud Native at Netflix: What Changed? - Gartner Catalyst 2013

Microservices

The Twelve-Factor App(日本語訳)

  • 日本語の記事

AWS、Azure、SoftLayerの名前も:Dockerが新機能・サービスを続々発表、主要クラウドプレーヤーとの距離も緊密に - @IT

Docker Machine

仮想マシン(VirtualBox)や、クラウド(Azure、EC2、Digital Ocean)上に、Dockerが動く環境を作るツール? 導入を容易にするものかな。別にインストールすればいい話にも思えるけど。

docker machine/swarm を使ってみる - Cloud Penguins

Docker MachineでDigital OceanにDocker環境を構築する - Qiita

Docker Swarm

複数ホスト上に、コンテナを起動するクラスタを作ることができる。

手順としては、

  1. クラスタを作る swarm create
  2. ノード(ホスト)をクラスタに紐づける swarm join
  3. マネージャーを起動する swarm manage
  4. DOCKER_HOSTをマネージャーのポートに設定して、docker run

これで、クラスタに紐づいたノードに、分散されてコンテナが起動するらしい。 スケジューリングとか呼ばれるものは、まだまだ制限が多いみたい。

Docker Swarmでクラスタを構築する - Qiita

Docker Compose

Dockerが買収したfigそのもの(?)。 YAMLでコンテナ(複数コンテナ可)の構成をgroup.ymlを記述して、docker upすれば、 対象のコンテナが立ち上がる。

Docker Compose を試す - Qiita

まとめ

現時点の情報だと、まだまだ開発途上という感じがします。

蛇足

オーケストレーションツール絡みで、 rebuildで話に出てた、HashiCorpのConsulも気になる今日この頃。

Consulを使ってみた | Pocketstudio.jp log3

Serf / Consul 入門 ~仕事を楽しくしよう~

オーケストレーション入門 – 多種多様化するサービスをConsulで連携させる | GREE Engineers' Blog

3分でまとめ読むSerfとConsulの基本機能 – Gunosy Tech Blog

SerfとConsulの記事まとめ - Qiita

Dockerのネットワーク関連 (CoreOSで pipeworkとか weaveとか)

ガチガチにネットワーク設計されたマルチコンテナな環境を作りたい。 しかも、DSLとかで記述してコマンド一発でいけるとうれしい。

感覚的には vagrant up で、複数VM立ち上げられるdocker版。VMの細かいカスタマイズはVagrantfileでできるように。

結論まで辿りついていないのですが、ファーストトライの個人メモです。

はじめに。固定IPを振るのに、docker単体じゃできないみたいな記事があるけど、 --privileged で、ipコマンド打てば特に問題なく設定でき、 他コンテナとの通信もできました。 開発環境限定とかなら、これでもいいかなという気もします。

以下、Docker環境構築から順次メモ。

CoreOS導入(Vagrantで)

いつもはFedora使うけど、CoreOSで試しました。

$ git clone https://github.com/coreos/coreos-vagrant/
$ cd coreos-vagrant
$ vagrant up

起動後の情報いくつか。

core-01 ~ # uname -a
Linux core-01 3.18.4 #2 SMP Thu Feb 5 02:39:49 UTC 2015 x86_64 Intel(R) Celeron(R) CPU N2830 @ 2.16GHz GenuineIntel GNU/Linux
core-01 ~ # df
Filesystem     1K-blocks   Used Available Use% Mounted on
rootfs          16591236  21644  15707096   1% /
devtmpfs          498692      0    498692   0% /dev
tmpfs             510984      0    510984   0% /dev/shm
tmpfs             510984    224    510760   1% /run
tmpfs             510984      0    510984   0% /sys/fs/cgroup
/dev/sda9       16591236  21644  15707096   1% /
/dev/sda3        1024016 313976    658024  33% /usr
tmpfs             510984      0    510984   0% /media
tmpfs             510984      0    510984   0% /tmp
/dev/sda6         110576     88    101316   1% /usr/share/oem
core-01 ~ # docker -v
Docker version 1.4.1, build 5bc2ff8-dirty

systemd採用。一般ユーティリティ系(?)のぞいて、 docker以外のコマンドどれくらい入っているのかなぁと見てみると

Rocketも入っていなかった。( CoreOS - はじめてのRocket - Qiita )

まぁ、最低限のLinux環境ならこんなもんですかね。あとはコンテナ内で。 etcdやfleetとか、オーケストレーションとかがあればいいって感じですかね。

CoreOSクラスタにDockerコンテナをデプロイ #dockerjp // Speaker Deck

privileged起動でコンテナ操作

以下、privilegedで起動して、ipを追加した操作。

core-01 ~ # docker run -it --rm --privileged ubuntu /bin/bash
root@3a9c79cf6c14:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
30: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0a:01:00:0b brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.11/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe01:b/64 scope link
       valid_lft forever preferred_lft forever
root@3a9c79cf6c14:/# ip a a 192.168.0.2/24 dev eth0
root@3a9c79cf6c14:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
30: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0a:01:00:0b brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.11/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.2/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe01:b/64 scope link
       valid_lft forever preferred_lft forever

pipework

pipeworkも使ってみました。 LXCコンテナを操作しているイメージだったので、今動くのかな?という懸念があったのですが、普通に動きました。

下記、サイトにある内容を実践しただけなので、詳細は割愛...

Dockerコンテナに狙ったIPアドレスを割り当てる | blog.hansode.org

まぁ、ホスト側で一発で操作できるのは嬉しいけど... コンテナ起動してから、1コンテナずつ操作する。だと、当初の目標には遠い。

Weave

Weaveが少し近づいてきた?

Weaveを試してみた

Weave - Dockerで仮想ネットワークを構築 MOONGIFT

ZettioがDocker用ネットワークシステムのWeaveをリリース

複数のDockerサーバで独自ネットワークを構築する「Weave」を試す! - さくらのナレッジ

Dockerコンテナ接続パターン (2014年冬) | SOTA

インストール。

$ sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
/usr/local/bin/weave: Read-only file system

えっと、CoreOSでは /usr が readonlyでmountされているようなので

$ sudo mkdir -p /opt/bin
$ sudo wget -O /opt/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
$ sudo chmod a+x /opt/bin/weave

weaveはroot専用コマンドらしいので、rootになって各操作。

# weave launch

まず、起動すると zettio/weavetools や zettio/weave のコンテナイメージをとりにいって、 zettio/weave を起動しているようでした。

# docker ps
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                                            NAMES
d6023fc97310        zettio/weave:0.9.0   "/home/weave/weaver    36 seconds ago      Up 34 seconds       0.0.0.0:6783->6783/udp, 0.0.0.0:6783->6783/tcp   weave

では、実際に動かしたいコンテナを起動。

# weave run 192.168.0.1/24 -it ubuntu /bin/bash
06d7ed07fbd6ff0cad9d6bde89c4055a50cb38ac57fb464077e28541749ce9fa
# weave ps
06d7ed07fbd6 66:f2:32:45:7c:92 192.168.0.1/24
d6023fc97310 32:c5:23:49:1f:b8
# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06d7ed07fbd6        ubuntu:latest       "/bin/bash"         55 seconds ago      Up 54 seconds                           elegant_torvalds

-d 指定しなくても、デーモンとして起動するのかな。

weave attach がうまくできなかったので、docker attachする。

# docker attach 06d7ed07fbd6
root@06d7ed07fbd6:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
39: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:0a:01:00:0d brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.13/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe01:d/64 scope link
       valid_lft forever preferred_lft forever
41: ethwe: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc fq_codel state UP group default qlen 1000
    link/ether 66:f2:32:45:7c:92 brd ff:ff:ff:ff:ff:ff
    inet 127.0.0.1/24 scope host ethwe
       valid_lft forever preferred_lft forever
    inet 192.168.0.1/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet6 fe80::64f2:32ff:fe45:7c92/64 scope link
       valid_lft forever preferred_lft forever
(ctl+p ctl+q で抜ける)

ethweというインタフェースが追加され、そこにIPアドレス付与されていることがわかる。 --net=none 付きで起動すれば、ethweオンリーのシンプルな環境にもできる。

# weave run 192.168.0.2/24 -it ubuntu /bin/bash として、もう1個コンテナ作成し、 pingでコンテナ間通信できることを確認。資料通りやれば、複数ホスト間も同じ感じで動くだろう。

dockerをラッピングして、起動からネットワークまわりをケアできること、複数ホスト間もつなげられる。のが利点かな。

Docker Machine, Swarm

最近は、Docker社もオーケストレーションを出してきている。 ネットワークのカスタマイズは不明。やっぱりPaaS的な方向なのかなぁ。 誰かのまとめ記事を待つことにしよう(おい

Announcing Docker Machine, Swarm, and Compose for Orchestrating Distributed Apps | Docker Blog

fig, Docker Compose (2015/2/11 追記)

DSLでどうのは、figがよさそうと思っていたら、Docker Composeで置き換える模様。

Figで複数のDockerコンテナをまとめて起動して、Redmineを構築する - hidemium's blog

docker独自の構成ツール三種をアナウンス、figはDocker Composeへ - A Node in Nodes

単なるメモ

ethtoolで全IFなめる指定(もうちょっとシンプルにかけるはず...)

# ip l | grep "^[0-9]"|cut -d: -f2 | xargs -n 1 ethtool

CoreOSでプロキシまわりするスマートな方法がないみたいで、 /usr/lib/systemd/system/docker.service を見てみると、

[Service]
Environment=TMPDIR=/var/tmp
EnvironmentFile=-/run/flannel_docker_opts.env

とあるんだけど -/run/flannel_docker_opts.env ってどういう意味だ...勉強不足。。

参考: * http://ewaldertl.blogspot.jp/2014/03/using-docker-behind-http-proxy-on.html