[Docker] ネットワーク

– 三つのネットワーク: bridge, host, none
bridgeがよく使われる

$ sudo docker run -dit –name web01 -p 8080:80 httpd:2.4
$ sudo docker run -dit –name web02 -p 8081:80 httpd:2.4

$ sudo docker container inspect web01
– NetworkSettingsの部分にIPアドレスが記載される
“IPAddress”: “172.17.0.2”,

$ sudo docker container inspect –format=”{{.NetworkSettings.IPAddress}}” web01
172.17.0.2
$ sudo docker container inspect –format=”{{.NetworkSettings.IPAddress}}” web02
172.17.0.3

接続されているコンテナのIPアドレス一覧
$ sudo docker network inspect bridge
ホストのIP
# sudo apt install net-tools
$ ifconfig
$ sudo iptables –list -t nat -n

### Dockerホスト同士の通信
bridgeネットワークに接続されているため、コンテナ同士で通信ができる

$ sudo docker run –rm -it ubuntu /bin/bash
# apt update
# apt -y upgrade
# apt install -y iproute2 iputils-ping curl
# ip address
# ping -c 4 172.17.0.2
# ping -c 4 172.17.0.3
# curl http://172.17.0.2/
# curl http://172.17.0.3/

Dockerネットワークを作成、–linkオプションを指定で通信相手を特定できる
$ sudo docker run –rm -it –link web01:web01 –link web02:web02 ubuntu /bin/bash
※linkオプションを使うことでコンテナ名で通信ができるようになる

ニャルほどー
前進してるようなしてないような…

[Docker] データのバックアップ

別のディレクトリにコピーするか、tarコマンドでファイルをまとめて保存するかなどでバックアップできる。

### ボリュームの場所
$ sudo docker volume inspect mysqlvolume
[
{
“CreatedAt”: “2022-03-21T05:36:02Z”,
“Driver”: “local”,
“Labels”: {},
“Mountpoint”: “/var/lib/docker/volumes/mysqlvolume/_data”,
“Name”: “mysqlvolume”,
“Options”: {},
“Scope”: “local”
}
]

### ボリュームバックアップの考え方
適当なコンテナを割り当てて、そのコンテナを使ってバックアップを取る
/tmpなどのディレクトリにバック対象のコンテナをマウントし、tarでバックアップを作成
バックアップ中はコンテナを停止しておくのが望ましい

### ボリュームバックアップの慣例的なコマンド
$ sudo docker run –rm -v mysqlvolume:/src -v “$PWD”:dest busybox tar czvf /dest/backup.tar.gz -C /scr .
$ ls
backup.tar.gz
$ tar tzvf backup.tar.gz

### ボリュームをリストア
$ sudo docker volume rm mysqlvolume
$ sudo docker volume create mysqlvolume
$ $ sudo docker run –rm -v mysqlvolume:/dest -v “$PWD”:/src busybox tar xzf /src/backup.tar.gz -C /dest

なるほど、なかなか凄いな
全然終わる気配がないな

[Docker] ボリュームマウントとmysql

MySQLの環境変数
MYSQ_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORD, MYSQL_ONETIME_PASSWORD

### ボリュームの作成
docker volume create –name ${volumeName}
$ sudo docker volume create mysqlvolume
$ sudo docker volume ls

### mysqlのコンテナを起動
$ sudo docker run -dit –name db01 -v mysqlvolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql5.7

### データを入れる
$ sudo docker exec -it db01 /bin/bash
# mysql -p
mysql> create database exampledb;
mysql> create table exampletable (id int not null auto_increment, name varchar(50), primary key(id));
mysql> insert into exampletable (name) values (‘user01’);
mysql> insert into exampletable (name) values (‘user02’);
mysql> select * from exampletable;
$ sudo docker stop db01
$ sudo docker rm db01

$ sudo docker run -dit –name db01 -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ sudo docker run -dit –name db01 -v mysqlvolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ sudo docker exec -it db01 /bin/bash
mysql> select * from exampletable;
+—-+——–+
| id | name |
+—-+——–+
| 1 | user01 |
| 2 | user02 |
+—-+——–+
2 rows in set (0.00 sec)

docker-composeを使うとよくMySQLが出てくるが、単体で使うとわかりやすいな

[Docker] データを独立させる

./web01data

<body>
	<h1>mount test</h1>
</body>

$ sudo docker run -dit –name web01 -v /home/vagrant/dev/docker/apache/web01data:/usr/local/apache2/htdocs -p 8080:80 httpd:2.4
-> http://192.168.56.10:8080/

Dockerホスト側にデータを置くと、データが失われない
コンテナ間のデータ共有にも使われる

### 設定ファイルの受け渡しや作業フォルダの受け渡し
/usr/local/apache2/confディレクトリにApacheの設定ファイルが入っている
コンテナを起動する前に書き換えなければならないので、docker runではなく、docker createしておいて、docker cpなどでファイル書き換え、docker start
マウントする方法では、あらかじめ設定ファイルを作成しておいて、そのディレクトリを/usr/local/apache2/confにマウントする

### バインドマウント
設定ファイルの受け渡し
作業ディレクトリの変更を即座にDockerコンテナから参照したい時

### ボリュームマウント
ホスト上のディレクトリではなく、Docker Engine上で確保した領域をマウント
ボリュームマウントの利点は物理的な位置を意識する必要がないこと
データベースのデータを保存する場合

なんか、次から次へと奥が深いな…

[Docker] コンテナとファイルの独立性

$ sudo docker run -dit –name web01 -p 8080:80 httpd:2.4
$ sudo docker run -dit –name web02 -p 8081:80 httpd:2.4

ブラウザで確認
http://192.168.56.10:8080/
http://192.168.56.10:8081/

### Docker CP
docker cp option コピー元のパス コンテナ名:コピー先のパス
※パーミッションはそのまま、ディレクトリは再帰的にコピー
※docker cpでは、/proc, /sys, /dev, tmpfsのようなシステムファイルはコピーできない

– コンテナ1
/tmp/index.html

<body>
	<h1>It's web01!</h1>
</body>
</html>

$ sudo docker cp ./tmp/index.html web01:/usr/local/apache2/htdocs/
http://192.168.56.10:8080/

$ ls -al /usr/local/apache2/htdocs
$ cat /usr/local/apache2/htdocs/index.html

– コンテナ2
/tmp/index02.html

<body>
	<h1>It's web02!</h1>
</body>
</html>

$ sudo docker cp ./tmp/index02.html web02:/usr/local/apache2/htdocs/

### コンテナを破棄する
$ sudo docker stop web01
$ sudo docker start web01
停止、再開の場合はファイルは残っている

$ sudo docker stop web01
$ sudo docker rm web01
$ sudo docker run -dit –name web01 -p 8080:80 httpd:2.4
-> ファイルがなくなっている

うん、ここまでは理解している

[Docker] 1回限り動かすコンテナ

コンパイラや画像変換ライブラリなど便利ツールが入っていて、そのツールを使ってDockerホストのファイルを処理したい場合

hello.go

package main

import "fmt"

func main(){
	fmt.Printf("Hello World\n")
}

$ sudo docker run –rm -v “$PWD”:/usr/src/myapp -w /usr/src/myapp golang:1.13 go build -v

–rm: 実行が完了した時にコンテナを破棄
-w /usr/src/myapp: -wは作業ディレクトリ
go build -v: go言語のビルド

$ ./myapp
Hello World

なるほど、なかなか勉強になるな

[Docker] コンテナのメンテナンス

### Dockerが停止中または作られていない時
docker runの引数に、/bin/sh や /bin/bashなどのシェルプログラムを指定し、規定のコマンドの代わりにこれらのシェルが起動されるようにする
$ sudo docker run –name my-apache-app -it httpd:2.4 /bin/bash
# ls
bin build cgi-bin conf error htdocs icons include logs modules

– デタッチ
[Ctrl] + [P], [Ctrl] + [Q]でデタッチ
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82c0dbeb972f httpd:2.4 “/bin/bash” 2 minutes ago Up 2 minutes 80/tcp my-apache-app

– アタッチ
$ sudo docker attach my-apache-app

– 終了
# exit
exit
$ sudo docker rm my-apache-app

### 動作中の時
docker execを使う。 docker exec –it ${containerName} /bin/bash

$ sudo docker run –name my-apache-app -dit -p 8080:80 -v “$PWD”:/usr/local/apache2/htdocs/ httpd:2.4 /bin/bash
$ sudo docker exec -it my-apache-app /bin/bash
$ sudo docker stop my-apache-app
$ sudo docker rm my-apache-app
※殆ど場合、docker execを使用する

うん、docker execとdocker runは大分整理されてきた。

PHPExcelを使ってみよう

github: https://github.com/PHPOffice/PHPExcel

なんか古そうだかDLしてみる
$ git clone https://github.com/PHPOffice/PHPExcel.git

<?php

require_once './PHPExcel/Classes/PHPExcel.php';

$objBook = new PHPExcel();

$objSheet = $objBook->getActiveSheet();

$objSheet->setCellValue('A1', 'ABCDEFG');
$objSheet->setCellValue('A2', 123.56);
$objSheet->setCellValue('A3', TRUE);
$objSheet->setCellValue('A4', '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))');
$objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007");
$objWriter->save('test.xlsx');
exit();
?>

$ sudo apt-get install php-zip

うん、OK

[Docker] 基本操作

docker runは docker pull, docker create, docker startを順番に実行する
docker pullはダウンロード済みのときは再度ダウンロードはしない

$ docker pull httpd:2.4

### latest
タグ名を省略したときは最新版を意味するlatestという特殊なタグが指定されたものとみなされます。
本番環境でDockerを利用するのであれば、タグ名を省略せずに明示的に指定して、特定のイメージに固定することが殆ど
コンテナの定期的なアップデートは必須

### Docker コンテナの作成
コンテナを作成するには docker create を使う
$ sudo docker create –name my-apache-app -p 8080:80 -v “$PWD”:/usr/local/apache2/htdocs/ httpd:2.4
オプションを上記では –name, -p, -v を指定しているが、その他にもさまざまなオプションを指定できる

### nameオプションによる名前付
コンテナの名前をつける –nameオプションはほぼ使用する

### pオプションによるポート設定
-pオプションはポート番号をマッピング

### vオプションによるマウント設定
コンテナの特定ディレクトリに、ホストのディレクトリをマウントする設定

### Dockerコンテナの開始と停止
Docker start *

### -dit
「-dit」オプションを指定しなければ、コンテナがフォアグラウンドで実行されてしまう
-d: デタッチモード
-i: インタラクティブモード
-t: 擬似端末を割り当て

なるほどー