Dockerでサクっと検証環境(テスト環境)を構築するための手順

インフラ

こんにちは。仁科(@nishina555)です。

プログラミングをする過程で以下のようなことを思ったことはありませんか?

  • ライブラリやミドルウェアのインストール手順をゼロから確認してみたい
  • ローカル環境とは違うOSで挙動を確認してみたい
  • まっさらな状態から環境構築をやりなおしたい

検証環境を構築する方法は色々ありますが、今であればDockerを利用する方法が一番簡単で便利だと思います。

そこで、今回はDockerを利用して簡単に検証環境を構築する手順について説明をしたいと思います。
なお、シェルスクリプトを実行する環境構築の方法を具体例に利用します。

「Dockerコンテナにログイン」「コンテナで作業」「コンテナの保存」で検証環境ができる

Dockerを利用した検証環境の構築手順は以下の3ステップとなります。

Dockerで検証環境を作成する手順
  1. Dockerコンテナを立ち上げ、ログインする
  2. Dockerコンテナ上で環境を構築する
  3. Dockerコンテナをcommitし、Dockerイメージとして保存する

各手順についてこれから説明をしていきます。

1. Dockerコンテナを立ち上げ、ログインする

まずは検証環境となるDockerコンテナを立ち上げます。

Dockerコンテナとは自分のPC上にある仮想環境のことです。
Dockerコンテナを立ち上げ、コンテナ内にログインするためには以下のコマンドを実行します。

$ docker run -it [利用したいイメージ] /bin/bash

なお、オプションの意味は以下のようになっています。

オプション 意味
-i 標準入力を開いたままにする
-t 擬似ttyに接続する。

つまり、Dockerコンテナを立ち上げてコンテナ内で操作をしたい場合に-iと-tのオプションを同時に利用します。

今回、ubuntuのDockerイメージからshell_containerというコンテナ名のDockerコンテナを作成しようと思います。
その場合は以下のようなコマンドになります。

$ docker run -it --name shell_container ubuntu /bin/bash

なお、Dockerイメージのバージョンはタグ名で識別されており、[イメージ名]:[タグ名]のように記述することでイメージのバージョンを指定することができます。

例えばubuntu:17.10のように記載すると17.10のubuntuのイメージを利用することになります。タグを指定しなければ最新(latest)のイメージが利用されます。
ubuntuのタグの一覧はこちらから確認できます。

ローカル環境でDockerのプロセスを確認するとshell_containerというコンテナが立ち上がっていることがわかります。

$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS               NAMES
d741b0a9e2dd        ubuntu              "/bin/bash"         Less than a second ago   Up 9 seconds                            shell_container

2. Dockerコンテナ上で環境を構築する

docker run -itでDockerコンテナに入ったら、実際にDockerコンテナ内で環境を構築していきます。

今回は例としてシェルスクリプトが実行できる環境を構築します。コンテナ内での環境構築はやりたいことに応じて適宜読み替えてください。

今回作成するDockerコンテナの環境
  • 最低限のコマンドが用意されている(vim, less, gitなど)
  • sudo権限をもつ一般ユーザーがいる
  • bashがログインシェルに設定されている

必要なコマンドのインストール

まずは必要なコマンドをインストールします。
ベースとなるDockerイメージにもよりますが、Dockerコンテナはまっさらの環境のため基本的なコマンドも用意されていないことが多いです。

今回、Dockerコンテナを作成するために利用したubuntuイメージの環境にも基本的なコマンドも用意されていないため、インストールします。

[root]
$ apt-get update && apt-get install -y git less vim sudo

sudo権限をもつユーザーを作成する

シェルスクリプトを実行する、sudo権限を持ったユーザーを作成していきます。ここでは例としてisuconというユーザーを作成します。

useraddで一般ユーザーを作成し、passwdでユーザーのパスワードの設定を行なっていきます。
なお、-mオプションはユーザーのホームディレクトリを作るためのオプションです。

[root]
$ useradd -m isucon
$ passwd isucon

idコマンドでユーザー情報を確認できます。

[root]
$ id isucon

uid=1000(isucon) gid=1000(isucon) groups=1000(isucon)

次に先ほど作成した一般ユーザーにroot権限を与えます。
usermodは-aオプションがないと追加ではなく上書きになるので注意が必要になります。

[root]
$ usermod -aG sudo isucon
もしくは
$ gpasswd -a isucon sudo

再度ユーザー情報を確認するとsudo権限が付与されたことがわかります。

[root]
$ id isucon

uid=1000(isucon) gid=1000(isucon) groups=1000(isucon),27(sudo)

なお、ルートユーザーからisuconユーザーに変更する場合は以下のようにします。

$ su - isucon

ログインシェルを変更して「矢印」で「ABCD」とならないようにする

isuconユーザーに変更後、ターミナルで矢印キーを押すと以下のようになるかもしれません。

$ ^[[A^[[B^[[C^[[D

シェルを確認すると/bin/shとなっています。

$ echo $SHELL

/bin/sh

ログインシェルをbashに変更することで矢印キーがうまく動作しない問題は解決します。
以下のコマンドではisuconユーザーのログインシェルを/bin/bashに変更しています。

[root]
$ usermod -s /bin/bash isucon

シェルスクリプトをDockerコンテナで試してみる

ここまででシェルスクリプトを実行する環境を整えることができたので実際にスクリプトを作成していきます。

ここではmkdirを実行する簡単なスクリプトを作成します。

mkdir_test.sh

SUDOPASS=isucon
echo "${SUDOPASS}" | sudo -S mkdir -p /mkdir_test_root
mkdir -p "$HOME/mkdir_test_isucon"

なお、2行目の部分はsudo権限が必要なコマンドをシェルスクリプトで実行するための書き方です。

シェルスクリプトに実行権限を与えて、実行します。

$ chmod +x mkdir_test.sh
$ ./mkdir_test.sh

isuconのホームディレクトリと、ルートディレクトに新しくディレクトリが作成されていればOKです。

3. Dockerコンテナをcommitし、Dockerイメージとして保存する

検証が済んだらDockerコンテナを破棄すればいいのですが、再利用する可能性がある場合はDockerコンテナの状態を保存しておいたほうがいいです。

ここでは先ほど作成したDockerコンテナの環境を保存する方法について説明します。

まずはDockerコンテナからログアウトします。ctrl + p + ctrl + qでログアウトできます。
なお、ログアウトのショートカットキーの変更方法したい場合はDockerコンテナのログアウトを楽にするを参考にしてください。

Dockerコンテナの状態を保存する場合はdocker commitを利用します。
docker commitをすることでDockerコンテナの状態がDockerイメージとして保存されます。

例えば、shell_containerをshell_sandboxというイメージ名でcommitする場合は以下のようにします。

$ docker commit shell_container shell_sandbox

コミット後、Dockerイメージの一覧を確認すると、新しくDockerイメージが作成されていることがわかります。

$ docker images 

REPOSITORY                         TAG                 IMAGE ID            CREATED                  SIZE
shell_sandbox                      latest              cb7798f78641        Less than a second ago   276MB

例えば、以下のようなコマンドを実行することで今回作成したDockerイメージからコンテナが立ち上がり、同じ環境を再利用できます。

$ docker run -it shell_sandbox /bin/bash

まとめ

以上でDockerを利用した検証環境の構築方法の説明を終わります。おつかれさまでした!
docker runで簡単にコンテナが作成できますし、docker commitでDockerコンテナの環境を再利用することが可能です。

自分も「ちょっと試したいことあるなー」と思うことがあればdocker run -itでDockerコンテナを立ち上げて、コンテナ内で動作検証をよく行なっています。

今回は説明しませんでしたが、Dockerコンテナで行なった環境構築の手順をDockerファイルに記述することで複数人で検証環境を共有することもできます。
Dockerファイルを利用した開発環境の構築手順については以下の記事を参考にしてください。

Dockerファイルの使い方は?具体例で学ぶ、他人が作った環境を共有する方法

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!