こんにちは。仁科(@nishina555)です。
プログラミングをする過程で以下のようなことを思ったことはありませんか?
- ライブラリやミドルウェアのインストール手順をゼロから確認してみたい
- ローカル環境とは違うOSで挙動を確認してみたい
- まっさらな状態から環境構築をやりなおしたい
検証環境を構築する方法は色々ありますが、今であればDockerを利用する方法が一番簡単で便利だと思います。
そこで、今回はDockerを利用して簡単に検証環境を構築する手順について説明をしたいと思います。
なお、シェルスクリプトを実行する環境構築の方法を具体例に利用します。
目次
「Dockerコンテナにログイン」「コンテナで作業」「コンテナの保存」で検証環境ができる
Dockerを利用した検証環境の構築手順は以下の3ステップとなります。
- Dockerコンテナを立ち上げ、ログインする
- Dockerコンテナ上で環境を構築する
- 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のタグの一覧はこちらから確認できます。
ローカル環境で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コンテナ内で環境を構築していきます。
今回は例としてシェルスクリプトが実行できる環境を構築します。コンテナ内での環境構築はやりたいことに応じて適宜読み替えてください。
- 最低限のコマンドが用意されている(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ファイルを利用した開発環境の構築手順については以下の記事を参考にしてください。
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!