ラベル 学習メモ の投稿を表示しています。 すべての投稿を表示
ラベル 学習メモ の投稿を表示しています。 すべての投稿を表示

学習メモ:Linux教科書 LPICレベル1 - 1. 101試験 1. システムアーキテクチャ


1. システムアーキテクチャ

理解しておきたい用語と理念
・BIOS/UEFI
・システム起動の流れ
・ランレベル
・シングルユーザーモード
・init

習得しておきたい技術
・BIOS/UEFIセットアップの呼び出し
・BIOS/UEFIの設定
・接続されているデバイスの確認
・デバイスドライバのロード
・サービスの起動と終了
・起動時のイベント確認
・ランレベルの切り替え
・デフォルトのランレベル/ターゲットの設定
・シャットダウンと再起動

1.1 ハードウェアの基本知識と設定
1.1.1 基本的なシステムハードウェア
CPU
メモリ
ハードディスク
入力装置
拡張カード
コールドプラグ - 取り付け・取り外し時にシステムの電源を切ること
USB機器
ホットプラグ - システムの電源をオンにしたまま取り付け・取り外すこと

1.1.2 BIOS/UEFI

1.1.3 デバイス情報の確認
デバイスファイル - ハードウェアのアクセスを抽象化
デバイスファイルは /devディレクトリ配下に存在
udevという仕組みによって自動的に作成
デバイスに関する情報は /procディレクトリ配下に存在
catコマンド等での閲覧、もしくは lspciコマンド

1.1.4 USBデバイス
ハードウェアを利用するにはデバイスドライバが必要
クラスドライバ - Linuxシステムに最初から搭載されている汎用ドライバ
lsusbコマンドで情報を表示

1.1.5 udev

1.1.6 デバイスドライバのロード
ロードされているカーネルモジュールを確認するには lsmodコマンド
手動でロードするには modprobeコマンド

1.2 Linuxの起動とシャットダウン
1.2.1 システムが起動するまでの流れ
BIOS/UEFI → ブートローダ → カーネル → init/systemd

1.2.2 起動時のイベント確認
dmesgコマンドでシステム起動時のカーネル処理内容を確認
バッファに収まらない情報は消えてしまうので /var/log 配下のログを確認

1.2.3 システムのシャットダウンと再起動
shutdownコマンド
shutdown [オプション] 時間 [メッセージ]
主なオプション:
-hシャットダウンする
-rシャットダウン後にシステムを再起動する
-f次回起動時にfsckをスキップ
-F次回起動時にfsckを実行
-kシャットダウンせずに警告メッセージを通知
-c実行中のシャットダウンをキャンセル

1.3 SysVinit
SysVinit - 旧来の起動手順 (System Five Init)
systemd - 新しい手順

1.3.1 SysVinitによる起動
①initが/etc/inittabファイルを読み込む
②initが/etc/rc.sysinitスクリプトを読み込む
③initが/etc/rcスクリプトを実行
④/etc/rcスクリプトが「/etc/rc[ランレベル].d」ディレクトリ以下のスクリプトを実行
※SysVinitを使っていないシステムでは/etc/inittabファイルは存在しないか中身が空の場合がある

1.3.2 ランレベル
RHEL, CentOS, Fedora
ランレベル説明
0停止
1シングルユーザーモード
2マルチユーザーモード
テキストログイン、NFSサーバーは停止
3マルチユーザーモード
テキストログイン
4未使用
5マルチユーザーモード
グラフィカルログイン
6再起動
S
s
シングルユーザーモード

Ubuntu, Debian GNU/Linux
ランレベル説明
0停止
1シングルユーザーモード
2マルチユーザーモード
3マルチユーザーモード
4マルチユーザーモード
5マルチユーザーモード
6再起動
S
s
シングルユーザーモード
シングルユーザーモードはrootユーザーだけが利用できる特殊な状態

1.3.3 ランレベルの確認と変更
# runlevel
その前のランレベルと現在のランレベルを表示する
ランレベルを切り替えるにはスーパーユーザーでinitまたはtelinitコマンド
# init 1

シングルユーザーモードに移行すると、ログイン中の一般ユーザーは一切の操作ができなくなる。
ログイン中のユーザーにあらかじめメッセージを送信するには wallコマンドを使う。
# wall ’メッセージ'

1.3.4 起動スクリプトによるサービスの管理
・SysVinitの各種サービスの起動は /etc/init.d ディレクトリ以下に用意されている起動スクリプトを使う
・ランレベルの起動スクリプトは /etc/rd(ランレベル).d ディレクトリ配下(/etc/init.d/配下のシンボリックリンク)
・起動スクリプトはシステムサービスや各種サーバ起動、再起動、終了で使用
例:httpd (Apache HTTP Server/Webサーバ)起動・停止
# /etc/init.d/httpd start
# /etc/init.d/httpd stop

1.3.5 デフォルトランレベルの設定
・Linux起動 → initプロセス実行 → 指定されたランレベルで起動
・デフォルトのランレベルの設定は /etc/inittab ファイルに記述
・例:デフォルトランレベルを5に設定
id:5:initdefault:

1.4 systemd
1.4.1 systemdの概要
・systemdを採用したシステムではinitでなく systemd プロセスが起動
・systemd関連の主なデーモンプロセス(駐在プロセス)
 ※デーモン(daemon) = メモリ上に駐在してシステムやサーバサービスを提供するプロセス
プロセス 説明
systemd systemdのメインプロセス
systemd-journald ジャーナル(ログ)管理プロセス
systemd-logind ログイン処理プロセス
systemd-udevd デバイス動的検知プロセス
・システム起動処理は多数のUnit(処理単位)に分かれている
・Unitの種類は拡張子で区別できる
Unitの主な種類:
拡張子 説明
service 各種サービスを起動
device 各種デバイス
mount ファイルシステムのマウント
swap スワップ領域を有効にする
target 複数のUnitをグループ化
・SysVinitではサービスは順次起動
 systemdでは必要な順に起動 = なのでシステム起動時間が短縮

1.4.2 systemdの起動手順
・システム起動 → default.target
・default.targetのUnit設定ファイルは /etc/systemd/system/default.target
・default.tagetは/lib/systemd/system/~.targetへのシンボリックリンク
          [root@minipc user]# ls -n /etc/systemd/system/default.target
          lrwxrwxrwx. 1 0 0 36  4月 23 10:38 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target          
        
graphical.target
          [Unit]
          Description=Graphical Interface
          Documentation=man:systemd.special(7)
          Requires=multi-user.target
          Wants=display-manager.service
          Conflicts=rescue.service rescue.target
          After=multi-user.target rescue.service rescue.target display-manager.service
          AllowIsolate=yes          
        
multi-user.target
          [Unit]
          Description=Multi-User System
          Documentation=man:systemd.special(7)
          Requires=basic.target
          Conflicts=rescue.service rescue.target
          After=basic.target rescue.service rescue.target
          AllowIsolate=yes          
        

1.4.3 systemctlによるサービスの管理
書式:
systemctl サブコマンド [Unit名] [-t 種類]
主なサブコマンド:
サブコマンド 説明
start 差0ビスを起動
stop サービスを終了
restart サービスを再起動
reload サービスの設定を再読み込み
status サービスの稼働状況を表示
is-active サービスが稼働しているか
enable システム起動時にサービス自動起動
disable システム起動時にサービスを自動起動しない
list-unit-files すべてのUnitを表示
reboot システムを再起動
poweroff システムをシャットダウン

■ Docker学習 #29:Docker Toolboxが起動できない


Docker Toolbox (Docker Quickstart Terminal) を起動するが、以下画面となり起動できない。
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Too many retries waiting for SSH to be available.  Last error: Maximum number of retries (60) exceeded
Looks like something went wrong in step ´Checking status on default´... Press any key to continue...

何かキー押すと画面が閉じ、再度 Docker Toolbox (Docker Quickstart Terminal) を起動すると以下の画面となる。
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

Error getting IP address: ssh command error:
command : ip addr show
err     : exit status 255
output  :
docker is configured to use the default machine with IP
For help getting started, check out the docs at https://docs.docker.com


Start interactive shell
→ "ssh command error" が発生している。

docker-machine ls コマンドでDockerマシンの状態を確認
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
default   -        virtualbox   Running                 Unknown   ssh command error:
command : ip addr show
err     : exit status 255
output  :

ホストOSのファイアウォールを無効化してみる。

→ 現象変わらず

"docker-machine create" コマンドを使用し、新たなDockerマシン(default2)を作成してみる。
$ docker-machine create default2 --driver virtualbox
Running pre-create checks...
Creating machine...
(default2) Copying C:\Users\user\.docker\machine\cache\boot2docker.iso to C:\Users\user\.docker\machine\machines\default2\boot2docker.iso...
(default2) Creating VirtualBox VM...
(default2) Creating SSH key...
(default2) Starting the VM...
(default2) Check network to re-create if needed...
(default2) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default2) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: C:\Program Files\Docker Toolbox\docker-machine.exe env default2

"docker-machine ls" で確認
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
default   -        virtualbox   Running                 Unknown   ssh command error:
command : ip addr show
err     : exit status 255
output  :
default2   -    virtualbox   Running   tcp://192.168.99.101:2376        v19.03.12
→ default2は正常動作したようだ

VirtualBoxマネージャーより 仮想マシン default と default2 を再起動(ACPIシャットダウン → 起動)

それぞれの仮想マシン画面を見比べてみる。
defaultマシン(エラーが発生するマシン):
default2マシン(新たに作成したマシン):
→ defaultマシンでは "Generating /usr/local/etc/ssh/ssh_host_~" のコマンドが実行されているが、default2ではそのようなコマンドは見当たらない。


Docker

■ PowerShell #13:バージョンを確認するには

PowerShell学習メモ #13
PowerShellのバージョンを確認するには?


バージョン確認方法

PowerShellのバージョンを確認するには $PSVersionTable 変数を参照する

例:
PS C:\Users\user> $psversiontable

Name                           Value
----                           -----
PSVersion                      5.1.18362.752
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.752
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

$PSVersinoTableに "." を付け、バージョンの名前を指定しての表示も可能

例:
PS C:\Users\user> $psversiontable.psversion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  752


PowerShell

PowerShell #12:コメントの書き方

# を書くとコメント

<# ~ #> で囲むとブロックコメントとなる


NTFS:代替ストリームを表示する方法

代替ストリーム (インターネットからダウンロードしたファイルに付けられるZoneIdなど) の表示は DIR コマンドで可能

dir /r

実行例:
D:\Downloads>dir /r
ドライブ D のボリューム ラベルは ボリューム です
ボリューム シリアル番号は CCE8-A9F3 です

D:\Downloads のディレクトリ

2020/08/06  07:08    <DIR>          .
2020/08/06  07:08    <DIR>          ..
2020/06/11  15:32     2,715,254,784 ubuntu-20.04-desktop-amd64.iso
                                222 ubuntu-20.04-desktop-amd64.iso:Zone.Identifier:$DATA


PowerShell #10:非ローカルファイルをローカル化する

インターネットから入手したスクリプトは非ローカルファイルとなる。
このファイルは実行ポリシーが "RemoteSigned" では実行できない。

非ローカルファイルをローカルファイルへ変更するには Unblock-File コマンドレットを使う。

Unblock-File スクリプトファイル名


■ Docker学習 #28:Docker Toolboxの停止

Docker Toolboxを停止させるには?




これまで VirtualBoxマネージャー の default マシンを右クリックから "ACPIシャットダウン" していたが、
"docker-machine" コマンドでシャットダウン可能。
$ docker-machine stop default
Stopping "default"...
Machine "default" was stopped.


Docker

■ Docker学習 #27:Windows Terminalで使いたい

Docker Toolbox (Docker Quickstart Terminal) を Windows Terminal で使いたい




Docker Quickstart Terminal のプロパティを見ると以下のようになっている。
C:\Program Files\Git\bin\bash.exe" --login -i "D:\Program Files\Docker Toolbox\start.sh"
パラメータの意味:
"--login" … ログインシェルとしてbashを起動
"-i" … インタラクティブモード

bashを起動してstart.shを実行すればDocker Toolboxが立ち上がるのかな?

Windows Terminal で Git Bash


Windows TerminalでGit Bashを使うには、Windows Terminalを起動し [CTRL] + "," を押す(または Windows Terminalの設定メニューを選択する)と settings.json が開く
このファイルの最初の方に "profiles"-"list" の設定があり、既定では PowrShell, コマンドプロンプト, Azure Cloud Shell の3つが登録されているので、ここに Bash の設定を追加する。
※ このファイルは %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState にあるので、念のためバックアップを取っておいた方が良い。

設定概略:
{
  "profiles":
  {
    "defaults":
    {
    }
    "list":
    [
      {
        (Power Shellの設定)
      },
      {
        (コマンドプロンプトの設定)
      },
      {
        (Azure Cloud Shellの設定)
      },
      {
        !!ここにBashの設定を追加
      }
    ]
  }
}
他の例を参考にすると、最低4つの設定が必要と思われる。
・guid
・name
・commandline
・hidden

・guidはPowerShellを起動し以下コマンドで取得する。
[guid]::NewGuid()
・nameは任意だと思うが "Git Bash" とする。
・commandlineは bash.exeの場所なので、Windowsのスタートメニューで "Git Bash" を探し、それと同じパス(C:\Program Files\Git\git-bash.exe)を設定。
※ パス区切りは "\" でなく "\\" としないとダメ
・hiddenは? false で良いだろう (true を指定すると非表示となる)

これで Windows Terminal で Git Bash が選択できるようになった。

アイコンが表示されないのが寂しいので settings.jsonに icon の設定を追加
    "icon" : "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico"
BashのIconが表示されるようになった。

私の場合、たぶん Git Bash は Docker Toolbox でしか使わないと思うので、
名前を "Git Bash" から "Docker Toolbox" へ変更
また、カレントディレクトリを "D:\Program Files\Docker Toolbox" へ変更しておく。

カレントディレクトリの設定は、
"startingDirectory" : "D:\\Program Files\\Docker Toolbox"

以上を纏めると、settings.json の Docker Toolbox設定は以下となった。
{
  "guid": "{9c8b1bdc-dc8c-4763-a129-9367d7f92977}",
  "name": "Docker Toolbox",
  "commandline" : "C:\\Program Files\\Git\\bin\\bash.exe",
  "hidden": false,
  "icon" : "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico",
  "startingDirectory" : "D:\\Program Files\\Docker Toolbox"
}
自動で start.sh が実行できれば良いのだが、設定が分からなかったので、手動で "start.sh" を実行しDockerを起動させることにする。

実用性は無いが、以下設定も追加し半透明化した。
"useAcrylic" : true,
"acrylicOpacity" : 0.5

Docker, Windows Terminal

Access全テーブルのレコードをCSV出力したい

Access内の全テーブルについて、レコードをCSV出力したい。

マクロで可能なのかもしれないが、よくわからないのでVBAを使うことにする。

1) 全テーブルの取得
全オブジェクトの情報は "MSysObjects" というテーブルに入っている模様。
レコードを眺めたところ、
・type=1 がテーブル表す
・flags=0 がユーザーテーブル?
っぽい。

2) CSVの作成
CSVの作成は "DoCmd.TransferText" というコマンドで出来る。
"DoCmdTransfer acExportDelim, , (テーブル名), (CSV出力先)"

3) AccessでDAO3.6は使えない?
VisualBasicの [ツール] > [参照設定] で "Microsoft DAO 3.6 Object Library" にチェックを付けるが "DLL読み込み時のエラーです。" となり参照できない。
64bit版Accessだからなのかもしれない。
代替として "Microsoft ActiveX Data Objects 6.1 Library" を使うことにした。

4) 以上と纏めると、だいたい以下のソースとなる。
Option Compare Database

Public Sub test()
    
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sql As String
    
    Set conn = CurrentProject.Connection
    Set rs = New ADODB.Recordset
    
    sql = "SELECT NAME FROM MSYSOBJECTS WHERE TYPE=1 AND FLAGS=0 ORDER BY NAME"
    rs.Open sql, conn
    
    Dim tableName As String
    
    Do Until rs.EOF
       '今回はAccessテーブル名先頭8文字は不要なので除去した
        tableName = Mid(rs!Name, 9)
        Debug.Print tableName
        DoCmd.TransferText acExportDelim, , rs!Name, "C:\csv\" & tableName & ".csv", True
        rs.MoveNext
        Loop
    
    rs.Close
    Set rs = Nothing
    
    conn.Close
    Set conn = Nothing
    
End Sub


■ Docker学習 #26:Docker コンテナ間通信 (2)

前回からの続き…
Docker #25 Docker コンテナ間通信


コンテナについて、以下サイトを参考に学習する。
Docker入門(第五回)〜コンテナ間通信〜 | さくらのナレッジ

環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


準備


前回起動したコンテナを削除しておく。
docker stop my-php1
docker stop my-mariadb1
docker rm my-php1
docker rm my-mariadb1"


概要


コンテナ間はbridgeネットワークで接続され、それぞれにIPが割り当てられ通信できることが分かった。
しかし既定のbridgeネットワークにはDNS機能が無く、名前解決による通信ができない。
名前解決で通信を行う場合は、新規にDockerネットワークを作成すれば良さそうなので実際に検証してみる。


Dockerネットワーク作成


1) "docker network create ネットワーク名" で作成。
今回は、ネットワーク名 "test" で作成する。
$ docker network create test
26f91a1309d12180b9886cdc8b9e605caee8701ba7e9c7e4e7d60912ba215ddd
2) "docker network ls" で確認。
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
71a3a76fceec        bridge              bridge              local
126de15f15d2        host                host                local
4c6b80365629        none                null                local
26f91a1309d1        test                bridge              local
→ "test" が作成された。

3) ネットワークを指定してコンテナを起動するには "--network ネットワーク名" パラメータを使用する。
MariaDBとApache+PHPコンテナをtestネットワークで起動する。
docker run -it -d --rm -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
-e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
--network test \
--name my-mariadb1 mariadb:latest
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--network test \
--name my-php1 my-php
4) testネットワークの詳細を確認
"docker network inspect test"
 :省略
  "Containers": {
    "23d48f934dc10202c3ae83a4c318e60f456355d96836d1c1f8ed8f85c19fa778": {
        "Name": "my-php1",
        "EndpointID": "122775a7ef668e1ee7d1162c631c2110b48e0ecfd379f51ff32d46f07ec7d379",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
    },
    "c1f5f15d23f63ee5f579ece4e048bb9ac0aac1491a9835778af3c8f2dd419648": {
        "Name": "my-mariadb1",
        "EndpointID": "67689d805a52a9f88c519f7a96722c1efbdaa769559a5530608dd9ac95df5f89",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
    }
  },
  :省略
→ my-mariadb1とmy-php1が接続していることが確認できる。

5) my-php1コンテナのbashに接続し、my-mariadb1 の名前で通信できるか確認。
[root@23d48f934dc1 /]# ping my-mariadb1
PING my-mariadb1 (172.18.0.2) 56(84) bytes of data.
64 bytes from my-mariadb1.test (172.18.0.2): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from my-mariadb1.test (172.18.0.2): icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from my-mariadb1.test (172.18.0.2): icmp_seq=3 ttl=64 time=0.118 ms
→ 通信できた。

続く・・・


Docker学習

■ Docker学習 #25:Docker コンテナ間通信

前回からの続き…
Docker #24 Docker Compose


コンテナについて、以下サイトを参考に学習する。
Docker入門(第五回)〜コンテナ間通信〜 | さくらのナレッジ


環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


概要


これまで3つのコンテナを作成し --link を使って通信を行っていたが、この昨日はレガシー機能であり、将来的に削除される可能性があるとのこと。
Dockerには "Dockerネットワーク" を作成してコンテナ名で通信できる機能があるっぽいので、これを使って通信するように変更してみる。

※ 公式DOC Docker コンテナ・ネットワークの理解


準備

これまで作成したコンテナをすべて削除
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                    NAMES
fe84faa00bc1        my-php                  "/startup.sh"            17 hours ago        Exited (0) 46 minutes ago                            test_my-php_1
8136f4602d50        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   17 hours ago        Exited (0) 10 hours ago                              test_my-phpmyadmin_1
c8a702c53782        mariadb:latest          "docker-entrypoint.s…"   17 hours ago        Up 50 minutes               0.0.0.0:3306->3306/tcp   test_my-mariadb_1
f7bb0d75ad2e        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   18 hours ago        Exited (0) 18 hours ago                              my-phpmyadmin1
7ae0096c85d7        my-php                  "/startup.sh"            18 hours ago        Exited (137) 18 hours ago                            my-php1

Dockerネットワーク動作確認


1) 既存のDockerネットワークを確認
Dockerネットワークを確認するには "docker network ls" コマンドを使用する。
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
71a3a76fceec        bridge              bridge              local
126de15f15d2        host                host                local
4c6b80365629        none                null                local

2) MariaDBコンテナ起動
$ docker run -it -d --rm -p 3306:3306 \
> -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
> -e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
> --name my-mariadb1 mariadb:latest

既定でコンテナは bride ネットワークに接続される。
"docker network inspect bridge" でbridgeネットワークの詳細を確認。
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "71a3a76fceecef58d4695bbe2c5af93dbd6c3805d505e5eaea692bf6c7285f64",
        "Created": "2020-07-28T19:26:36.021723092Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "c276d05f9e83ee2008c05aac16a5cf819a79db50124605c58ff1156780499266": {
                "Name": "my-mariadb1",
                "EndpointID": "89f49fda16d88ccd51c5201bd89aebc0e66b0cbad8ae3c90d62e36ebd8dc61d7",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
 :省略
"Containers"欄に "my-mariadb1" が172.17.0.2 で接続されていることが確認できる。

3) Apache+PHPコンテナ起動
作成済みのmy-phpイメージを使いApache+PHPコンテナを起動
ただし、これまでは "--link my-mariadb1" パラメータでMariaDBとの接続を行っていたが、このパラメータは使用しない。
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--name my-php1 my-php

"docker network inspect bridge" でbridgeネットワークの詳細を確認。
 :省略
  "Containers": {
    "c276d05f9e83ee2008c05aac16a5cf819a79db50124605c58ff1156780499266": {
        "Name": "my-mariadb1",
        "EndpointID": "89f49fda16d88ccd51c5201bd89aebc0e66b0cbad8ae3c90d62e36ebd8dc61d7",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
    },
    "f0dc2914a263aa06e24c550e9e945d1a9e1a1be48717cb7765d5d498ac073a8f": {
        "Name": "my-php1",
        "EndpointID": "beec980140400724cdcaaaeb06bf245fabfeae5366a67dc4969a802aa6abb8db",
        "MacAddress": "02:42:ac:11:00:03",
        "IPv4Address": "172.17.0.3/16",
        "IPv6Address": ""
    }
  },
  :省略
bridgeネットワークに "my-php1" が 172.17.0.3 で接続された。

4) 疎通確認
my-php1 にbash接続し、my-mariadb1 のコンテナにpingが通るか確認。
"docker exec -it my-php1 /bin/bash"
"ping 172.17.0.2"
$ docker exec -it my-php1 /bin/bash
[root@f0dc2914a263 /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.112 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.113 ms
→ 正常に通信できる。

念のため my-php1 のIPアドレスを "ip -a" で確認(172.17.0.3か?)
[root@f0dc2914a263 /]# ip  a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
2: sit0@NONE:  mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
113: eth0@if114:  mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever
→ "docker network inspect bridge" で確認した通り "172.17.0.3" であった。

続く・・・


Docker学習

■ Docker学習 #24:Docker Compose

前回からの続き…
Docker #23 MariaDB連携 (4)

環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24

Docker Compose?


https://docs.docker.jp/compose/overview.html
Compose = 複数のコンテナを定義し実行する Docker アプリケーションのためのツール

使ってみる


これまで作成した3つのコンテナ "my-mariadb1", "my-php1", "my-phpmyadmin1" を自動的に起動するcomposeを作成する。

1) コンテナ停止
前回作成したコンテナが起動中なので停止しておく。
docker stop my-phpmyadmin1
docker stop my-php1
docker stop my-mariadb1

2) 基準フォルダ作成
composeを作成する為の基準フォルダを作成
C:\Users\user\compose\test を作成した。

3) 必要なファイルをコピー
前回使用したphpフォルダもコンテナには必要となるので、フォルダ(C:\Users\user\php)を、
今回作成したtestフォルダ配下へコピー

4) docker-compose.ymlファイル作成
testフォルダ直下に docker-compose.yml ファイルを新規作成し以下内容を記載。(UTF-8)
my-mariadb:
image: mariadb:latest
environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=docker
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
ports:
    - "3306:3306"

my-php:
image: my-php
ports:
    - "80:80"
volumes:
    - /c/Users/sudoy/Documents/docker/techpjin-lamp/php/public-html:/var/www/html 
links:
    - my-mariadb

my-phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
    - "8080:80"
links:
    - "my-mariadb:db"

5) compose実行
testフォルダへ移動し "docker-compose up" を実行
→ エラー
$ docker-compose up
ERROR: In file '.\docker-compose.yml', service 'image' must be a mapping not a string.

→ ymlファイルはインデントが重要 (インデントで階層を認識する)
インデントにはタブは使えず、スペース(何個のスペースか?は定義がなさそうだが2つが基本?)を使う

正しい docker-compose.yml ファイル:
my-mariadb:
  image: mariadb:latest
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=docker
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
  ports:
    - "3306:3306"

my-php:
  image: my-php
  ports:
    - "80:80"
  volumes:
    - /c/Users/sudoy/Documents/docker/techpjin-lamp/php/public-html:/var/www/html 
  links:
    - my-mariadb

my-phpmyadmin:
  image: phpmyadmin/phpmyadmin
  ports:
    - "8080:80"
  links:
    - "my-mariadb:db"

再度 docker-dompose up

→ エラー
$ docker-compose up
Creating test_my-mariadb_1 ... done                                                                                                                   Creating test_my-php_1        ... error                                                                                                               Creating test_my-phpmyadmin_1 ...

ERROR: for test_my-php_1  Cannot start service my-php: b"error while creating mount source path '/c/Users/sudoy/Documents/docker/techpjin-lamp/php/pubCreating test_my-phpmyadmin_1 ... done
ERROR: for my-php  Cannot start service my-php: b"error while creating mount source path '/c/Users/sudoy/Documents/docker/techpjin-lamp/php/public-html': mkdir /c/Users/sudoy: protocol error"
ERROR: Encountered errors while bringing up the project.

16行目のパス、サンプルのまま書いてしまった。
自分の環境のパスに書き換える。
  volumes:
  - /c/Users/user/compose/test/php/public-html:/var/www/html 

再度 docker-dompose up

ブラウザで http://192.168.99.102 を表示 → phpinfo が表示される → 成功!
ブラウザで http://192.168.99.102/db.php を表示 → 何も表示されない → たぶん成功!

とりあえず Dockerであそぶ を参考にした学習は終了とする


Docker学習

■ Docker学習 #23:MariaDB連携 (4)

前回からの続き…
Docker #22 MariaDB連携

環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24

PhpMyAdminインストール


解決できていない問題もあるが、とりあえずPHPからMariaDBへの接続は出来たと思われる。 引き続き Dockerであそぶ(7)PhpMyAdminのインストール | TECH Projin を参考に学習していく。

1) PhpMyAdminコンテナ作成
docker run --name my-phpmyadmin1 -d --link my-mariadb1:db -p 8080:80 phpmyadmin/phpmyadmin
これだけで完了である。
ブラウザで http://192.168.99.102:8080 を表示

→ phpMyAdminのページが表示された → 成功
ユーザー・パスワードを "docker" でログイン → 成功

珍しく順調に進んだ。

続く・・・


Docker学習

■ Docker学習 #22:MariaDB連携 (3)

前回からの続き…
Docker #21 Mariadb連携



環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


環境変数を使わなければ接続できるのか?


前回、mysql_connect が使えなかったので mysqli へ変更した。
しかし 接続情報を環境変数(MY_MARIADB_~)から取得できずエラーとなっていた。
環境変数を使わなければ接続できるのかやってみる。

1) Apacheコンテナのbashに接続
docker exec -it my-php1 /bin/bash

2) 環境変数値を確認
[root@7ae0096c85d7 /]# env | grep MY_MARIADB1
MY_MARIADB1_ENV_MARIADB_MAJOR=10.5
MY_MARIADB1_ENV_GOSU_VERSION=1.12
MY_MARIADB1_ENV_MARIADB_VERSION=1:10.5.4+maria~focal
MY_MARIADB1_PORT_3306_TCP=tcp://172.17.0.2:3306
MY_MARIADB1_PORT_3306_TCP_PORT=3306
MY_MARIADB1_ENV_MYSQL_PASSWORD=docker
MY_MARIADB1_PORT_3306_TCP_ADDR=172.17.0.2
MY_MARIADB1_NAME=/my-php1/my-mariadb1
MY_MARIADB1_ENV_MYSQL_DATABASE=docker
MY_MARIADB1_ENV_MYSQL_USER=docker
MY_MARIADB1_PORT=tcp://172.17.0.2:3306
MY_MARIADB1_ENV_GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8
MY_MARIADB1_ENV_MYSQL_ROOT_PASSWORD=root
MY_MARIADB1_PORT_3306_TCP_PROTO=tcp

3) db.php修正
<?php
error_reporting(-1);
ini_set("display_errors", 1);

// Mariadbへの接続
$link = new mysqli("172.17.0.2", "docker", "docker", "docker");

4) ブラウザで http://192.168.99.102/db.php を表示
→ 何も表示されない。 → 成功?

続く・・・


Docker学習

■ Docker学習 #21:Mariadb連携 (2)

前回からの続き…
Docker #20 Mariadb連携


環境


Windows 10 1909 (18363.959)
Docker Toolbox : Docker version 19.03.1
コンテナ CentOS:8.2.2004
Apache 2.4.37
PHP 7.2.24


エラー原因調査


エラー分からないため、PHPファイルを修正しエラーを表示させてみる。
前回のdb.phpの先頭に以下2行を追加。
error_reporting(-1);
ini_set("display_errors", 1);

→ 以下エラーが表示された。
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/db.php:12 Stack trace: #0 {main} thrown in /var/www/html/db.php on line 12
https://www.php.net/manual/ja/function.mysql-connect.php
「この拡張モジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。」とのこと。
この関数の代替は、
・mysqli_connect()
・PDO::__construct()

とりあえず mysqli を使う方向として、PHPのページを参考にdb.phpを以下のように修正。
<?php
error_reporting(-1);
ini_set("display_errors", 1);

// 環境変数の取得
$host = getenv("MY_MARIADB1_PORT_3306_TCP_ADDR");
$db   = getenv("MY_MARIADB1_ENV_MYSQL_DATABASE");
$user = getenv("MY_MARIADB1_ENV_MYSQL_USER");
$pass = getenv("MY_MARIADB1_ENV_MYSQL_PASSWORD");
    
// Mariadbへの接続
$link = new mysqli($host, $user, $pass, $db);

ブラウザで http://192.168.99.102/db.php を表示
→ エラー発生
Warning: mysqli::__construct(): (HY000/2002): No such file or directory in /var/www/html/db.php on line 12

db.phpで取得している環境変数の値を確認してみる。
db.phpに以下行を追加し ブラウザで http://192.168.99.102/db.php を表示
var_dump($host, $db, $user, $pass);
→ getenv関数で環境変数が取得できていない?
bool(false) bool(false) bool(false) bool(false)
https://www.php.net/manual/ja/function.getenv.php によると、指定した環境変数名が存在しない場合は false を返す、とのこと。
$host, $db, $user, $pass すべて値は false だった。

getenv関数は引数を省略すると、すべての環境変数を取得できる。(PHP 7.1.0以降)
https://www.php.net/manual/ja/function.getenv.php
なので、db.phpを修正、先ほど追記した var_dumpの行を削除し、新たに2行追加
$var = getenv();
var_dump($var);
→ 取得できた環境変数は USER と HOME の2つだけだった。
array(2) { ["USER"]=> string(6) "apache" ["HOME"]=> string(16) "/usr/share/httpd" }

よくわからん…

続く・・・


Docker学習

■ Docker学習 #20:Mariadb連携

前回からの続き…
Docker #19:CentOS+Apache+PHP環境 (5)



以下サイトを参考にMariaDBとの連携をやってみる。
Dockerであそぶ(6)Apache-PHP-Mariadb連携 | TECH Projin

1) MariaDBコンテナ作成
docker pull mariadb:latest
docker run -it -d --rm -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
-e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
--name my-mariadb1 mariadb:latest
"docker ps -a" で確認してみる
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1ac004331c53        mariadb:latest      "docker-entrypoint.s…"   14 seconds ago      Up 13 seconds       0.0.0.0:3306->3306/tcp   my-mariadb1
動作していると思われる

確認取れたのでコンテナ終了
docker stop my-mariadb1"

2) Dockerfile修正
これまで作成していたDockerfileにphp-mysqlをインストールするよう1行追加
FROM centos:latest
RUN dnf -y update && \
    dnf -y install httpd php
RUN dnf -y install php-mysql
EXPOSE 80
RUN ["mkdir", "-p", "/run/php-fpm"]
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]
※ 4行目を追加

3) コンテナイメージビルド
cd C:/Users/user/php
docker build -t my-php .
→ エラーが発生
$ docker build -t my-php .
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM centos:latest
    ---> 831691599b88
Step 2/8 : RUN dnf -y update &&     dnf -y install httpd php
    ---> Using cache
    ---> f4ef9934dcf3
Step 3/8 : RUN dnf -y install php-mysql
    ---> Running in 9e9287ce8ab0
Last metadata expiration check: 1 day, 2:00:54 ago on Tue Jul 28 19:40:19 2020.
No match for argument: php-mysql
Error: Unable to find a match: php-mysql
The command '/bin/sh -c dnf -y install php-mysql' returned a non-zero code: 1

4) 原因調査
centos8コンテナを起動しbashに接続
docker run -it centos:latest bash

php-mysqlをインストールしてみる
dnf -y install php-mysql
やはりエラーとなる

別のパッケージで php-mysqlnd といのがあるっぽい
末尾の "nd" は "native driver" のことらしい
これをインストールしてみる
dnf -y install php-mysqlnd
これは正常にインストールできた。

といことで php-mysqlnd を使うようにDockerfileを修正
CentOSのbashは exit で終了しておく

5) Dockerfile修正
FROM centos:latest
RUN dnf -y update && \
    dnf -y install httpd php
RUN dnf -y install php-mysqlnd
EXPOSE 80
RUN ["mkdir", "-p", "/run/php-fpm"]
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]

6) コンテナイメージビルド
docker build -t my-php .
→ 成功

7) PHPコンテナ起動
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--name my-php1 --link my-mariadb1 my-php
→ エラー
$ docker run -it -d -p 80:80 \
> -v //c/Users/user/php/public-html/:/var/www/html/ \
> --name my-php1 --link my-mariadb my-php
D:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: could not get container for my-mariadb: No such container: my-mariadb.
See 'D:\Program Files\Docker Toolbox\docker.exe run --help'.
→ MariaDBコンテナが起動していないとダメか?

ということでMariaDBコンテナを起動
docker run -it -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
-e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
--name my-mariadb1 mariadb:latest
再度PHPコンテナ起動
docker run -it -d -p 80:80 \
-v //c/Users/user/php/public-html/:/var/www/html/ \
--name my-php1 --link my-mariadb1 my-php

8) テストページ作成
https://tech.pjin.jp/blog/2016/01/04/dockerであそぶ(6)apache-php-mysql連携/ のdb.phpを C:\Users\user\php\public-html\db.php へ保存
エンコードは UTF-8 とした。

ブラウザで http://192.168.99.102/db.php を表示

→ エラーとなる
このページは動作していません
192.168.99.102 では現在このリクエストを処理できません。
HTTP ERROR 500

続く・・・


Docker学習

Docker #19:CentOS+Apache+PHP環境 (5)

前回からの続き…
Docker #18:CentOS+Apache+PHP環境 (4)

PHPは正常動作するようになったので、Dockerfileを変更しイメージを再作成してみる。

1) Dockerfile修正
FROM centos:latest
RUN dnf -y update && \
    dnf -y install httpd php
EXPOSE 80
RUN ["mkdir", "-p", "/run/php-fpm"]
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]
・1行目のイメージ名は "centos:latest" (CentOS 8を使用)
・5行目 /run/php-fom フォルダの作成を追加
・6行目 php-fpmとApacheを起動するスクリプト(startup.sh)をコピー
・7行目 startup.shの権限を744(所有者は実行可)に変更
・8行目 startup.shの実行

2) startup.sh作成
DockerfileにてCMDコマンドを使い php-fpm と Apache を起動させたいが、DockerfileのCMDコマンドは1つしか書けない、とのこと。
https://docs.docker.jp/engine/reference/builder.html#cmd
その代替として、実行したいコマンドをシェルスクリプト化し、Dockerfileからはシェルスクリプトを実行するように修正する

#!/usr/bin/env bash
/usr/sbin/php-fpm
/usr/sbin/httpd -D FOREGROUND


ちなみに、Dockerfileのコマンド RUN と CMD は似たようなコマンドであるが、
・RUN は Dockerイメージを作成するために使用する
・CMD は 作成したDockerイメージよりコマンドを実行する
の違いがある

以降の手順は Docker #15:CentOS+Apache+PHP環境 と同じである。

3) イメージをビルド
cd c:/Users/user/php
docker build -t php .


4) コンテナ実行
docker run -it --rm -p 80:80 -v //c/Users/user/php/public-html/:/var/www/html/ php


5) 動作確認
ブラウザで http://192.168.99.102 へアクセス

→ phpinfoが表示された


Docker #18:CentOS+Apache+PHP環境 (4)

前回からの続き…
https://masablg.blogspot.com/2020/07/docker-17centosapachephp-3.html

原因として
・php-fpmのプロセスを起動しておく必要がある
と思われるため以下コマンドで実行する。
"/usr/sbin/php-fpm"

すると以下エラーとなった。
[28-Jul-2020 00:43:30] ERROR: unable to bind listening socket for address '/run/php-fpm/www.sock': No such file or directory (2)
[28-Jul-2020 00:43:30] ERROR: FPM initialization failed

よくよく考えたらエラーメッセージの通りで "/run/php-fpm" ディレクトリが無いためエラーとなったと思われる。
ディレクトリを作成する。
"mkdir /run/php-fpm"

再度php-fpmを起動
"/usr/sbin/php-fpm"

→ 今度はエラーも何も表示されなかった。

ブラウザで http://192.168.99.102 を表示

→ phpinfoの画面が表示された
成功


その他の記事