Docker

docker ファイルの作成からコンテナの起動までの流れ

docker fileの基本

goで書いたプログラムをDockerコンテナ内で動かすためのDocker fileの例です。 動作としては、

  1. echo ディレクトリを作成します。
  2. 予め準備していた、main.go ファイルを echo ディレクトリにコピーします。
  3. go run /echo/main.go コマンドを実行して、コンテナの動作を開始します。
FROM  golang:1.15.1

RUN mkdir /echo
COPY main.go /echo 

CMD ["go", "run", "/echo/main.go"]
  • RUNは、Dockerイメージビルド時に、Dockerコンテナ内で、実行するコマンドを定義します。
  • CMDは、Dockerコンテナとして実行する際に、コンテナないで、実行するプロセスを指定します。 イメージをBuildするためのRUNに対して、、CMDはコンテナ起動時に、1度実行されます。 CMDはコンテナ内で、アプリケーションそのものを実行するイメージとなります
docker imageのビルド

Dockerファイルの準備ができたら、Dockerfileと必要なファイルを同じディレクトリに集めて、以下のコマンドで、buildを行います。

# docker image build -t イメージ:[タグ名] Docerfile 配置ディレクトリのパス
$ sudo docker image build -t example/echo:latest .

Sending build context to Docker daemon  6.441MB
Step 1/4 : FROM golang:1.15.1
 ---> 9f495162f677
Step 2/4 : RUN mkdir /echo
 ---> Using cache
 ---> 876f76330b0c
Step 3/4 : COPY main.go /echo
 ---> Using cache
 ---> f6f3a9a2dc3a
Step 4/4 : CMD ["go", "run", "/echo/main.go"]
 ---> Using cache
 ---> 9e8663cc9057
Successfully built 9e8663cc9057
Successfully tagged example/echo:latest
docker イメージの確認

Docker ファイルのBuildに成功すると、以下のようにimageが登録されます。

# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
example/echo                             latest              9e8663cc9057        22 minutes ago      839MB
docker コンテナの実行/停止

上記のDocker imagesを指定して、Dockerのプロセスを実行します。

# docker run example/echo:latest 

コンテナの停止は以下のコマンドを利用します。

# docker stop [docker Names]
docker コンテナのポートフォワーディング

Dockerコンテナは、外部からは独立しており、Docker内のアプリケーションのポートが開放されていても、外部からはそのままでは、アクセスできないです。 アクセスするためには、Dockerホストのポートと、Docker内部のアプリケーションのポートを紐付ける必要があります。

以下のように'-p' オプションを利用することで、ポートフォワーディングの設定ができます。

-p ホストのポート:コンテナアプリケーションのポート  で指定します。

# docker run -p 9000:8080   9e8663cc9057  

上記で、起動したコンテナには、外部から9000番ポートでアクセス可能です。

なお、起動しているコンテナのどのポートが空いているかは、docker psコマンドで確認可能です。

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6e940bc44898        9e8663cc9057        "go run /echo/main.go"   7 minutes ago       Up 7 minutes        0.0.0.0:9000->8080/tcp   dreamy_murdock

0.0.0.0:9000->8080/tcp  となっており、ホストの9000番ポートから、コンテナの8080ポートにアクセスすることができます。

Docker コンテナ内へのアクセス

Docker コンテナ内へアクセスするためのコマンドは以下の通り。

# docker exec -it 6e940bc44898 /bin/bash
Dockerのイメージを一括で削除したい場合

Dockerの不要イメージを削除する場合は、docker image prune コマンドを利用します。 これは、dokcer自身が不要だと判断したimageが削除されます。

docker image prune
 Dockerの利用状況の取得

以下のコマンド(docker stats)を利用して、コンテナ単位で、システムリソースの利用状況を把握できます。

docker stats [Docker name]

# docker stats jolly_perlman 

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
7295a86a463f        jolly_perlman       0.20%               2.52MiB / 15.56GiB   0.02%               6.91kB / 0B         0B / 0B             2

Jenkins

Jenkins インストール

環境はUbuntu 18.04で構築しました。

Java 11のInstall
sudo apt-get update
sudo apt-get install openjdk-11-jre
Jenkins のインストール
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
Jenkinsの起動・停止
sudo systemctl start jenkins
sudo systemctl stop jenkins
Jenkinsへのアクセス方法
  • ブラウザで http://{hostname}:8080 にアクセスします
  • Administrator passwordの入力を求められますので、cat /var/lib/jenkins/secrets/initialAdminPasswordでパスワードを確認して入力します

RHELのISOイメージをUSBに書き込んで、Installしようとしたときのエラー

現象

RHELのISOイメージをUSBに書き込んで、Installしようとさせたときに以下のようなエラーが出てタイムアウトしてしまいました。 その結果、Installできなくなりました。

Warning: dracut-initqueue timeout Warning: /dev/xxxxx/xxxx does not exist. 

原因

USB内のInstallイメージを見つけられないことが原因のようです。 grub.cfgでDISKのインストールイメージパスの設定がされていますが、何らかの理由で正しいパスが設定できていないようです。

対処方法

grub.cfgに記載されているDISKのインストールイメージパスをUSBに向けます。

手順
  1. OSのイメージを書き込んだUSBをさしたサーバを起動します。
  2. エラーで失敗して、自動的にレスキューモードに移行します。以下のような画面になるはずです。。
dracut:/#
  1. まずは、USBのデバイスのパスを探す。 ラベルにusbと記載があるので、おそらく判別がつくと思われる。  心配なら、実際にマウントしてみるとよい。
#ls -al /dev/disk/by-id/

lrwxrwxrwx 1 root 0 9 : 04:15 ata-ST9555xxxxxxxxxx  -> ../../sdb
    ・
 ・
lrwxrwxrwx 1 root 0 9 : 04:15 usb-Generic_Flash_Disk_xxxxxxxxxx  -> ../../sdc
lrwxrwxrwx 1 root 0 9 : 04:15 usb-Generic_Flash_Disk_xxxxxxxxxx -part1 -> ../../sdc1
  1. 上記で、対象がsdc1であると判明したので、今度はuuidを調べる sdc1のuuidがC0DC-962Aであることがわかる。  このUUIDをgrubに設定する。いったんリブートする。
#ls -al /dev/disk/by-uuid/

lrwxrwxrwx 1 root 0 9 : 04:15 79d1d39493xxxxxxxx  -> ../../sda2
    ・
 ・
lrwxrwxrwx 1 root 0 9 : 04:15 C0DC-962A -> ../../sdc1
  1. リブート後に、USBからブートして、Install 選択画面が出てきたら、e をクリックして、grubの設定画面に移行する。  RHELの場合以下のような画面となる。
setparams 'Install Red Hat Enterprise Linux 7.8'

     linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-7.8\x20Serv\er.x86_64 quit
     initrdefi /images/pxeboot/initrd.img

上記のhd:Labelを5で調べたUUIDに変更する。

setparams 'Install Red Hat Enterprise Linux 7.8'

     linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:UUID=C0DC-962A quit     ★ここが変更場所 hd:UUID=調べたUUID というフォーマット
     initrdefi /images/pxeboot/initrd.img
  1. Ctrl-x で起動すれば、立ち上がるはず。

JAVAの負荷確認方法(jps, jstat など)

環境
  • Ubuntu16.04を想定しています。他ののLinux dustributionでも、ほぼ変わらないはずです。

JAVAプロセスのCPU使用率の確認

手順

1. jpsコマンドを利用して、JAVAのプロセスIDを確認します。   ここでは、Bootstrapを見たいので、プロセスIDは1180になります。

# jps
21509 Jps
1180 Bootstrap
1774 jboss-modules.jar
  1. topコマンドを利用して、そのプロセスIDのCPU使用率を確認します。 ここでは、topコマンドの結果を60sごとに、ファイルに保存するコマンドになります。
top -p 1180 -b -d 60  |tee -a top_cpu

JAVAプロセスのヒープメモリ使用率の確認

手順

1. jpsコマンドを利用して、JAVAのプロセスIDを確認します。   ここでは、Bootstrapを見たいので、プロセスIDは1180になります。

# jps
21509 Jps
1180 Bootstrap
1774 jboss-modules.jar
  1. jstatコマンドを利用して、そのプロセスIDのheap使用率を確認します。 ここでは、jstatコマンドの結果を60sごとに、ファイルに保存するコマンドになります。
# jstat  -gc 1180  60000 |tee -a jstat_heap
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
37888.0 39936.0 3848.4  0.0   3262976.0 1572221.1  488448.0   63041.7   105088.0 100846.7 12928.0 12096.3     34    1.082   4      0.568    1.650
  1. 確保済み領域/使用済み領域の確認方法

確保済み領域 (9216.0[S0C] + 6144.0[S1C] + 30720.0[EC] + 40448.0[OC] + 27136.0[MC]) / 1024  = 111MB

使用済み領域の確認 (0.0[S0U] + 5895.0[S1U] + 17433.9[EU] + 16309.2[OU]) / 1024  = 38MB

見方はこちらを参考にさせていただきました。 qiita.com

 GCの起こし方

JAVAのプロセスID1180に対して、GCを起こす。

$ sudo -u tomcat  jmap -histo:live 1180

DOM (Document Object Model)

DOMとは
  • Document Object Modelのことです。Javascript などのプログラムからHtmlやXMLなどを操作するための仕組みです。
  • ツリー構造を持っていて、各々をノードと呼ばれる。
  • 利用シーンとしては、

例えばブラウザに表示される文字の色を変更したり、大きくしたりと、Webページの見た目をプログラムで処理をしたい場合があるだろう、しかし何もしていない状態のHTMLファイルではJavaScriptから手を出す事が出来ない。そこでファイルの特定の部分に目印を付けて「この部分」に「こういう事をしたい」という処理を可能にするための取り決めがDOMである。

以下のサイトを参考にさせていただきました。 eng-entrance.com

DOMの参照

DOMはChromeのDevelopperツールのElementで参照可能です。 例えば、以下のように見えます。 この,html,head.body,divなどの各々の要素がNodeにあたります。

f:id:lucky0523:20201016152046p:plain
DOM

DOMの操作

プログラムから各ノードのIDを指定して、操作をすることが可能です。 Javascript の場合、以下でノードの情報を取得できます。

document.getElementById(id);

具体的には、以下のような構文で、IDが"section-2"のカラーをREDに変更することができます。

document.getElementById('section-2').style.color = 'red';

財務分析

バフェットコードを利用した分析

1. バフェットコードにアクセス

www.buffett-code.com

2.財務表分析

財務表を確認する。 * 粗利率、営業利益率、純利益率

前年と比較して、上がっているか下がっているか?

f:id:lucky0523:20201010170603p:plain
財務表

https://www.buffett-code.com/ より

3.EPS,BPS

EPS, BPSを前年と比較する。

* EPS(Earnings Per Shares) 1株あたりの当期純利益  EPS(円) = 当期純利益 ÷ 発行済株式総数   EPS(1株当たり利益)は、株主が持つ1株について一会計期間における会社の成果を示しており、その会社の収益性を分析できる指標です。EPSは、会社の規模にかかわらず1株あたりの当期利益の大きさを表しているため、値が大きいほど良いとされます。当期の1株当たり利益を前期以前のものと比較することで、会社の収益性や成長度をおおむね把握できます。また、他社と1株当たり利益を比較することで、会社規模の影響を除外した収益性の分析も可能です。そのため、株式投資で銘柄の比較を行う際にも用いられます。一般的に、株価は「EPS×PER(株価収益率)」で計算されるため、EPS(1株当たり利益)が上がれば株価も上がり、EPSが下がれば株価も下がります。

*BPS(Book-value Per Share)  1株当たりの純資産。純資産は、企業の資本から負債分を除いた値。  企業の安定性を表す。

4.企業の健全性

経営が傾いている企業に投資するさいは、注視すること。

 自己資本比率 = 自己資本 ÷ 総資産 自己資本比率とは、総資産に占める自己資本の割合。 高い方が、安定はしている。

一般に自己資本比率が70%以上なら理想企業、40%以上なら倒産しにくい企業といえます。TKC経営指標のデータを見てみると、自己資本比率の平均は赤字企業で-4%、黒字企業で27%、優良企業(黒字企業中上位15%)で53%。自己資本比率は高いほどよいですが、まずは40%を目指したいところです。 https://www.kessansho.com/general/study/04_05.html#:~:text=%E4%B8%80%E8%88%AC%E3%81%AB%E8%87%AA%E5%B7%B1%E8%B3%87%E6%9C%AC%E6%AF%94%E7%8E%87%E3%81%8C,%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%81%A7%E3%81%99%E3%80%82

ただし、負債を活用することで資本効率を高められるため、必ずしも自己資本比率が高い方が良いとは限らない。 (効率が悪い経営の可能性もある。)

  • ネットD純利益比率

ネットD純利益比率とは、当期純利益に対して何倍の純有利子負債を抱えているかを表す指標。 純有利子負債を返済するのにかかる、おおよその目安として見ることができます。 数字の目安ですが、たとえばバフェットが投資したどの優良企業も、すべての有利子負債を3~4年で返済できる純利益を毎年計上している。

5.株価が割高か、割安かの判断(PER)

前年度と比べてPERが低ければ、株安と判断できる。

  • PER(Price Earnings Ratio)  PER(倍)=株価 / 1株あたりの純利益(EPS)

株価が1株当たり純利益(EPS:Earnings Per Share)の何倍まで買われているか、すなわち1株当たり純利益の何倍の値段が付けられているかを見る投資尺度です。現在の株価が企業の利益水準に対して割高か割安かを判断する目安として利用されます。 PERの数値は、低いほうが株価は割安と判断されます。なお、1株当たり純利益は当期の予想数値を用いるのが一般的です。

  • PERの目安

一般的に上場企業の場合、PERの値は「15倍」がひとつの水準とされています。日本の企業におけるPERの全業種平均がおよそ15倍であることから、この数字が目安としてあげられているのです。PERが小さいほうが、株価は割安ということになりますので、まずはPERが15倍以下であるかどうかに着目してみるとよいでしょう。 https://batonz.jp/learn/3120/#:~:text=%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AB%E4%B8%8A%E5%A0%B4%E4%BC%81%E6%A5%AD,%E3%81%BF%E3%82%8B%E3%81%A8%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82