Composeで作成されるネットワーク

Dockerにおいて表題の件についてメモ。

■ 環境

  • Docker 1.10.3
  • Docker Machine 0.6.0
  • Docker Compsoe 1.6.2
  • Mac OSX El Capitan

■ ネットワーク

Composeで起動したコンテナに見慣れないログが出ていた。

$ docker-compose up -d
Creating network "beat_default" with the default driver
Creating elasticsearch
Creating kibana
$ docker network ls

`docker-compose.yml`ではネットワークの設定を何もしていないのだが、ネットワークを勝手に作成しているようだ。またネットワークの名称は作業ディレクトリに”_default“が付けられている。

$ docker network ls
NETWORK ID          NAME                DRIVER
57690bbfada1        host                host
beed7829864c        beat_default        bridge
1460bebe2d7f        bridge              bridge
329123ebfee2        none                null
$

作成したコンテナは本当に作成されたネットワークにいるのだろうか?確認。

$ docker network inspect beat_default
[
    {
        "Name": "beat_default",
        "Id": "beed7829864c44191dc8f1a7c89c8ec54a82e9076859ed06513707f22b1325ae",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Containers": {
            "7fd67d9c5f0b45699a8f484591cbba5dadbbcbb39e14544c876e4ff79cf62966": {
                "Name": "elasticsearch",
                "EndpointID": "d2d48ccc63a24300121c7e52b3aee0b6092f06f4bc197c09b66bad8987d65879",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "966a2efd4730420f0aecb21ff50dbb12111dbf0815aef817f5f3ea8252825a27": {
                "Name": "kibana",
                "EndpointID": "40aa21617581b7fea4bc7131ef7cdb6440ba59d51d94347ccc06f2fc4a310d4c",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
$

確かに2つのコンテナがこのネットワーク上にあるようだ。ということは、ネットワーク設定を特に指定せずに上げたコンテナからのアクセスはできないのだろう。確認。

$ docker run -ti --rm centos:7 bash
[root@6f62b52fef18 /]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.3    6f62b52fef18
[root@6f62b52fef18 /]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
^C
--- 172.18.0.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3015ms

[root@6f62b52fef18 /]# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
^C
--- 172.18.0.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3007ms

[root@6f62b52fef18 /]#

サブネットが異なる。Composeで起動したコンテナは”172.18.0.0/16“のネットワークに接続されているが、何もネットワークの指定をしないでコマンドで起動したコンテナは、デフォルトの”bridge“ネットワークに起動されている。こちらは”172.17.0.0/16“のネットワークのようだ。

Composeで稼働させたコンテナ群でのみアクセス可能なようである。もちろん後からネットワークの接続を繋げることも可能なはずである。

以上。

Container Image Size

Dockerの表題の件について、前から少し気になっていたので試してみた。

■ 環境

  • Docker 1.10.3
  • Docker Machine 0.6.0
  • Mac OSX El Capitan

■ 気になっていた点

公開されているDockerfileを見ていると、`RUN`がすごく少なく`&&`でコマンドを繋げているのを多々見かける。`RUN`毎にlayerが増えていくのを防ぐ為、というようなものを読んだことがあるが実際にどの程度変わるのかを試してみる。

■ Dockerfile1

以前作成したApache ZooKeeperのDockerfileを使用する。まずは下記。

FROM centos:7
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN yum update -y
RUN yum install -y java-1.8.0-openjdk
RUN curl http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt
RUN ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper
RUN mkdir /opt/zookeeper/data
RUN chown -R root:root /opt/zookeeper-${ZOO_VERSION}
RUN mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
RUN yum clean all

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

このDockerfileをビルドする。

docker build -t test1 .

■ Dockerfile2

続いてコマンドの塊毎に`RUN`をひとつにしてみた。個人的にまとめるとしたらこの範囲かな、というのを一つのグループとしている。

FROM centos:7
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN yum update -y \
    && yum install -y java-1.8.0-openjdk
RUN curl http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt \
    && ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper \
    && mkdir /opt/zookeeper/data \
    && chown -R root:root /opt/zookeeper-${ZOO_VERSION} \
    && mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
RUN yum clean all

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

ビルドする。

docker build -t test2 .

■ 結果

イメージサイズの違いを見る。

$ docker images
REPOSITORY   TAG      IMAGE ID       CREATED             SIZE
test2        latest   17a2170391d5  12 minutes ago      458.3 MB
test1        latest   33ba6c2afcad  28 minutes ago      571.7 MB
  :

100M以上の差が出た。

コマンド毎に`RUN`を実行するのが本来の姿であるような気がするのだが、これだけ差が出ているとせめてグループ毎には纏めてしまおうと思い直すことになった。

以上。

■ 関連

awscli bash completion

表題の件。

■ 環境

  • bash
  • awscli 1.10.16
  • Mac OSX El Capitan

■ bash completion

アップグレードをする度に気になっていた下記の記載。

Add the following to ~/.bashrc to enable bash completion:
  complete -C aws_completer aws

気になっていたので`.bashrc`に追加してみた。Macではデフォルトでは`.bashrc`は読み込まれないが、自身の環境は`.bash_profile`で`.bashrc`が存在する場合には読み込むように設定済みである。

$ cat ~/.bashrc
  :
complete -C aws_completer aws
  :

追記してみたところ、`aws`コマンドで補完が効くようになった。入れていなかったのが勿体無い。ちょっと読み込む?までに時間が掛かるのが難点であるが。

以上。

■ 関連

npm bin

表題のコマンドを知らなかったのでメモ。

■ 環境

  • npm 3.3.12
  • node 5.5.0
  • Homebrew
  • Mac OSX El Capitan

■ npm bin

バイナリがインストールされるディレクトリを取得することができる。

$ npm bin -g
/Users/withsin/.nodebrew/node/v5.5.0/bin
(not in PATH env variable)
$

試しに環境変数”PATH“に入れて実行してみる。

$ export PATH=${PATH}:`npm bin -g`
(not in PATH env variable)
#
$ npm bin -g
/Users/withsin/.nodebrew/node/v5.5.0/bin
$

ちなみに、自身の環境では`nodebrew`を使用しているため、”PATH“は別の場所に通っているのでわざわざ上記ディレクトリに”PATH“を通す必要はない。

以上。

リージョンの一覧

AWSにおいて表題の通り。リージョンの一覧を取得したい。

■ 環境

  • awscli 1.10.15
  • Mac OSX El Capitan

■ describe-regions

下記で一覧が取得できそうである。

$ aws ec2 describe-regions
{
    "Regions": [
        {
            "Endpoint": "ec2.eu-west-1.amazonaws.com",
            "RegionName": "eu-west-1"
        },
        {
            "Endpoint": "ec2.ap-southeast-1.amazonaws.com",
            "RegionName": "ap-southeast-1"
        },
        {
            "Endpoint": "ec2.ap-southeast-2.amazonaws.com",
            "RegionName": "ap-southeast-2"
        },
        {
            "Endpoint": "ec2.eu-central-1.amazonaws.com",
            "RegionName": "eu-central-1"
        },
        {
            "Endpoint": "ec2.ap-northeast-2.amazonaws.com",
            "RegionName": "ap-northeast-2"
        },
        {
            "Endpoint": "ec2.ap-northeast-1.amazonaws.com",
            "RegionName": "ap-northeast-1"
        },
        {
            "Endpoint": "ec2.us-east-1.amazonaws.com",
            "RegionName": "us-east-1"
        },
        {
            "Endpoint": "ec2.sa-east-1.amazonaws.com",
            "RegionName": "sa-east-1"
        },
        {
            "Endpoint": "ec2.us-west-1.amazonaws.com",
            "RegionName": "us-west-1"
        },
        {
            "Endpoint": "ec2.us-west-2.amazonaws.com",
            "RegionName": "us-west-2"
        }
    ]
}
$

以上。