こんにちは。仁科(@nishina555)です。
以前、Dockerでサクっと検証環境(テスト環境)を構築するための手順でDockerを利用して検証環境を簡単に作成する方法について説明をしました。
記事にもあるように、Dockerコンテナを立ち上げてコンテナ上で作業をすれば簡単に検証環境を構築できます。
しかし、Dockerファイルを利用することでDockerコンテナ上で作業をしなくても環境を構築することができます。
そこで今回はDockerファイルを利用した環境構築の方法について説明をしたいと思います。
なお、ローカルホスト(自分のPC)からssh接続できる環境構築の方法を具体例に利用します。
- Dockerファイルの利用方法について知りたい
- Dockerファイルのメリットについて知りたい
- ssh接続がテストできるDocker環境を構築したい
目次
Dockerファイルとは
DockerファイルとはDockerイメージを作成するための手順が書かれているファイルのことです。
Dockerファイルの中身をみることで「どのような環境が構築されるのか」がわかります。
また、Dockerファイルに環境構築の手順を書いておけば、Dockerコンテナを立ち上げてコンテナ内で環境構築の作業をする必要がなくなります。
そのため、Dockerファイルにはファイルを共有することで同じ開発環境を構築できるというメリットがあります。
Dockerファイルを利用した環境構築手順
Dockerファイルを利用した構築構築の手順は以下の2ステップとなります。
- DockerファイルをビルドしてDockerイメージを作成
- DockerイメージからDockerコンテナを作成
各手順についてこれから説明をしていきます。
1. DockerファイルをビルドしてDockerイメージを作成
まずはDockerイメージの元となるDockerファイルを作成します。
今回は例としてローカルホスト(自分のPC)からssh接続できるDocker環境の構築をしてみます。
Dockerfile
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# For executing shellscript
RUN apt-get install -y git less vim sudo
RUN useradd -m isucon
RUN echo 'isucon:isucon' | chpasswd
RUN usermod -aG sudo isucon
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
DockerファイルからDockerイメージを作成するためにはdocker build
を実行します。
以下のコマンドでは『.(カレントディレクトリ)』にあるDockerファイルを利用して、eg_sshdというイメージ名のDockerイメージをビルドするという意味になります。
$ docker build -t eg_sshd .
ビルドが正常に終了すると、Dockerのイメージ一覧に先ほど作成したイメージが登録されます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
eg_sshd latest e3638bc86aba Less than a second ago 210MB
2. DockerイメージからDockerコンテナを作成
DockerファイルからDockerイメージが作成できたので、今度はDockerイメージからDockerコンテナを立ち上げます。
ここではeg_sshdという名前のDockerイメージを利用してtest_sshdというコンテナ名のDockerコンテナを立ち上げています。
$ docker run -d -p 20022:22 --name test_sshd eg_sshd
-dはバックグラウンド実行をするためのオプションです。
-pオプションの後に[ホストのポート番号]:[コンテナのポート番号]
とすることでポートフォワードの設定ができます。
ここでは、ホスト(自分のPC)の20022番とDockerコンテナの22番が紐づいているという意味になります。
(補足) 作成したDockerコンテナにssh接続する方法
今回具体例として取りあげたDockerコンテナにssh接続する方法について説明をします。
今回、-p 20022:22
と指定したので、ホスト(自分のPC)の20022番とDockerコンテナの22番が紐づいています。
22番はssh接続で使われるポート番号です。つまり、ホスト(自分のPC)の20022番に対してssh接続をすることでDockerコンテナにログインできるということになります。
以下のコマンドでDockerコンテナにssh接続ができます。なお、rootのパスワードはscreencastです。
ssh root@127.0.0.1 -p 20022
もしくは
ssh root@localhost -p 20022
127.0.0.1はローカル・ループバック・アドレスと呼ばれ、自分自身を指す特別なIPアドレスです。localhostという名前で参照されるアドレスと一緒です。
Dockerファイルを編集することでコンテナの環境を変更できる
Dockerファイルの内容を追加・編集することでDockerコンテナの環境を変更することができます。
例えば、Dockerでサクっと検証環境(テスト環境)を構築するための手順で紹介した、『sudo権限のついたユーザーの作成』も行いたい場合は以下のようにDockerファイルに手順を追加します。
Dockerfile
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
+ # Create User
+ RUN apt-get install -y git less vim sudo
+ RUN useradd -m isucon
+ RUN echo 'isucon:isucon' | chpasswd
+ RUN usermod -aG sudo isucon
+ RUN chsh -s /bin/bash isucon
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Dockerファイルをビルドし直し、コンテナを起動させれば一般ユーザー(ここの例ではisuconユーザー)でログインをすることができます。
$ docker build -t ssh_script_sandbox .
$ docker run -d -p 20022:22 --name ssh_script_container ssh_script_sandbox
$ ssh isucon@localhost -p 20022
まとめ
以上でDockerファイルを利用したDokcer環境の構築手順の説明を終わります。おつかれさまでした!
Dockerファイルは自分でゼロから作ってもいいのですが、今回の例のように多くの人が使うであろう汎用的なDockerファイルは公開されていることが多いです。
ですのでDockerで環境を作ろうと思ったら、ネットで調べて再利用できるDockerファイルやDockerイメージがあるのか調べてみるといいです。
公開されているDockerファイルはプログラミングでいうところのライブラリのような位置付けで、活用することで開発コストがグッと減ります。
なお、Dockerファイルをゼロから作成するためのTIPSは以下の記事でまとめているので、興味のある方はご覧になってください。
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!