Docker 備忘録


# 目的
Docker の学習をしたため、いつでも引き出せるようその備忘録を残す。

# 内容
## 構成
### Docker
|    名称     |    内容    |
|-------------|------------|
|Docker ホスト|Docker Engine をインストールしたアプリ（= Docker コンテナを動かすコンピューター）|
|Docker コンテナ|システムの実行環境を隔離した空間|
|Docker イメージ|必要なファイルを全て固めたアーカイブパッケージ|

## コマンド
### Docker Engine
```
// 権限付与
$ chmod 400 ~/docker_ec2.pem 

// ssh
$ ssh ubuntu@XX.XX.XX.XXX -i ~/docker_ec2.pem

// パッケージアップデート
$ sudo apt-get update

// 必要なパッケージのインストール
$ sudo apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

// GPG キーダウンロード
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

// Docker ダウンロードサイトを apt リポジトリに追加
$ sudo add-apt-repository \
> "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
> $(lsb_release -cs) \
> stable"

// パッケージアップデート
$ sudo apt-get update

// Docker Engine 他一式ダウンロード
$ sudo apt-get install -y docker-ce docker-ce docker-ce-cli containerd.io

// ubuntu で Docker を利用できるようにする
$ sudo gpasswd -a ubuntu docker

// ログオフ
$ exit

// Docker の確認
$ docker --version
```
### Docker の brew install
```
$ brew install docker
$ brew install docker-compose
$ brew install docker —cask
```
### 基本コマンド
```
// docker run(docker pull/docker create/docker start をまとめたコマンド)
$ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

// 実行中のコンテナ一覧
$ docker ps

// 稼働中でないものも含めたコンテナ一覧
$ docker ps -a

// 再開
$ docker start my-apache-app

// ログ
$ docker logs my-apache-app

// 停止
$ docker stop my-apache-app

// 削除
$ docker rm my-apache-app

// docker image 確認
$ docker image ls

// docker image 削除
$ docker image rm httpd:2.4

// pull
$ docker pull httpd:2.4

// create
$ docker create --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

// attach
$ docker attach my-apache-app

// 停止中のコンテナでシェル実行
$ docker run --name my-apache-app -it httpd:2.4 /bin/bash

// 実行中のコンテナでシェル実行
$ docker exec -it my-apache-app /bin/bash
```
### 永続化
```
// 現在のカレントディレクトリの状態を保存した上で、別の場所にカレントディレクトリを移動
$ pushd /tmp

// コピー
$ docker cp /tmp/index.html web01:/usr/local/apache2/htdocs

// 元のディレクトリに戻る
$ popd

// ボリューム作成
$ docker volume create --name mysqlvolume

// ボリューム確認
$ docker volume ls

// ボリュームの場所
$ docker volume inspect mysqlvolume

// 軽量 Linux システム busybox
$ docker run --rm -v mysqlvolume:/src -v "$PWD":/dest busybox tar czvf /dest/backup.tar.gz -C /src .

// tar コマンド確認
$ tar tzvf backup.tar.gz
```
### ネットワーク
```
// ネットワーク確認
$ docker network ls

// コンテナの詳細情報(IP アドレス検索のため)
$ docker container inspect web01
$ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' web01
$ docker container inspect --format="{{.NetworkSettings.IPAddress}}" web01

// ネットワーク bridge の詳細情報
$ docker container inspect bridge
$ docker inspect bridge docker network inspect --format='{{range $host, $conf := .Containers}}{{$conf.Name}}->{{$conf.IPv4Address}}{{"\n"}}{{end}}' bridge

// 疎通確認
$ ping -c 4 172.17.0.2

// ネットワークを作成
$ docker network create mydockernet

// 接続
$ docker network connect mydockernet web01

// 切断
$ docker network disconnect bridge web01
```

### docker compose
```
// python インストール
$ sudo apt install -y python3 python3-pip

// docker-compose インストール
$ sudo pip3 install docker-compose

// バージョン確認
$ docker-compose --version

// 実行
$ docker-compose up -d

// 確認
$ docker-compose ps

// コンテナ・ネットワーク削除
$ docker-compose down

// 停止
$ docker-compose stop

// 起動
$ docker-compose start
```
### Dockerfile
```
// Dockerfile 起動
$ docker build -t myimage01 .

// 履歴
$ docker history --no-trunc myimage01
```
### save
```
// ファイル保存
$ docker save -o saved.tar myphpimage

// ファイルサイズ確認
$ ls -al saved.tar

// ロードする
$ docker load -i saved.tar

// export
$ docker export -o exported.tar myphp02

// import
$ docker import exported.tar tmp_httpd
```
### Docker Hub
```
// タグ付け
$ docker tag myexample fmyuk135/myexample

// push
$ docker push fmyuk135/myexample

// pull
$ docker pull fmyuk135/myexample

// ログアウト
$ docker logout
```

# 参考文献
- [さわって学ぶクラウドインフラ　docker基礎からのコンテナ構築](https://books.rakuten.co.jp/rb/16350772/)