こんにちは、Яeiです。
今回は現役エンジニアの私が、Dockerを用いて簡単なJavaの環境構築を行う方法について解説していきたいと思います。
サーバサイドのプログラミング学習をする際に面倒なポイントの一つとして「環境構築」があると思います。
プログラミングを勉強したいのに、環境構築でつまずいて勉強欲を削がれた経験は誰しもあるのではないでしょうか。
今回は、普通に環境構築するのではなくDockerを用いて環境構築を行いたいと思います。
これによって、Dockerfileをコピーするだけで、基本的には誰でも簡単にJava環境を構築できるようになります。
また、環境を仮に壊してしまったとしても、すぐに再作成することができるのもポイントとなります。
目次
Docker
本記事では特に触れませんが、仮想環境を簡単に作成するためのツールとなります。
VMwareのような仮想化とは異なりコンテナ型の仮想化とくくられておりまして、ホストOSとカーネルを共有するなどの違いが出てきます。
また、dockerで作成する環境はLinux想定となります(ホストOSとカーネルを共有する都合上、Windows環境は作れない)。
そのため、dockerをインストールするにはLinuxではないといけないのですが、WindowsまたはMacでも利用可能にする以下のようなツールもあります。
(内部で軽量のLinux環境を構築してDockerを動かしているとか)
・Docker Desktop for Windows
・Docker Desktop for Mac
・Docker Toolbox
※ Docker Desktopの方が新しいのでこちらを使いたいものですが、私の環境ではこれが使えなかったのでDocker Toolboxを利用しております。
Dockerを使ってJava環境の構築
dockerの操作
まずはdockerを使うのに、少しだけdockerの使い方を見ていきたいと思います。
dockerの基本は「イメージを作成して、そのイメージを元にコンテナを起動する」というものです。
「コンテナ」が「サーバ」に相当するものだと思っていて下さい。
(AWSのAMIがイメージ、EC2がコンテナのような感じです)
つまり、イメージを作成してしまえば、コンテナの作成は簡単にできますし、イメージを共有すれば誰でも同じ環境を構築できます。
少し例を見てみましょう。
例えば「今Cent OSを使っているけどサポート終了するし、次なるディストリビューション選定のためにAmazon Linuxを使いたいな」
といった場合に以下のようなコマンド一つでAmazon Linux環境がぽんっと作成できます。
$ docker container run -it amazonlinux:latest bash
「amazonlinux:latest」はDocker Hubにあるイメージの最新版を指定しております。
dockerの優れている点は、こうしたイメージを各企業さんがすでにたくさん作ってくれているところになります。
Javaの環境も実はすでに用意されているのですが、ここでは知らないふりをして自分で構築していきたいと思います。
Amazon Linux環境構築
それでは、まずは試しにAmazon Linux環境を簡単なものですが構築してみたいと思います。
まずはコンテナのイメージを作成していきたいと思います。
コンテナのイメージは「Dockerfile」と呼ばれる定義ファイルをビルドすることで作成できます。
例えば以下のようなDockerfileを作成します(Amazon Linuxの簡単な環境構築)。
FROM amazonlinux:latest
# install groupadd, useradd
RUN yum install -y shadow-utils
# install sudo
RUN yum install -y sudo
# adduser
RUN sudo adduser papakoletter
# timezone
ENV TZ='Asia/Tokyo'
当記事で紹介するDockerfileは分かりやすさ重視で記載しているのであまり現実的な記載ではありません。
具体的には「RUN」は複数書くとその分だけレイヤーと呼ばれるものが積み重なる仕様で、最終的なイメージサイズが大きくなります。
そうすると、コンテナ起動までが時間がかかってしまうのです。
本記事においては可読性のために、このような記載にしますが本番運用するなどの場合はおすすめしません。
これに対して次のようにイメージビルドを行うと、このDockerfileを元にイメージが作成されます(-t でイメージ名を指定します。これは何でもよいです)。
$ docker image build . -t testamazon
できあがったイメージの結果は以下のコマンドで確認可能となります。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testamazon latest 028a4b99f914 12 seconds ago 681MB
amazonlinux latest 53ef897d731f 4 weeks ago 163MB$ docker images
イメージができれば次のコマンドで簡単にコンテナを作成(起動)することができます。
$ docker container run -it testamazon bash
これでAmazon Linux環境を構築することができました。
コンテナから出るときは「exit」コマンドで抜けることができます。
Javaの環境構築
ここまではOSに関する設定を行ってきましたので、次にJavaを利用するためにJDKの設定を行っていきましょう。
今回はAmazon Corretto11で試してみたいと思います。
まず、先ほど起動したコンテナ上でJDKをインストールしてJavaを利用してみましょう。
(ここで実施した手順を後ほどDockerfileに転記してDockerfileを作成します)
$ sudo yum install java-11-amazon-corretto
これでAmazon Corretto11が入ったと思いますので以下のコマンドを入力して試してみましょう。
$ java -version
openjdk version "11.0.11" 2021-04-20 LTS
OpenJDK Runtime Environment Corretto-11.0.11.9.1 (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.11.9.1 (build 11.0.11+9-LTS, mixed mode)
特に問題なさそうですね。
これでJavaが使えるようになったと思いますので適当なディレクトリで以下のサンプルファイルを作成してみましょう。
ありきたりなサンプルプログラムですね。
public class Sample{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
ここで、このコードをコンパイルしてみましょう。
$ javac Sample.java
これでコンパイルされて中間コードが作成されたと思うので以下で確認してみましょう。
$ java Sample
Hello World!
これにて簡単なJava環境が構築できたわけです。
ついでに、ここまでの作業をDockerfileにまとめると次のようになります。
FROM amazonlinux:latest
# install groupadd, useradd
RUN yum install -y shadow-utils
# install sudo
RUN yum install -y sudo
# adduser
RUN sudo adduser papakoletter
# timezone
ENV TZ='Asia/Tokyo'
# encoding
RUN sed -i "s/en_US.UTF-8/ja_JP.UTF-8/g" /etc/sysconfig/i18n
# install jdk
RUN yum install -y java-11-amazon-corretto
#WORKDIR /root
USER papakoletter
WORKDIR /home/papakoletter
COPY --chown=papakoletter:papakoletter ./Sample.java /home/papakoletter/Sample.java
RUN javac ./Sample.java
念のため動作確認をしてみましょう。
先ほどと同様にイメージビルドしてコンテナ起動してみましょう。
$ docker image build . -t testamazon
$ docker container run -it testamazon bash
先ほどとの違いは、ユーザ追加して、そのユーザでログインしている点となります。
$ java Sample
Hello World!
Tomcatのインストール
Javaの勉強をするにあたって、ついでにTomcatもインストールしておきましょう。
FROM amazonlinux:latest
# install groupadd, useradd
RUN yum install -y shadow-utils
# install sudo
RUN yum install -y sudo
# adduser
RUN sudo adduser papakoletter
# timezone
ENV TZ='Asia/Tokyo'
# encoding
RUN sed -i "s/en_US\.UTF-8/ja_JP\.UTF-8/g" /etc/sysconfig/i18n
# install jdk
RUN yum install -y java-11-amazon-corretto
RUN yum -y install wget
RUN yum -y install tar.x86_64
RUN yum -y install procps
USER papakoletter
WORKDIR /home/papakoletter
COPY --chown=papakoletter:papakoletter ./Sample.java /home/papakoletter/Sample.java
RUN javac ./Sample.java
RUN wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-9/v9.0.46/bin/apache-tomcat-9.0.46.tar.gz
RUN tar -xzvf ~/apache-tomcat-9.0.46.tar.gz
RUN ln -s ~/apache-tomcat-9.0.46 ~/tomcat
EXPOSE 8080
このイメージをビルドしてコンテナ起動するとTomcatコンテナが作成されます。
以下のコマンドでTomcat起動してみましょう。
$ /home/papakoletter/tomcat/bin/startup.sh
ここで、基本的には、
http://localhost:8080
でアクセスが可能ですが、Tool Boxを利用している場合は問い合わせ方法が異なりまして次のようになります。
http://192.168.99.100:8080
例:http://192.168.99.100:8080/examples/
docker後処理
最後に後処理をしておきましょう。
イメージのビルドを繰り返しているとイメージのゴミがたまっていきます。
そこで、定期的に「docker image prune」コマンドを実行しておきましょう。
また、コンテナについても同様で「docker container prune」を実行しておきましょう。
これで、今は使っていないものが削除されます。
その他、結構よく使う便利なコマンドは以下の通りとなります(他にもまだまだありますが、いったん直近よく使いそうなものをピックアップしております)。
docker images : イメージ一覧の表示
docker container ls -a : コンテナ一覧の表示
docker ps : コンテナ状態の表示
docker cp container_name:path localpath : コンテナからローカルへファイルのコピー(指定を逆にすることでコンテナへコピーすることも可能)
docker inspect container_name : コンテナの詳細情報を表示
docker container rm -f container_name : コンテナの削除
docker image rm -f image_name : コンテナイメージの削除
docker history image_name : イメージがどのように作成されたかのヒストリー表示
当記事は以上となります。
Dockerfileを一度作ってしまうとあとはそれがあれば基本的にいつでも環境を構築することができます。
公式イメージとしてはPythonイメージなどもあれば、Prometheusイメージなど、用途の多岐に渡ります。
今後、ますます利用機会が増えると思いますので是非覚えておきたいですね。
長々とお疲れさまでした!
javaとtomcatの環境構築を作りたくて参考にさせていただきました。
dockerfileの読み込み時にこのようなエラーが発生して、原因などご存知でしょうか?
> [ 8/15] RUN yum -y install tar.x86_64:
#11 0.320 Loaded plugins: ovl, priorities
#11 4.183 No package tar.x86_64 available.
#11 4.228 Error: Nothing to do
エラー内容はパッケージが見つからないことによるものと思われます。
例えばですが「tar.x86_64」を「tar」に変更しても事象改善されませんでしょうか?
また、これでもダメな場合、「No package available」で検索されますと改善策はいくつか出てくると思われます。
(yumによるパッケージインストールでわりと良く発生する事象のため)
また、当件と関係ありませんが、当ブログで掲載しているsampleのDockerfileのTomcatバージョンですが、
現在46は削除されており(?)、最新は56となってますのでこちらも適宜直して頂ければと思います。
ご返信感謝します。
tar.x86_64をtarに変更してTomcatのバージョンを56に変更したところ,
起動はできました。ありがとうございます!