最近 Docker によるコンテナに興味がわいて触り始めました。
これまでは仮想マシン推しだったのですが、環境の再構成や配布といった点でコンテナの方が都合が良さそうな場面も多く感じたことが理由です。
Docker とは
Docker が提供してくれる利便性については各所で説明されています。ここでは、 Docker はコンテナと呼ばれるものに環境ごとを閉じ込めて、実行させるものと考えています。
また環境を閉じ込めて実行させるものという点のみをみると、仮想マシンが提供するものと同じなのですが、コンテナの方は以下のようなメリットもあります。
- 動作が軽量
- コンテナサイズが小
こういった点から開発環境をコンテナで構築して使用するといった用途に使われたりします。環境が閉じているのでこれを実環境にデプロイでき、開発と実環境の差異によるトラブルも最低限になったりします。
初めてのコンテナ起動
ここでは CentOS 1708 をインストールした環境で初めてのコンテナを起動するまでを説明します。
インストール手順
CentOS 1708 の時点であっても、 yum(dnf) でインストールできるものは古いため以下のようにして新しいものをインストールするようにしました。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce sudo systemctl start docker sudo systemctl enable docker
コンテナ起動
コンテナを作成してコンテナ内の Bash シェルを起動してみます。
以下のコマンドを実行すると、コンテナで bash が起動してそのシェルに接続されます。
sudo docker run -it --name hello centos:7 /bin/bash
起動したシェルから抜けるには、「Ctrl+P, Ctrl+Q」 と入力します。シェルを Ctrl+D で抜けると、コンテナで起動したシェルが終了するため、コンテナもまた終了状態となります。
環境を作る
こうやって作ったコンテナのなかで、必要なものをインストールして環境を整えていきます。このときに、何をやったのかをメモをとりつつ作業をするのをオススメします。
というのもコンテナにどのようなことを行って環境を作ったのかを設定ファイルのようなものに記述することによって、
その設定ファイル+αのものを配布するだけで、受け取った人が同じ環境を構築することができるようになるからです。この設定ファイルは Dockerfile と呼ばれます。
作ったコンテナのイメージをそのままエクスポートして、それを渡すと言うこともできるので Dockerfile の作成は必ずしも必要ではありません。
Docker で Samba
あまり需要がないのかもしれないですが、 Docker で Samba を起動させるものを作ってみました。
必要なものも少なめだったので、初めて Dockerfile を作るには易しい部類のものになるかなと思いました。
以下のような Dockerfile になっています。
FROM alpine:3.6 MAINTAINER techlabxe RUN apk update RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime RUN apk add samba COPY smb.conf /etc/samba/smb.conf COPY samba_users.txt . RUN cat samba_users.txt | awk '{print "adduser -D ", $1}' | /bin/sh RUN cat samba_users.txt | awk '{print "(echo ",$2,"; echo ",$2,") | pdbedit -a ",$1, "-t" }' | /bin/sh RUN rm samba_users.txt ENTRYPOINT smbd --foreground EXPOSE 445
ベースとなるのは CentOS ではなく alpine linux のものとしました。こちらのほうがサイズが軽量だからです。
Dockerfile と同じ場所に samba_users.txt というファイルを用意しておきます。こちらにはユーザー名とパスワードを記入しておきます。
スペース区切りで以下のような感じのファイルです。
myuser mypasswd
このファイルを読み取ってユーザー作成、パスワードの設定を行っています。
生パスワードを記述しているので、気になるポイントではありますが、ここをなんとかするのは今後の課題といったところでしょうか。
この Dockerfile からイメージを作成するには、Dockerfile のあるディレクトリで以下のように実行します。
sudo docker build -t Samba .
この作ったイメージからコンテナを起動するには以下のようにします。ここで必須なのが、ポートの関連付けです。これを忘れると外部から繋がりません。
また、共有ファイルをずっと保持させておくために、ホスト上のディレクトリをマウントさせておきます。
smb.conf ファイルには /home/smb を共有するように書いているため、以下のような指定のさせ方になります。
sudo docker run -it -d -p 445:445 --name samba_exec -v /home/share:/home/smb Samba
あとは外部の Windows から このコンテナが動いているホストの IP アドレスを入力してファイルが見えるかを確認します。
Netbios も必要ならば、ポートの設定を追加してください。
最後に
今回の Samba の Dockerfile らですが、 GitHub のほうへあげてあります。
https://github.com/techlabxe/samba_docker
今更ですが Docker Hub をみてみると samba だけでも割と登録数がありました。 日本語で検索して記事が無いと言う点だけで samba も登録がないと思い込んでしまっていました。
そちらのほうにはより使い勝手のよさそうなものが上がっているようなので、ちゃんとやりたい方はそちらを探してみるとよさそうです。
手抜きして自分だけが共有使えればいい、という点だと今回自分が作ったものも候補としてアリかなと思っています。