Vagrantfileと初期設定スクリプトメモ(Docker最小構成版)
ローカルPCで開発とかする時に、Docker環境が欲しくなった時のVagrantでの環境構築スクリプトです。よく忘れるので頻繁に使うVagrantfileのサンプルと初期構築スクリプトを自分用のメモ程度に残そうと思います。
サンプルなので定義は適当です。
# -*- mode: ruby -*- # -*- encoding: utf-8 -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "centos/7" config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true config.vm.synced_folder '.', '/vagrant', disabled: true # デフォルトの共有をOFF config.vm.synced_folder 'E:\vbox_share', '/media/sf_vbox_share' config.vbguest.auto_update = true config.vm.define :server1 do | server1| server1.vm.hostname = "devsrv001" server1.vm.network :private_network, ip:"192.168.33.11", virtualbox__intnet: true server1.vm.provider "virtualbox" do |v| v.cpus = 2 v.memory = 2048 end server1.vm.provision :shell, path: "setup.sh" end # 2台目以降の定義はほとんど同じなので省略 ・・・ end
provisionで使う初期設定用のスクリプトです。Vagrantfileと同じディレクトリに配置します。
#!/bin/bash
# パッケージ更新&インストール
sodu yum -y update
sudo yum -y reinstall glibc-common# ロケール追加
sudo localedef -f UTF-8 -i ja_JP ja_JP# ロケールの設定
sudo localectl set-locale LANG=ja_JP.UTF-8# タイムゾーンの変更
sudo timedatectl set-timezone Asia/Tokyo# 日本語キーマップの設定
sudo localectl set-keymap jp106# 追加パッケージインストール
sudo yum -y install man-pages-ja
sudo yum -y groupinstall "Development Tools"
sudo yum -y install git
sudo yum -y install openssl-devel readline-devel zlib-devel
sudo yum -y install epel-relase
sudo yum -y install python-devel sshpass
sudo yum -y install yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce# dockerの初期設定
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker vagrant
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パッケージをインストールします。
ethwe0@if18の10.32.0.1がホストco1のIPアドレスです。
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
...
co2も同様に作業します。
co2のIPアドレスは10.44.0.0のようです。
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
...
GNOME入りCentOS7のカスタムVagrant Boxファイル作成
CentOS7に開発系のツールを入れてGNOME上で作業している環境をVagrant向けにBox化した時の手順です。
かなりサイズがでかいのでVagrant向きでもないですが、メンテナンスを統一しておきたかったのであえて作成しました。
今回CentOS7はインストール済みで、自分が必要と思ったパッケージのみを導入後にオリジナルのBoxファイルを作成し、vagrantに展開して起動するところまでを一気に書きます。
この作業自体ググればいろいろ解説があるのですが、ここにでは自分専用(自分が作業した分だけ)の解説のみにとどめます。
実際作業してみて不足しているところは他のサイトを参考にして適当に作業してください。
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 virtualenvwrapperwhich virtualenvwrapper.sh #出力されたパスを控えておいて、.bash_profileに以下の定義を追加。
vi .bash_profile
・・・
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
fisource .bash_profile
mkvirtualenv ansible_env
Ansibleのインストール
作成した仮想環境上にAnsibleをインストール。
workon ansible_env
pip install ansible
ansible --version
deactivate