それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

DockerでLinuxブリッジとsystemdを使う

ちょっと実験用に試してみたけど起動するコンテナが使用中のIPを取りに来るので考え中・・・一応メモ(´・ω・`)

テスト環境

  • KVM仮想ゲスト
  • CentOS7.x (2016/03/09時点で更新)
  • /dev/vda 50GB, /dev/vdb 50GB
  • 最小限のインストール
  • 他、既定のまま

ブリッジの作成と再起動

CentOS7.x なので、NetworkManagerを利用してブリッジの作成と、ブリッジへeth0の割り当てを行う。
※下記最後のnohupでNIC停止->再起動になるので注意

# nmcli connection add type bridge ifname br0# nmcli connection modify bridge-br0 bridge.stp no# nmcli connection modify bridge-br0 \  ipv4.method manual \  ipv4.address "192.168.2.XXX/24" \  ipv4.gateway "192.168.2.1" \  ipv4.dns "192.168.2.1" \  ipv4.dns-search "underboob.localdomain" \  connection.autoconnect yes# nohup bash -c 'nmcli connection delete eth0 && nmcli connection add type bridge-slave ifname eth0 master br0 && systemctl reboot' &

Docker環境の構築

インストール

やっむ!やっむ!( ゚∀゚)o彡°

# yum install docker -y

初期設定

設定を変更する。

# vi /etc/sysconfig/docker...#OPTIONS='--selinux-enabled'OPTIONS='--selinux-enabled -D=true'  

コンテナが利用するDNSサーバの設定を行う。

# vi /etc/sysconfig/docker-network...#DOCKER_NETWORK_OPTIONS=DOCKER_NETWORK_OPTIONS='-dns 8.8.8.8 -dns 8.8.4.4'  

Docker Storage 用の設定

/dev/vdb にパーティションを作成、LVMフラグをセット

# parted /dev/vdb(parted) mklabel gpt(parted) mkpart(parted) set 1 lvm on(parted) print(parted) quit

OS領域とは別のボリュームグループとして作成しとく。

# pvcreate /dev/vdb1# pvdisplay# vgcreate docker-storage /dev/vdb1# vgdisplay

"docker-storage-setup" の設定を変更する。

# vi /etc/sysconfig/docker-storage-setup...VG=docker-storage  

Dockerサービスの起動と自動起動の有効化

# systemctl start docker-storage-setup# systemctl start docker# systemctl enable docker-storage-setup# systemctl enable docker

Docker コンテナの作成

"systemd" が使えるコンテナの作成

普通にCentOSのDockerイメージを使うと "systemd" でD-Bus関連のエラーが出て怒られる。Docker/CentOS Officialの情報に従い、先に対策をしたCentOS7.xのイメージを作成する。

# mkdir ~/centos7_systemd ; cd $_# vi Dockerfile

以下、コピペ "MAILTAINER"は自分に変えれば良いと思う。

FROM centos:7  MAINTAINER "you" <your@email.here>  ENV container docker  RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \  rm -f /lib/systemd/system/multi-user.target.wants/*;\  rm -f /etc/systemd/system/*.wants/*;\  rm -f /lib/systemd/system/local-fs.target.wants/*; \  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \  rm -f /lib/systemd/system/basic.target.wants/*;\  rm -f /lib/systemd/system/anaconda.target.wants/*;  VOLUME [ "/sys/fs/cgroup" ]  CMD ["/usr/sbin/init"]  

で、Dockerfile を元にイメージを作成・・・

# docker build --rm -t local/c7-systemd ~/centos7_systemd

Percona用Dockerfile の作成

次にPercona用のコンテナを作るための Dockerfile を作成する。

# mkdir ~/percona && cd $_;# vi Dockerfile

以下、Dockerfile の記述例、FROMで先に作成した"systemd"対策済みのイメージを指定する。

## Image: percona_baseFROM local/c7-systemd  MAINTAINER pochio## GPG Key importRUN curl -L -O https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7  RUN rpm --import RPM-GPG-KEY-EPEL-7  RUN curl -L -O https://www.percona.com/downloads/RPM-GPG-KEY-percona  RUN rpm --import RPM-GPG-KEY-percona## yum upgrade and install "openssh-server"RUN yum update -y  RUN yum install openssh-server epel-release -y## install persona db repositoryRUN yum install  http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm -y  RUN yum install Percona-XtraDB-Cluster-56 -y## yum cache cleanupRUN yum clean all## Change root passwordRUN echo 'root:root' | chpasswd## Container running serviceCMD ["/usr/sbin/init"]  

コンテナイメージのビルド

Dockerfile を共に叩き台となるコンテナイメージをビルドする。

# docker build -t percona_base ~/percona...Successfully built XXXXXXXXXXXX  

コンテナの作成と起動

Percona XtraDB Cluster には最低3台必要なようなので、コンテナを3つ作る。

# docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=percona1 percona_base

作成したコンテナに入り、systemd コマンドが利用できる事を確認

# docker exec -it percona1 bashdocker# systemctl restart sshd  docker# systemctl status sshd  docker# exit  # docker stop percona1

問題なさそうであれば残りのコンテナも作成する。

# docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=percona2 percona_base# docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=percona3 percona_base# docker stop percona2# docker stop percona3

Dockerの設定変更

Linux/Bridgeを利用して接続出来るように "--bridge=br0" のオプションを追加する。

# vi /etc/sysconfig/docker-network...#DOCKER_NETWORK_OPTIONS=#DOCKER_NETWORK_OPTIONS='-dns 8.8.8.8 -dns 8.8.4.4'DOCKER_NETWORK_OPTIONS='--bridge=br0 -dns 8.8.8.8 -dns 8.8.4.4'  

Dockerサービスの再起動

# systemctl restart docker

コンテナの起動スクリプト

実験用に固定IPを振ってコンテナを起動したいので、適当にスクリプトを作成する。

# mkdir ~/bin ; cd $_# vi percona1.sh

以下、スクリプトの中身

#!/bin/bash -xcontainer_name="percona1"  container_ipaddress="192.168.2.XXX/24"  container_gateway="192.168.2.1"## start containerdocker start ${container_name}## get container pidpid=`docker inspect -f '{{.State.Pid}}' ${container_name}`## create namespace settingsmkdir -p /var/run/netns  ln -s /proc/${pid}/ns/net /var/run/netns/${pid}## get container ip addresss and deleteold_container_ipaddress=`ip netns exec ${pid} ip addr show eth0 | grep inet | egrep -v inet6 | awk '{print $2}'`  ip netns exec ${pid} ip addr del ${old_container_ipaddress} dev eth0## change container ip addressip netns exec ${pid} ip addr add ${container_ipaddress} dev eth0  ip netns exec ${pid} ip route add default via ${container_gateway} dev eth0  

実行権限の付与

# chmod +x ~/bin/percona1.sh

コンテナの起動とアクセス確認

# percona1.sh# ssh 192.168.2.XXX

アクセスできたら同スクリプトを複製して、percona2, percona3 も固定IPで起動する・・・んだけど、作成したスクリプトをデバッグ(bash -x)してみたらブリッジに設定しているセグメントの使用中のIPアドレスを一時的に保持している事がわかった。

※そもそも最初の設定段階で"--bridge=br0"したらコンテナのビルドが出来ずに???となり、tcpdumpしたら"ギャー!"となったのだけど・・・

そもそもコンテナをこういう風に使おうというのが悪いのかもしれないけど(^_^;)少し時間を置いてからまた考える

とりあえず以上