2017年8月4日: Docker on FreeBSD

【ソリューション事業部 スミダ】
ServiceWorkerすごいですね。ブラウザが起動していなくても通知出来るのが革命的ですね。
ブラウザからデスクトップ通知(HTML5 Notification)が出来るといって驚いていたのが、ついこの間の気がしますが・・・
まったくWeb界隈の技術は日進月歩ですね。
さてさて、今回のブログもヤマモトさんに引き続き、技術ネタをお送りします。


コンテナ型の仮想化ソフトウェア「Docker」を今更ながら試してみました。
と、言ってもDockerに関するサイトは腐るほどあって、敢えて私がブログに書いても仕方ないので
その中でもあまり情報がなかった「FreeBSD上でDockerを動かして、コンテナ(FreeBSD)上でapache動かす」までを書いてみます。


FreeBSDではVer10.2以降、もしくはVer11.0以降より実験的にDockerを使えるようになりました。
Dockerと言えばUbuntuやCentOSなどのLinuxが主流ですが、BSDでも「jail」という仮想化の仕組みが古くからあり
それをラップする形で実装、パッケージングされたようです。
では、早速試してみます。
公式サイトに導入手順が乗っているので
それを参考にインストールまで行います。
次に元となるFreeBSDのイメージをDocker hubより探します。
今回は このイメージを使ってみます。
任意のフォルダを作成して下記のようにDockerfile、startup.shの2ファイルを作成します。
※作業はrootでは無く一般ユーザーで行います。wheelに追加しておきましょう。(Linuxはsudoを設定しないと駄目ですが、FreeBSDではwheelグループに参加させるだけでdockerコマンドが使える様です)
Dockerfile

FROM amontalban/freebsd
MAINTAINER DA Sumida
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN set -x && \
echo "127.0.0.1               localhost localhost.my.domain" >> /etc/hosts && \
# ネームサーバーの設定はコンテナ起動時も再度行わないと外部に接続出来ないので注意
echo "nameserver 8.8.8.8" >> /etc/resolv.conf && \
echo ntpdate_enable="YES" >> /etc/rc.conf && \
# localeの設定
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
# portsツリー更新+freebsd-update
portsnap fetch --interactive && \
portsnap extract --interactive && \
portsnap update --interactive && \
freebsd-update fetch --not-running-from-cron && \
freebsd-update install --not-running-from-cron && \
pkg install -y apache24 && \
# ssh接続を有効+rootでのパスワード無しログイン許可
# パスワード設定をDockerfileでするのは面倒なので簡易式です^^;
# 本番環境では秘密鍵認証がベターなんでしょうか
cat /etc/ssh/sshd_config | sed -e 's/^#PermitRootLogin no/PermitRootLogin yes/' | \
sed -e 's/^#UsePAM yes/UsePAM no/' | sed -e 's/^#Port 22/Port 22/' | \
sed -e 's/#Protocol 2/Protocol 2/' | \
sed -e 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' | \
sed -e 's/#PasswordAuthentication no/PasswordAuthentication yes/' > /etc/ssh/sshd_config && \
echo apache24_enable="YES" >> /etc/rc.conf && \
echo sshd_enable="YES" >> /etc/rc.conf
# Apacheの設定ファイル
# 実際にシステム等を動かす場合は、ホストで予め作成しておいて転送するほうが楽です
# COPY ./etc/apache24 /usr/local/etc/apache24
# 起動スクリプトコピー
COPY ./startup.sh /root/
RUN set -x && \
chmod 700 /root/startup.sh
# docker run時に実行する→apacheの起動
# tail -f /dev/nullはdocker runで終了しないためのもの
ENTRYPOINT /root/startup.sh && tail -f /dev/null

startup.sh

#!/bin/sh
## docker runを実行した際に走るシェル
## 
## apache、ssh起動
# nameserver設定
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
# SSH、Apache起動
/usr/sbin/service sshd start
/usr/local/sbin/apachectl start

注意点
・対話モードでインストールが出来ないので、全てを非対話で行う必要があります。(pkg install -y等を利用)
・DockerfileにApacheの起動を記述してもdocker runする際には起動していないので、ENTRYPOINTに別のシェルを実行するようにしました。
次にイメージを作成します

[admin@localhost docker-on-freebsd]$ docker build --no-cache --force-rm=true -t apache/freebsd:latest .

結構時間がかかります。お茶でも入れて待ちましょう。
ビルドが完了すると下記のようにイメージが作成されています。

[admin@localhost docker-on-freebsd]$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
apache/freebsd        latest              ee74a0dd1195        1 hours ago        515 MB

このイメージを元に起動してみます。

[admin@localhost docker-on-freebsd]$ docker run --name apache-freebsd-test  \
-p 8080:80 -p 10022:22 -v \
/etc/localtime:/etc/localtime:ro \
-d apache/freebsd

ホストの8080番ポート→ゲストの80番ポート(apache) ホストの10022番ポート→ゲストの22番ポート(SSH)
としていますので、外部からでも接続できます。
http://[IP]:8080へアクセスしてApacheのウェルカムページが表示されればOKです。
いわずもがな、カーネルを共有するので起動はかなり高速で
ホストの空間を汚さないので、使い捨ての環境としては最適です。
現状社内ではjenkinsと連携して開発・ステージング環境を個別に立ち上げたりといった形でしか運用できていませんが
来週実際に本番運用されているお話を聴く機会があるので、色々吸収してこようと思っています。


さて、次回のブログは「同じ誕生日」繋がりで回してみました。
Aさん、よろしくお願いします!

カテゴリー:
| 投稿者:
DAブログ | DAホールディングス(エクスショップ&ガーデンプラス)

コメント