[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は大分整理されてきた。

[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: 擬似端末を割り当て

なるほどー

[Docker] Apacheのdockerを動かす

Docker hub
https://hub.docker.com/_/httpd
-> httpdをdownloadします

$ sudo docker run -dit –name my-apache-app -p 8080:80 -v “$PWS”:/usr/local/apache2/htdocs/ httpd:2.4

$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d6766e52c1e httpd:2.4 “httpd-foreground” About a minute ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp my-apache-app

### コンテナの停止と再開
$ sudo docker stop my-apache-app
$ sudo docker start my-apache-app

### ログ出力
$ sudo docker logs my-apache-app

### イメージの破棄
rmを使うにはコンテナが停止状態にならなければいけない
$ sudo docker stop my-apache-app
$ sudo docker rm my-apache-app
$ sudo docker image rm httpd:2.4

なるほど、この辺は基礎というか、ある程度理解している

[Docker] ベースイメージの考え方

Dockerイメージの種類
1. 基本的なLinuxディストリビューションだけのイメージ
2. アプリケーション入りのイメージ
L web server(apache, nginx)
L database server(MySQL, MariaDB, PostgreSQL)
L WordPress, Redmin, Roundcube

業務システムでDockerを使う場合は、LinuxのみDockerイメージを使ってコンテナを作り、そこに自社開発したシステムをインストールして使うことがほとんど
※アプリケーション入りのDockerイメージは、イメージの大きさを小さくするために、最低限のコマンドやライブラリしか入ってなかったり、特殊な初期起動設定がされているため
それをカスタムDockerイメージとして作成する

なるほど、Linux系で開発するのか、、、
非常に勉強になったぜ…

[Docker] docker-composeでDjangoの開発環境構築

Dockerfile

FROM python:3

ENV PYTHONUNBUFFERED 1

RUN mkdir /code

WORKDIR /code

COPY requirements.txt /code/

RUN pip install -r requirements.txt

COPY . /code/

requirements.txt

Django==2.0
psycopg2

docker-compose.yml

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

$ sudo docker-compose run web django-admin.py startproject webpj .
AttributeError: module ‘collections’ has no attribute ‘Iterator’

なんやこれーーーーーーーー