Weaveでコンテナ間通信を試してみる

とりあえず2台の仮想マシンを用意します。下記のようなVagrantfileでサクッと実行環境を構築。

# -*- mode: ruby -*-
# -*- encoding: utf-8 -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.define :co1 do | co1 |
    co1.vm.hostname = "co1"
    co1.vm.network :private_network, ip:"192.168.33.11"
  end


  config.vm.define :co2 do | co2 |
    co2.vm.hostname = "co2"
    co2.vm.network :private_network, ip:"192.168.33.12"
  end
end

サーバをco1とco2の2台構成にしてプライベートネットワークでノード間を通信できるようにしておきます。
vagrant upでOSが起動したらそれぞれにSSHで接続してdocker-ceをインストールします。
docker-ceインストール後、両サーバで下記コマンドを実行しCentOS7のコンテナイメージを取得してください。


docker pull centos:centos7

weaveのインストール。

dockerのインストールが完了したら下記コマンドでweaveをインストールします。ホストco1とco2それぞれで実施してください。


su -
curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave
exit

weaveの起動

まずco1でweaveを起動します。


vagrant ssh co1
weave launch
docker ps -a

docker ps -aコマンドでweaveのプロセスが確認できれば次にco2でも起動します。


vagrant ssh co2
weave launch 192.168.33.11
docker ps -a

co2ではco1のIPアドレスを設定して起動します。co2でもdocker ps -aでweaveプロセスの起動が確認できればOK。

dockerコンテナ起動

co1、co2それぞれでdockerコンテナを起動します。centos7のイメージを利用しますが、展開した直後だとipコマンドが使えないのでiprouteパッケージをインストールします。


vagrant ssh co1
docker run --net=weave -it -d --name c7d1 centos:centos7
docker exec -it c7d1 /bin/bash
yum -y install iproute
ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
inet 127.0.0.1/8 scope host lo
...
17: ethwe0@if18: mtu 1376 qdisc noqueue state UP group default
...
inet 10.32.0.1/12 brd 10.47.255.255 scope global ethwe0
...
20: eth0@if21: mtu 1500 qdisc noqueue state UP group default
...
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
...
ethwe0@if18の10.32.0.1がホストco1のIPアドレスです。

co2も同様に作業します。


vagrant ssh co2
docker run --net=weave -it -d --name c7d2 centos:centos7
docker exec -it c7d2 /bin/bash
yum -y install iproute
ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
inet 127.0.0.1/8 scope host lo
...
16: ethwe0@if17: mtu 1376 qdisc noqueue state UP group default
...
inet 10.44.0.0/12 brd 10.47.255.255 scope global ethwe0
...
19: eth0@if20: mtu 1500 qdisc noqueue state UP group default
...
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
...
co2のIPアドレスは10.44.0.0のようです。

接続確認

co2のc7d2コンテナに接続して10.32.0.1(co1)にpingを実行してレスポンスが帰ってくればOKっぽい。
同様にco1から10.44.0.0に対してpingを行いこちらもレスポンスが帰ってくればOKっぽいです。

GNOME入りCentOS7のカスタムVagrant Boxファイル作成

CentOS7に開発系のツールを入れてGNOME上で作業している環境をVagrant向けにBox化した時の手順です。
かなりサイズがでかいのでVagrant向きでもないですが、メンテナンスを統一しておきたかったのであえて作成しました。
今回CentOS7はインストール済みで、自分が必要と思ったパッケージのみを導入後にオリジナルのBoxファイルを作成し、vagrantに展開して起動するところまでを一気に書きます。

この作業自体ググればいろいろ解説があるのですが、ここにでは自分専用(自分が作業した分だけ)の解説のみにとどめます。
実際作業してみて不足しているところは他のサイトを参考にして適当に作業してください。

パッケージインストール


$su -
#yum -y update
#yum -y install epel-release
#yum -y install kernel-devel

vagrantユーザの設定


#useradd -m vagrant
#passwd vagrant
#usermod -G wheel vagrant
#exit

sshの設定


$su - vagrant
$mkdir .ssh
$chmod 700 .ssh
$cd .ssh
$curl -k -L -o authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'
$chmod 600 authorized_keys
$cd
$chown -R vagrant.vagrant .ssh
$exit

sudoの設定


$su -
#visudo
%wheel ALL=(ALL) ALL #wheelグループのユーザはsudo可能にする。
%vagrant ALL=(ALL) NOPASSWD: ALL #vagrantユーザはパスワードなしでsudo可能とする。

exit

VirtualBox Guest Additionsのインストール

VirtualBoxの「デバイス」→「Guest Additions CDイメージ挿入...」を選択しイメージをマウントしてから下記コマンドでインストールします。


$cd /run/media/YOURNAME/VBox_GAs_x.x.x # YOURNAMEはLinuxの作業ユーザ
$sudo ./VBoxLinuxAdditions.run
cd

終わったらディスクを取り出してください。

Box化のための最適化作業


$sudo yum clean all
$sudo dd if=/dev/zero of=/EMPTY bs=1M
$sudo rm -f /EMPTY

ここまで完了したらOSシャットダウンします。

vbguestプラグインのインストール

作業はほぼ完了ですがVirtualbox更新時にGuest Additionsをvagrantで更新できるようにプラグインをインストールします。


vagrant plugin install vagrant-vbguest

Boxファイル作成と作成したファイルの登録


vagrant package --base VirtualBox上の仮想マシン名 --output 出力先Boxファイルパス(1)
vagrant add --name c7gui 上記で作成したBoxファイル(1)
vagrant box list
 c7guiというBox名が登録されているはずです。

Vagrantfileの作成


vagrant init

Vagrantfileの編集

適当なエディタで開いて次のように修正しました。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "c7gui"
  
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true #GUIを有効にする。
    vb.cpus = 4
    vb.memory = "8192"
  end
  
  config.vm.synced_folder "D:\\shared_folder", "/media/sf_vbox_sahre"
end

仮想マシン起動と接続


vagrant up
vagrant ssh

sshで接続しましたがvb.gui = trueなのでVirtualboxのコンソールが起動すると思います。定義済みユーザでログインしてエラーがないとか確かめましょう。

Guest Additionsの自動更新をOFFにしておく

最後に、一通りの設定は終わりですが、今のままだとvagrant upしたときにGuest Additionsが自動で更新されてしまいます。実際勝手に更新されてよくわからんエラーが出たとか嫌ならばVagrantfileに次の定義を追加して自動更新をOFFにしておきます。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "c7gui"
  
  ...
  
  config.vbguest.auto_update = false
  config.vbguest.no_remote = true
end

vagrant vbguestによるGuest Additions更新については、コマンドのヘルプ(vagrant vbguest --h)で確認できます。

以上

DockerfileでNginxのコンテナを構築

Dockerfileにコンテナの定義を記載してNginxのコンテナイメージを起動するまでの手順です。
他のApacheとかでも似たような手順なので、Dockerfileの書き方というよりは起動までの一連の流れを書きます。

Dockerfileの作成

適当な作業ディレクトリでDockerfileを作成します。


$mkdir nginx
$cd nginx
$vi Dockerfile
FROM centos:centos7
MAINTAINER Your name
ENV container docker
RUN yum -y update && yum clean all
RUN yum swap -y fakesystemd systemd && yum clean all
RUN yum -y install epel-release && yum clean all
RUN yum -y install nginx && yum clean all
ADD nginx.conf /etc/nginx/
RUN echo "Hello World" > /usr/share/nginx/html/index.html
RUN systemctl enable nginx
EXPOSE 8080

$ls
Dockerfile nginx.conf

この例ではADDでホスト側で準備しておいたnginx.confをコンテナ側の/etc/nginx配下にコピーしています。
nginx.confの詳細な定義内容はここでは目的のスコープ外なので記載しません。
適当に必要な設定ファイルを作成してDockerfileと同じディレクトリに配置すればこのDockfileそのままで動作します。
Webコンテンツはサンプルなので"Hello World"をindex.htmlにリダイレクトして作成していますが、ここは環境に合わせて変えていけばいいです。

コンテナのビルド

Dockerfileの内容でコンテナのビルドを行います。


$docker build -f ./Dockerfile -t cenots:c7web01 --no-cache=true .

コンテナの起動と確認

Dockfileでsystemdをインストールしており、コンテナ内でsystemdを利用するのでコンテナ起動時に--privilegedを指定しバックグラウンドで起動します。指定するコマンドは/sbin/initです。
起動したらinspectコマンドでIPアドレスを取得し、curlで"Hello World"が帰ってくればOK。


$docker run -d --privileged --name websrv01 -h websrv01 centos:c7web01 /sbin/init
$docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' websrv01
172.17.0.2
$curl http://172.17.0.2:8080/index.html
Hello World

コンテナに普通にログインしたい場合は下記コマンドでログイン可能です。


$docker exec -it websrv01 /bin/bash

DockerコンテナのIPアドレス取得

集中的にDockerネタです。

ホストOSからコンテナのIPアドレスを取得するときに利用するコマンドですがDockerから遠ざかるとすぐに忘れるのでUPしておきます。


docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [コンテナID/コンテナ名]

最後の[コンテナID/コンテナ名]はdocker ps -aで出力される一覧の対象となるコンテナのCONTAINER_IDかNAMEのいずれかを設定してください。

Dockerコンテナって最低限のコマンドしか入っていないのでCentOS7のコンテナに入ってipコマンドとかたたいてもコマンドが無いよ的なエラーが出ます。
コマンド入れればいいだけの話ですが、いちいちコンテナに入って確認も面倒なのでそんな時は外からinspectコマンドで一発取得が便利かと。

ホストOSのディレクトリをDockerコンテナと共有する

アプリ基盤って一度構築するとそれをドキュメントにしないと忘れてしまうのを何とかしたいと思いつつ、今回も昔まとめた手順をUPします。

ホストOSのディレクトリをコンテナと共有する方法です。

今回簡単にコマンド検証するためにVagrantにCentOS7を入れてDcokerをインストールしている環境を前提にしています。
ホストOSはvagrantユーザで実行している前提とします。

ホストOSで共有するディレクトリを作成

rootにスイッチしてディレクトリを作成する。パスワードは変更していなければvagrantと同じだが変更している場合、変更後のパスワードでsuすること。


su -
cd /
mkdir -p /data/docshare
cd /data
chown vagrant:wheel docshare
exit

共有するディレクトリに適当にファイルを作成


cd /data/docshare
echo "Hello World" > hello.txt
ls -l

OSのディレクトリをコンテナと共有

コンテナ起動時に-vオプションでホストOSのディレクトリとコンテナ側のマウントポイントを設定します。今回はあえて--hostnameでホスト名も指定していますがディレクトリ共有にこの設定は必要はありません。


docker run -it -d -v /data/docshare:/docshare --name testsrv --hostname testsrv centos:centos7 /bin/bash
docker attach testsrv
ls -l /
bin dev docshare etc ...
cd docshare
cat hello.txt

コンテナ上でファイルに書き込みを行ったりするとホストOS側でも変更を確認できると思います。
ちなみに書き込み不可にする場合は、コンテナ側のマウントポイントの後に:roと指定すればいいです。


docker run -it -d -v /data/docshare:/docshare:ro --name testsrv --hostname testsrv centos:centos7 /bin/bash

余談

少し話がそれますがコンテナ間でボリュームの共有をしたい場合もあると思います。
そういった場合、まずコンテナAを起動するときに/data/shareというボリュームを設定します。


docker run -it -d -v /data/share --name test01 centos:centos7 /bin/bash

コンテナBでは共有したいボリュームを設定しているコンテナ名を--volumes-fromオプションで指定すれば共有できます。


docker run -it -d --volumes-from test01 --name test02 centos:centos7 /bin/bash

コンテナB側で読み込み専用にしたい場合はコンテナ名の後に:roを指定すればOKです。

Python仮想環境にpipを利用してAnsibleの環境構築

virtualenv、virtualenvwapperで構築したPython仮想環境にAnsible実行環境を構築した時の覚書です。
サーバはCentOS7です。

yumパッケージのインストール

めんどくさいので、とりあえず開発系のパッケージをgropuinstallで一気に入れます。


sudo yum -y install epel-relase
sudo yum -y groupinstall "Development Tools"
sudo yum -y install python-devel sshpass

pipのインストール


curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python

virtualenv、virtualenvwrapperのインストールと設定


sudo pip install virtualenv
virtualenv venv
source ~/venv/bin/activate #activate,deactivateできるか試しておく
deactivate
sudo pip install virtualenvwrapper

which virtualenvwrapper.sh #出力されたパスを控えておいて、.bash_profileに以下の定義を追加。


vi .bash_profile

・・・
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
fi

source .bash_profile
mkvirtualenv ansible_env

Ansibleのインストール

作成した仮想環境上にAnsibleをインストール。


workon ansible_env
pip install ansible
ansible --version
deactivate

構築済みのCentOS7でロケールとタイムゾーンとキーマップの設定

CentOS7(RHEL7)になってだいぶコマンドなどの使用感が変わっていますが、設定済みのOSに日本語のロケール追加とタイムゾーンの変更を行うことがあったので、その時の記録です。

例えば、Vagrantで自前ではなくネットからDLしたBOXファイルを展開するとこれらの設定が英語圏のままなのでそういう時に自前で設定することになると思います。

ロケール

日本語のロケールを組み込んで設定するところまでをコマンドに残します。

まず、日本語のロケールが組み込まれているか確認します。


locale -a

上記コマンドの結果にja_JP、ja_JP.utf8がなければ組み込みます。


sudo localedef -f UTF-8 -i ja_JP ja_JP
locale -a|grep ja

CentOS7で恒久的にロケールを変更するには下記のファイルを修正。


sudo vi /etc/locale.conf
LANG="jp_JP.UTF-8"

タイムゾーン

タイムゾーンをAsia/Tokyoに変更する手順です。
コマンドは上から順に「現在のタイムゾーンの確認」、「変更対象のタイムゾーンの存在確認」、「タイムゾーン変更」です。
今回の場合だと、「変更対処のタイムゾーンの確認」でAsia/Tokyoが存在することを確認してください。


timedatectl status
timedatectl list-timezones | less
・・・
Asia/Tokyo
・・・
sudo timedatectl set-timezone Asia/Tokyo

キーマップ

最後にキーマップです。

日本語のキーマップが存在するか確認。


localectl list-keymaps | less
・・・
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106

あれば下記コマンドで設定変更。


sudo localectl set-keymap jp106