こんにちは、学生アルバイトのkoyamaです。今回は最近巷で何かと耳にするDockerを触っていこうと思います。

DockerでUbuntu日本語環境を作成する

まずはまっさらなUbuntuのイメージを引っ張ってきます。今回はUbuntuのバージョンは18.04とします。
$ docker pull ubuntu:18.04
これでubuntuのイメージを引っ張ってこれました。次にイメージがあるかを確認しましょう。
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               2eb2d388e1a2        5 days ago          64.2MB
引っ張ってきたubuntuのイメージを元にコンテナを稼働します。
$ docker run -it -d ubuntu:18.04 bash
-dオプションをつけることでコンテナをバックグランドで実行させることができます。 実際に稼働しているか確認するためにdocker psで稼働できているかを確認します。
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d0cf6efb116e        ubuntu:18.04        "bash"              2 seconds ago       Up 2 seconds                            beautiful_ramanujan
では稼働しているコンテナのターミナルに入ってみましょう!
$ docker exec -it beautiful_ramanujan bash
とりあえず言語設定を確認してみます
$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
今は完全にまっさらな状態なので、ここから日本語環境を整えて行こうと思います。日本語化するために、パッケージのアップデート、日本語パッケージのインストール、言語設定の更新、環境変数の設定を行います。
$ apt-get update
$ apt-get install -y language-pack-ja-base language-pack-ja locales
$ locale-gen ja_JP.UTF-8
$ echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
$ source ~/.bashrc
ここで言語設定を再度確認してみましょう!
$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
確かに日本語環境が出来上がっているのが確認できました!コンテナを離れるときはexitを打てば離れられます。 次に先ほど作った日本語環境のコンテナをイメージとして保存してみましょう。 イメージとして保存する際にはdocker commit ${コンテナ名} ${任意のイメージ名・タグ名}とします。
$ docker commit beautiful_ramanujan test:jp_env
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                jp_env              8e6de6ffef67        11 seconds ago      118MB
ubuntu              18.04               2eb2d388e1a2        5 days ago          64.2MB
今回作ったコンテナがイメージとして保存されているのが確認できました。 ついでにDockerでよく使うコマンドを↓の表にまとめてみました。
イメージを確認するとき $ docker images
イメージを稼働させるとき $ docker run ${イメージID} ${起動する時のシェルを指定}
稼働しているコンテナを確認する時 $ docker ps
稼働しているコンテナのターミナルに入る時 $ docker exec -it ${コンテナIDorコンテナ名}
稼働しているコンテナのターミナルに入る時 $ docker exec -it ${コンテナIDorコンテナ名}
稼働しているコンテナを停止する $ docker stop ${コンテナIDorコンテナ名}
再稼働したい場合 $ docker start ${コンテナIDorコンテナ名}
コンテナを消去するとき $ docker rm ${コンテナIDorコンテナ名}
イメージを消去するとき $ docker rmi ${イメージID}

Dockerfileで高速環境構築

最後にDockerfileを使って効率的に環境構築を行う方法を紹介します。 Dockerfileはイメージの環境を構築するためのコマンドをこのファイルに書き込むことでイメージを作成するときにすでに必要な環境が出来上がるようになる優れものです。

今回行った日本語化の内容をDockerfileに書き込んで日本語化されたイメージを作成してみましょう。
$ vim Dockerfile

#ubuntuの18.04の最小イメージから構築
#まっさらな状態からの場合はscratchとする
FROM ubuntu:18.04
#イメージ作成時にRUNで事前にコマンドラインを実行できる
#パッケージリストを更新
RUN apt-get update
#日本語化パッケージリストをインストール
RUN apt-get install -y language-pack-ja-base language-pack-ja locales
#localeを日本語設定に変更
RUN locale-gen ja_JP.UTF-8
#言語を日本語に設定
ENV LANG ja_JP.UTF-8

作ったDockerfileを元にtest:dockerfileという名前・タグでイメージを作成します。$ docker build -t ${任意のイメージ名・タグ} ${Dockerfileがある場所}というふうにしてイメージ名とDockerfileの場所を指定しておきます。buildコマンドは指定したディレクトリのDockerfileという名前のファイルを読み取るので、環境ごとにディレクトリを切り分ける必要があります。

$ docker build -t test:dockerfile ./
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                dockerfile          9469a78864d2        8 seconds ago       118MB
作成されたイメージを稼働させてみればDockerfileの内容がイメージに反映されているのが確認できます。
$ docker run -it test:dockerfile bash
$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
Dockerは開発の時に環境を素早くリセットできたり、本番環境と開発環境の差異を小さくできたりと何かと便利なツールなので、積極的に活用して身に付けたい技術ですね。
Pocket