茶の間で読めるITチップス

情報セキュリティ、ITの便利用途など直ぐに役立つ知見を発信してきます!

DockerでjavaのWeb環境構築

前回DockerとRailsでWeb環境を作って開発しようとしたが上手くいかず挫折・・・

社内の新人研修や業務でも使用経験のあるjavaで環境構築することにした。

 

この記事の目標

①DockerImageのAlpinelinux内で環境構築

②Dockerfileで、Docker + javaのWeb環境を構築

③Dockerfileをローカルにコピってローカルでも同じ環境を構築

環境

①②

cloud9

Ubuntu 18.04.3 LTS

・Docker version 19.03.5

自宅PC

Ubuntu 16.04.6 LTS

・Docker version 18.09.7

今回こそ環境構築を終わらせたい!終わらせないとポートフォリオ作成が進まないし。

①DockerImageのAlpinelinux内で環境構築

DockerでAlpinelinuxを起動

ubuntu:~/environment/sample_ruby $ sudo docker run -it alpine:edge /bin
/sh

 以下はjava8とtomcat9をダウンロードして、tomcatを実行

/ # apk update
/ # apk add openjdk8
/ # apk add curl
apache-tomcat-9.0.30.tar.gz
/ # tar -xvzf apache-tomcat-9.0.30.tar.gz
/ # mv apache-tomcat-9.0.30 /opt/tomcat/
/ # /opt/tomcat/bin/startup.sh

tomcatの実行確認

htmlが表示されたのでOK

tomcatとAlpinelinuxを終了。

/ # /opt/tomcat/bin/shutdown.sh
/ # poweroff

なぜかAlpinelinuxが終了しないので、docker stopで終了。

次は今まで実行したコマンドを並べたDockerfileを作成する。

Dockerfile

FROM alpine:3.10
RUN apk update
RUN apk add openjdk8
RUN apk add curl
RUN wget http://ftp.riken.jp/net/apache/tomcat/tomcat-9/v9.0.30/bin/
apache-tomcat-9.0.30.tar.gz
RUN tar -xvzf apache-tomcat-9.0.30.tar.gz
RUN mv apache-tomcat-9.0.30 /opt/tomcat/

sample_javaフォルダにDockerfileを配置して実行。

ubuntu:~/environment $ cd sample_java
ubuntu:~/environment/sample_java $ docker build -t java:1 .
ubuntu:~/environment/sample_java $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
java 1 db8cceaee00d 15 seconds ago 150MB
alpine edge 60d63d8e1431 4 weeks ago 5.6MB
alpine 3.10 965ea09ff2eb 7 weeks ago 5.55MB

 お!javaイメージが出来上がっているので、実行。

ubuntu:~/environment $ docker run -it java
root@f6b22fd6b81a:/# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2~bpo8+1-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)

というわけで今回はjavaのWeb環境構築でした〜

次はSpringBoot使って実際にWebアプリを作ろうと思います!

DockerでRailsの開発環境を作ってみる(その①)

cloud9でrailsの開発をしていたが、自分が普段使っているエディターで開発したいこともあり、ローカルにDockerとrailsの環境を作ることにしました。

 

環境情報

自宅PC

Ubuntu 16.04.6 LTS

・Docker version 18.09.7

cloud9

Ubuntu 18.04.3 LTS

・Docker version 19.03.5

Docker基礎知識

少し前にDockerをインストールして放置だったので、まずはDockerの再勉強から始めた。

下記のサイトを参考。

Docker入門(第一回)~Dockerとは何か、何が良いのか~ | さくらのナレッジ

 

自分なりにまとめてみる。

Dockerの良さ

仮想マシンはゲストOSを用意して動かすが、DockerはホストOSは共有して、プロセスとユーザーを隔離してマシンが複数あるかのように動かすため軽量。

・環境設定をコード化したファイルを作成できるので、どこでも同じ環境が作れる。

・CIツールと組み合わせて、自動ビルド&デプロイ&テストができる。

Dockerインストール

下記を参考にインストールした。

Ubuntuにdockerをインストールする - Qiita

Rails環境構築

こっからは、実際にcloud9内で環境を作っていきます!

下記を参考に進めていきます。

DockerでRuby on Railsの開発をしよう - Qiita

 以下の作業フォルダを作る。

 
ubuntu:~/environment $ mkdir sample_ruby
ubuntu:~/environment $ cd sample_ruby
ubuntu:~/environment/sample_ruby $ touch docker-compose.yml
ubuntu:~/environment/sample_ruby $ mkdir ruby
ubuntu:~/environment/sample_ruby $ touch ruby/Dockerfile
ubuntu:~/environment/sample_ruby $ touch ruby/Gemfile
ubuntu:~/environment/sample_ruby $ touch ruby/Gemfile.lock
 

 

Dockerfile(コピペしてrubyのバージョンを変更)

 
FROM ruby:2.6.3
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y \
    build-essential \
    nodejs \
 && rm -rf /var/lib/apt/lists/*

RUN gem install bundler

WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

ENV APP_HOME /myapp
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
 

※rm -rf /var/lib/apt/lists/*の意味

ubuntuをdocker buildするときaptのキャッシュを削除し容量を小さくする - Qiita

ということらしい

 

docker-compose.yml(コピペして、コメントの削除とbuildとmysqlのバージョンを変更)

 
version'3'

services:
  web:
    build./ruby
    ports:
      - "3000:3000"
    commandbundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
      - bundle:/usr/local/bundle
    depends_on:
      - db
  db:
    imagemysql:8.0
    environment:
      MYSQL_ROOT_PASSWORDpassword
    ports:
      - '3306:3306'
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  bundle:
  mysql_data:
 

 

Gemfile(コピペしてrailsのバージョンを変更)

 
gem 'rails''6.0.1'
 

 

docker-composeでコンテナ起動

 
ubuntu:~/environment/sample_ruby $ docker-compose run web bundle exec rails
new --force --database=mysql --skip-bundle
 

 docker-composeのインストールがされてなかったのでインストール後に再度起動

ubuntu:~/environment/sample_ruby $ sudo apt  install docker-compose

結果エラー・・・

ERROR: for sampleruby_db_1 Cannot start service db: driver failed programming

external connectivity on endpoint sampleruby_db_1 (ea47a718d7390b13f4638e7b34

a7d2c9090e070cc0cff06b04fe94169c0a8f15): Error starting userland proxy:

listen tcp 0.0.0.0:3306: bind: address already in use

ERROR: for db Cannot start service db: driver failed programming external

connectivity on endpoint sampleruby_db_1 (ea47a718d7390b13f4638e7b34a7d2c9090

e070cc0cff06b04fe94169c0a8f15): Error starting userland proxy: listen

tcp 0.0.0.0:3306: bind: address already in use

ポート3306が使われてるからかなーと思い、調べたらmysqldがあるので削除。

  
  ubuntu:~/environment/sample_ruby $ sudo lsof -i:3306
  COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  mysqld  1086 mysql   27u  IPv4  21433      0t0  TCP localhost:mysql (LISTEN)
  ubuntu:~/environment/sample_ruby $ sudo kill 1086
 

またしてもTraceback (most recent call last):から始まる長いエラー・・・が出たので、バージョンを記事と合わせた。

ruby:2.6.3 → 2.3.1

mysql:8.0 → 5.7

'rails', '6.0.1' → 5.1.4

しかし、またTraceback〜以下略が出たので、いろいろ調べた。

docker-composeのバグを踏んだのでアップグレードした話 - mimikunの技術メモ

上記の記事を参考にしてアップグレートをしたが、それでも直らない・・・。

というわけで公式(Quickstart: Compose and Rails | Docker Documentation)を見ることにした。(最初にそれすべきだった)

 続きはその②で成功したら報告します・・・

Amazon Downloadsという不明な請求

クレジットカード明細にAmazon Downloads 980円

 先日AWSでデータベースを停止し忘れて、無料枠が吹っ飛びました(*_*)

他にも無料枠超えをして料金が発生していたので、クレジットカードの明細を確かめた(^^;

そしたら、

Amazon Downloads 980円

え!何も注文してないけど・・・

でまあ調べたら、Kindle Unlimitedが請求されてました ^^;

右上の「アカウント&リスト」→ポップアップ「お客様のKindle Unlimited」から請求をキャンセルしました!

Amazon DownloadsはKindleのことなので、忘れないように気をつけて^0^/

 

Oracle Java SE8 Silverでつまずいたこと

Java SE8 Silverってここまで聞かれるの?!

最近になって仕事で資格を取るように言われた。.NETやJavaなどのオブジェクト指向言語の経験が一番多かったから、Java SE8 Silverぐらい楽勝でしょwww的なノリで勉強したら、かなり詰んだ^^;

というわけで、こんなような知識が問われるよってのを心に残ったものをちょくちょく更新してこうと思います!

1、整数型で2進数、8進数、16進数のリテラル

public class Test {
public static void main(String args) {
int a = 0xAB;
int b = 015;
int c = 0b010;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}

出力結果

171
13
2

先頭に0xが16進数、0が8進数、0bが2進数のリテラル。全然知らなかった・・・業務で100%見ないし・・

2、負の数

public class Test {
public static void main(String args) {
int a = - 2;
int b = - 5;
int c = a * - b;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}

出力結果

-2
-5
-10

こんな感じで負の数の計算ができる。これは自分の勉強不足かも。

マイナス演算子で負の数を表現できたのは知らんかった^^

3,インクリメント

public class Test {
public static void main(String args) {
int a = 10;
int b = a++ + 1;
int c = ++a + b;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}

出力結果

12
11
23

b=a++と変数の方が前にあるときはプラスされる前のaが適用されるらしい。いや〜難しい!

4、配列の宣言方法

public class Test {
public static void main(String args) {
int a = new int[0];
int b = {};
int c = new int[2];
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}

出力結果

[I@2a139a55
[I@15db9742
[[I@6d06d69c

printで配列を表示するとハッシュコードが返される。まあ、それはよくって、配列の宣言方法!

変数cの宣言方法がありなのは驚いた!大カッコは変数の後、型の後、右と次元さえ合ってればどっちでも良いってこと^^;

int c = new int[2];
int c = new int[2][];

上記は同じ意味。

ちなみに要素数は一次元目さえ入れとけば、宣言時に他は空でも大丈夫^^

getoptsでハマったこと

オプション解析getoptsではまったこと

1,オプションの引数が受け取れない・$OPTARGに値が入らない

while getopts a:b:c OPT
do
    case $OPT in
        "a" ) echo "$OPTARG"
;; "b" ) echo "$OPTARG"
;;
"c" ) echo "$OPTARG"
;;
esac done
上記の場合、a,bには$OPTARGの値が入るがcには入らない。
× while getopts a:b:c OPT → ○ while getopts a:b:c: OPT
:コロンを横に付けることによって引数が必須になるっぽい。

2,getoptsを二回使う時

while getopts a:b: OPT
do
    case $OPT in
        "a" ) continue;;
        "b" ) echo "$OPTARG";;
    esac
done
while getopts a:b: OPT
do
    case $OPT in
        "a" ) echo "$OPTARG";;
        "b" ) echo "$OPTARG";;
    esac
done
上記のように二回使うとgetoptsが実行されない。
while getopts a:b: OPT
do
    case $OPT in
        "a" ) continue;;
        "b" ) echo "$OPTARG";;
    esac
done
OPTIND=1
while
getopts a:b: OPT do case $OPT in "a" ) echo "$OPTARG";; "b" ) echo "$OPTARG";; esac done
間にOPTIND=1をつけて、ループを戻す必要がある。
OPTINDはループ開始位置を指定できる。

同じことで二回ハマったからメモった^^;