（備忘録）Dockerコマンド

# 1. はじめに
Dockerコマンドについての自分への備忘録としてまとめてみました。ご参考になれば幸いです。

参考：[コマンドラインリファレンス](http://docs.docker.jp/engine/reference/commandline/run.html)
参考：[Docker入門 Dockerコンテナのステータスを調べてみよう](https://www.skyarch.net/blog/?p=16702)

# 2. Dockerコマンド

```shell:コマンドライン

// docker一括実行（docker pull & docker create & docker startを一括実行）
$ docker run hello-world

// dockerイメージ取得（イメージはコンテナの素）
$ docker pull alpine

// dockerイメージ一覧表示
$ docker image ls

// dockerコンテナ生成
$ docker create -it alpine

// dockerコンテナ一覧表示
$ docker container ls -a

// dockerコンテナ起動
$ docker start [CONTAINER ID]

// dockerコンテナ停止
$ docker stop [CONTAINER ID]

// dockerコンテナOSへログイン
$ docker run -it alpine bin/sh

// dockerコンテナOSからログアウト
CTRL + P + Q

// dockerコンテナ削除
docker rm [CONTAINER ID]

// dockerコンテナリネーム
$ docker rename [OLD CONTAINER NAME ] [NEW CONTAINER NAME]

// dockerイメージの削除
docker rmi [IMAGE ID]

// dockerイメージ一括削除
$ docker image prune

// dockerログ確認
$ docker logs [CONTAINER ID]

```

# 3.Dockerコンテナサンプル＆動作確認
## hello-world
- 動作確認：実行結果の一部に「Hello from Docker!」が出力される。
- 終了すると --rm オプションをつけているのでコンテナは削除される。

```shell:コマンドライン
$ docker run --rm hello-world
```

## WEBサーバ（nginx）
- 動作確認：起動後、ブラウザから[http://localhost:8080](http://localhost:8080)にアクセスして「Welcome to nginx!」が出力されていればOK。
- 終了すると --rm オプションをつけているのでコンテナは削除される。

```shell:コマンドライン
$ docker run -it --rm -p 8080:80 nginx:latest
```

## php7.0-apache

```shell:コマンドライン
$ docker run -d -p 8080:80 --name php7apa php:7.0-apache

#ログイン
$ docker exec -it php7apa2 bash

```

## WEBサーバ（httpd:alpine）
- 動作確認：起動後、ブラウザから[http://<サーバのIPアドレス>:8080](http://localhost:8080)にアクセスして「It works!」が出力されていればOK。
- 停止すると --rm オプションをつけているのでコンテナは削除される。

```shell:コマンドライン
// デタッチド・モードとしてバックグラウンドでコンテナを実行
$ docker run -d -p 8080:80 --name docker-httpd --rm httpd:alpine

// コンテナプロセス確認
$ docker ps

// 停止
$ docker kill docker-httpd
```

# 4. Dockerデーモンコマンド

```shell:コマンドライン

// dockerデーモン起動
$ sudo service docker start

// dockerデーモンステータス確認
$ sudo service docker status

// dockerデーモン停止
$ sudo service docker stop

```

# 5. WSL（Windows Subsystem for Linux）でDocker利用する際のメモ
- [Windows Subsystem for Linux（Hyper-Vなし）でDockerを動かす](http://www.nuits.jp/entry/docker-on-wsl)
- [WSL環境でDockerが動作しなくなった](https://qiita.com/_takeuchi_/items/3df7f51058246898bde8)
- WSL（Windows Subsystem for Linux）は「管理者として実行」する
- 以下の魔法のコマンドでDockerを起動する

```shell:コマンドプロンプト（Dockerデーモンが起動していない時に実行する）
$ sudo cgroupfs-mount && sudo service docker start

```

- WSL（Windows Subsystem for Linux）側のみでDockerコマンドを利用し、PowerShell（パワーシェル）側ではDockerコマンドを利用しない

# 6. WSL（Windows Subsystem for Linux）でdocker-compose利用する際のメモ

※2019年3月2日時点の結論：
おそらくWidnows10Pro WSL では、まだdocker-composeは利用できない。

- [WSLでdockerのインストールからdocker-composeまで動かす](https://qiita.com/tettsu__/items/85c96850d187e4386c24)
- [Windows Subsystem for Linux + Docker for Windows を使えるようにするまでメモ](https://qiita.com/tettekete/items/086ea3bc8a798cae33f5)
- [Dockerでpullやrunを行ったときイメージダウンロードができなくなった問題の解決法](http://satoyashiki.hatenablog.com/entry/2017/04/01/175604)
- [dockerをWindows10 HomeのWSL (Windows Subsystem for Linux)で動かしてみた](https://www.scriptlife.jp/contents/programming/2018/07/09/docker-on-wsl/)

# 7.docker-composeコマンド
- 複数のdockerコンテナをまとめて起動したい場合は、docker-compose.ymlファイルを定義し、docker-composeコマンドを利用する。

```shell:コマンドライン
// docker-compose.ymlのビルド
$ docker-compose build
$ docker-compose up –d

// docker-composeの起動
$ docker-compose start

// docker-composeの一覧表示
$ docker-compose ps

// docker-composeの停止
$ docker-compose stop

// docker-composeの再起動
$ docker-compose restart

// コンテナの削除
$ docker-compose down

// コンテナの削除＆イメージの削除
$ docker-compose down --rmi all

// docker-composeログの確認
$ docker-compose logs

```

# 8.docker-compose.ymlサンプル＆動作確認
## hello-world
- 動作確認：実行結果の一部に「Hello from Docker!」が出力される。

```yml:docker-compose.yml
version: "2"

services:
  app:
    image: hello-world

```

```shell:コマンドライン
$ sudo docker-compose up
```

# 9. Dockerチュートリアル
- [Part 2：コンテナ](http://docs.docker.jp/get-started/part2.html)

# 10. docker-composeチュートリアル
- [Compose を始めましょう](http://docs.docker.jp/compose/gettingstarted.html)

# 11. Dockerイメージダウンロードサイト
- [Docker Hub](https://hub.docker.com/)

# 12. docker login
- dockerコマンド実行時に認証エラーが発生した場合は、``` docker login ``` コマンドを用いて認証をおこなう。この際、メールアドレスではなくてユーザ名を用いてログインする必要があると思われる。
- [docker login での Sign in について](https://qiita.com/tearoom6/items/b14913161250b2b30d0f)

```
Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: unauthorized: incorrect username or password.
```
# 13. AWS Cloud9環境でdocker-composeコマンドを使えるようにする
- AWSアカウントをお持ちでdocker-composeを試したいのでしたら、Windows WSLやMac OS Xでdocker-composeコマンドが利用できる環境を整えるよりもお手軽にdocker-composeコマンドが使えるようになると思います。

- 取得してくるdocker-composeのバージョンやインストールコマンドは[リリース一覧](https://github.com/docker/compose/releases)から確認できます。

```shell:コマンドライン
// 作業フォルダに移動
$ cd ~/environment

// curlコマンドでdocker-composeを取得
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

// docker-composeコマンドに実行権限を付与
$ sudo chmod +x /usr/local/bin/docker-compose

// docker-compose.ymlを作成する
// touch docker-compose.yml で空ファイルを作成して
// vi docker-compose.yml でviエディタでdocker-compose.ymlを編集＆保存

// docker-compose upコマンドでdocker-compose.yml定義を実行
$ docker-compose up

```

# 14. おわりに
参考になれば幸いです。

2019/02/24 TAKAHIRO NISHIZONO

# 15. 参考：Docker Compose入門
- [Docker Compose入門 (1)](https://knowledge.sakura.ad.jp/21387/)

## wordpress

```yml:docker-compose.yml
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
```

```shell:コマンドライン
// 起動（バックグラウンド（デタッチド・モード））
$ sudo docker-compose up -d

// WordPressにアクセス
// ブラウザで、http://localhost:8080 を開く。

// 停止
$ sudo docker-compose stop

// 起動
$ sudo docker-compose start

// 停止・終了＆削除
$ sudo docker-compose down -v
```

- [Docker Compose入門 (2)](https://knowledge.sakura.ad.jp/23632/)

## WEBサーバ（httpd:alpine）

```shell:コマンドライン
// ホームディレクトリに移動
$ cd 

// プロジェクトディレクトリを作成
$ mkdir docker-httpd

// プロジェクトディレクトリに移動
$ cd docker-httpd

// docker-compose.ymlファイルを作成
$ vi docker-compose.yml
```

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "8080:80"
```

```shell:コマンドライン
// Dockerfileファイルを作成
$ vi Dockerfile
```

```yml:Dockerfile
FROM httpd:alpine
```

```shell:コマンドライン
// ビルド
$ docker-compose build

// プロジェクトを起動（バックグラウンド（デタッチド・モード））
$ sudo docker-compose up -d

// プロセスを確認
$ docker-compose ps

// httpdにアクセス
// ブラウザで、http://<サーバのIPアドレス>:8080 を開く。

// プロジェクトを停止
$ docker-compose stop

// 再び起動
$ docker-compose start

// コンテナ内にログイン（webサービスに対しbashプロセスを起動）
$ docker-compose exec web /bin/bash

// コンテナ内からログアウト
bash-5.0# exit

// コンテナの停止・終了＆プロジェクトの削除
$ sudo docker-compose down -v
```

```shell:コマンドライン
// index.htmlファイルの作成
$ echo '<h1>Hello World</h1>' > index.html

// Dockerfileファイルの再編集
$ vi Dockerfile
```

```yml:Dockerfile
FROM httpd:alpine
COPY ./index.html /usr/local/apache2/htdocs/index.html
```

```shell:コマンドライン
// ビルド＆プロジェクトを起動（バックグラウンド（デタッチド・モード））
$ docker-compose up -d --build

// プロセスを確認
$ docker-compose ps

// httpdにアクセス
// ブラウザで、http://<サーバのIPアドレス>:8080 を開く。

// コンテナの停止・終了＆プロジェクトの削除
$ sudo docker-compose down -v
```