DockerでTomcatとNginxの構築をやってみた

ゴール

ポート8081を使用してTomcat管理コンソールへの接続確認
ポート8080を使用してNginxへの接続確認
リバースプロキシ設定をして8080ポートを使用してtomcat管理コンソールへの接続確認

前提条件

Dockerがインストールされていること
外部接続可能なネットワークであること

DockerFileの作成

Dockerfile:Dockerイメージの構築手順書みたいなもの

touch dockerfile

vi dockerfile
FROM amazonlinux:latest

RUN yum -y update

RUN rpm -ivh http://nginx.org/packages/rhel/7/noarch/RPMS/nginx-release-rhel-7-0.el7.ngx.noarch.rpm

RUN yum install -y nginx

RUN yum install -y tomcat tomcat-admin-webapps

RUN sed -i -e 's/.*<role rolename="admin-gui"\/>.*/<role rolename="admin-gui"\/>/' /usr/share/tomcat/conf/tomcat-users.xml

RUN sed -i -e 's/.*<role rolename="manager-gui"\/>.*/<role rolename="manager-gui"\/>/' /usr/share/tomcat/conf/tomcat-users.xml

RUN sed -i -e 's/.*<user name="admin".*/<user name="admin" password="tomcat" roles="admin-gui,manager-gui"\/>/' /usr/share/tomcat/conf/tomcat-users.xml

EXPOSE 80
EXPOSE 8080

RUN systemctl enable nginx.service
RUN systemctl enable tomcat.service

FROM:dockerイメージ の指定。1行目を FROM 命令で指定する必要有り
RUN:コマンドの実行
EXPOSE:ポートのエクスポート

rpmrpmパッケージ管理
-i:パッケージをインストール
-v:情報表示を増やす
-h:インストール時の経過を「#」で表示する

sed:文字列の置換
-i:ファイルを直接編集する
-e:スクリプト(コマンド)を追加する

今回のDockerFileでは下記を記述

①直近のAmazonlinuxOSをベースとして構築  
②yumの更新  
③Nginxリポジトリの登録  
④Nginxのインストール  
⑤TomcatとTomcat管理コンソールのインストール  
⑥omcat-users.xmlファイルの編集  
⑦ポート設定  
⑧NginxとTomcatの起動設定  

管理コンソール設定
user:admin
password:tomcat

念の為、既存Dockerプロセスの確認と停止&削除

sudo su -
docker ps
docker stop <DockerID>
docker rm <DockerID>

f:id:hedgehogweeklyreport:20181229130735p:plain

作成したDockerfileを使用してビルド

ls
docker build -t websv - < dockerfile 

docker build:dockerイメージをビルド
-t:名前を付与

上記の場合、'dokcerfile'というdockerfileを指定してwebsvという名前でビルドするという意味になる

f:id:hedgehogweeklyreport:20181229132202p:plain

コンテナ起動

docker run --privileged -itd -p 8080:80 -p 8081:8080 --name WebApp websv /sbin/init

f:id:hedgehogweeklyreport:20181229134518p:plain

docker run:コンテナの起動
--privileged:コンテナに対して拡張権限でを付与
-itd:コンテナをバックグランドで実行
-p:コンテナのポートをホスト側に公開
※8080:80→ホストOS側の8080ポートをコンテナの80ポートに割り当てる

--name:名前の指定
※--name WebApp websv→WebAppという名前でwebsvイメージを使用

/sbin/init:コンテナ起動時に/sbin/initを実行 。
※コンテナ内で複数のプロセスを起動管理したい場合に使用

コンテナID確認&コンテナ内部への接続確認

docker ps
docker exec -it <DockerID> /bin/bash
pwd
uname -n

docker exec:対象のコマンドを実行する
-it:標準入力で操作する
/bin/bashbashプロセスを新規で立ち上げ

f:id:hedgehogweeklyreport:20181229135619p:plain

結果は画像の通り bashプロセスでDocker内部を操作が出来るようになっています
uname -nコマンドで出力される結果がコンテナIDになるのが面白い

Nginxとtomcatのステータス確認

systemctl status Nginx
systemctl status tomcat

f:id:hedgehogweeklyreport:20181229135945p:plain

因みにexitで抜けれます

ブラウザで接続確認

EC2のパブリックIP:8080でNginx

f:id:hedgehogweeklyreport:20181229140343p:plain

EC2パブリックIP:8081/manager/html

f:id:hedgehogweeklyreport:20181229140641p:plain

いけてますね。この猫久々に見た

リバースプロキシ設定

コンテナ内部に接続してNginxのconfファイルを編集

docker exec -it <DockerID> /bin/bash
cd /etc/nginx/conf.d
ls
cp -pi default.conf default.conf_org
vi default.conf

下記がデフォルトのconfファイル

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

設定追記 ※IP:ポート/tomcatで接続できるように設定

    location /tomcat {
        proxy_pass http://localhost:8081/manager/html;
    }

Nginx再起動

systemctl restart nginx

接続確認 EC2パブリックIP:8080/tomcat

f:id:hedgehogweeklyreport:20181229150724p:plain

一応いけた
ただ、まだこれだけじゃ不十分...