Dockerコマンド

# 1.Dockerインストール

Raspberry Pi3上にDockerをインストールします。

```console:/home/pi
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
```

起動テスト:Versionを確認し表示されれば正常にインストールできています。

```console:/home/pi
pi@raspberrypi:~ $ sudo usermod -aG docker pi
pi@raspberrypi:~ $ docker version
Client:
 Version:           18.06.3-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        d7080c1
 Built:             Wed Feb 20 02:34:35 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server:
 Engine:
  Version:          18.06.3-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       d7080c1
  Built:            Wed Feb 20 02:30:23 2019
  OS/Arch:          linux/arm
  Experimental:     false
```

(注)一般ユーザーでdocker versionを始めとしてdockerコマンドを実行できないことがあります。
その場合、一般ユーザーに権限を付加する必要があります。その方法は[こちら](https://qiita.com/naomichi-y/items/93819573a5a51ae8cc07)をご覧ください。




# 2. Rasbian Image取得

下記のImage取得作業ができない場合は、一度logoutを行い、再度loginを行い再実行する。

```console:/home/pi
pi@raspberrypi:~ $ sudo docker pull resin/rpi-raspbian  //rasbianを使う場合はこちらを使う。
pi@raspberrypi:~ $ docker pull ubuntu:18.04 //ubuntuを使う場合はこちらを使う
```

RasbianのImageが取得できたかどうかの確認はdocker image lsで実施する。

```console:/home/pi
pi@raspberrypi:~ $ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
resin/rpi-raspbian   latest              28f1ee4d4d5a        8 months ago        128MB
```

RasbianのImageの削除はdocker rmi [イメージID]で行う。

```console:/home/pi
pi@raspberrypi:~ $ docker rmi d7ac96770fef
Deleted: sha256:d7ac96770fefd605cf39c955951443dc2b0b8563cdad57db51821690a6be565a
```




# 3. Image取得からコンテナを作るコマンド

・フォーマット
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/a45e9778-38b5-fa7b-e4c9-651a7cca1e12.jpeg)

<b>使用例</b>
・Imageからコンテナをつくる。ポート90とポート3000を空ける場合の書き方

```console:/home/pi
docker run -it --name rasp0 --publish 90:90 --publish 3000:3000 resin/rpi-raspbian:latest bash
```

・Imageからコンテナをつくる。ポート4000を空ける場合の書き方

```console:/home/pi
docker run -it --name radiko --publish 4000:4000 ubuntu:18.04 bash
```

・コンテナを起動させる

```console:/home/pi
docker start -ai rasp0
```

# 5. ホストとコンテナのファイル共有

ホストをファイル共有を行うコンテナを作る。複数ポートを空けたい時は、--publish 91:91 --publish 3000:3000とする。
「-m 4g」はコンテナに4Gのメモリを割り当てるという意味になる。

[ホーム] /hoem/pi/dcshare と[コンテナ内] /homeでファイルを共有する方法
<b>構文</b>
docker run -m 4g -v [共有を行うホームのディレクトリ]:[共有を行うコンテナのディレクトリ] -it --public xx:yy [イメージ] bash


```console:例文
docker run -m 4g -v /home/pi/dcshare:/home -it --publish 91:91 --publish 3000:3000 resin/rpi-raspbian:latest bash
```

実際に割り当てられたかどうかはfreeコマンドで確認できる。

```console:
root@b5f28ebc9bee:/# free
              total        used        free      shared  buff/cache   available
Mem:        4039632      163352      929732      281480     2946548     3600908
Swap:       1946040           0     1946040
```


# 4. 各種アプリのインストール

下記の作業はdocker上で使用する場合は、コンテナの中に入って行うこと。


## 4.1 Node.jsとnpmのインストール

[こちら](https://qiita.com/mascii/items/77c685df65c4cbca9315#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参照してください。

# 5. container操作

```console:/home/pi
pi@raspberrypi:~ $ docker container ls -a  //すべてのコンテナを表示する
pi@raspberrypi:~ $ docker stop ebf7914c15d5 //IDを指定してコンテナを停止する
pi@raspberrypi:~ $ docker container rm ebf7914c15d5 //IDを指定してコンテナを削除する
pi@raspberrypi:~ $ docker rename [container_oldname] [container_newname]　//コンテナの名前を変更する
pi@raspberrypi:~ $ docker start [コンテナ名] // 指定したコンテナをスタートする
pi@raspberrypi:~ $ docker exec -it [コンテナ名] bash // 指定したコンテナに入る
pi@raspberrypi:~ $ docker unpause CONTAINER //一時停止したコンテナを再開させる。
```

# 6. containerのネットワーク調査

```console:/home/pi
pi@raspberrypi:~ $ docker container inspect --format '{{ .NetworkSettings.IPAddress }}' [container名]  //コンテナに割り当てられたIPアドレスを取得する
pi@raspberrypi:~ $ docker container inspect [container名] //containerのネットワーク情報を取得する。
pi@raspberrypi:~ $ docker network ls //dockerネットワーク内の構成要素を取得する。
pi@raspberrypi:~ $ docker network connect [ネットワーク名] [コンテナ名] //指定したコンテナをネットワークに接続する

```

・docker container inspect [container名] containerのネットワーク情報を取得する。当該コンテナは、ネットワーク「bridge」と「my_app_net」に所属していることが分かる。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/53f8b0b0-6767-0908-12ca-f1e113577e74.jpeg)

・docker container inspect [container名] //containerのネットワーク情報を取得する。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/559e5fee-d4cd-03fc-ce51-272e3a70e79d.jpeg)


補足
PS C:\Users\fdfpy> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3f0b5fcd495c   bridge    bridge    local
a08ced067d17   host      host      local
32c8ce9d2e91   none      null      local






# 7. Vue-cliでローカルサーバーを立ち上げ

[こちら](https://qiita.com/NT1123/items/fda5c66f9ffdba878c8a#12-vue-cli%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従いVue-cliをインストールする。


gitのインストールが必要。インストール方法は[こちら](https://qiita.com/noraworld/items/8546c44d1ec6d739493f)を参照してください。


Vue-cliをインストールしたディレクトリのアクセス権限が制限されている場合、下記のコマンドでアクセス権限を広げる。

```console:コンテナ内にて
pi@raspberrypi:~ $ sudo chmod o+rw [ディレクトリ名] -R  //誰でもアクセスできるようにした。 
```

コンテナ内にVue-Cliで立ち上げたローカルserverにアクセスしたい場合、config/index.jsのhost: '0.0.0.0'に変更する。(localhostではアクセスできない)
port: 91(例)
とする。
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/2e2d8c87-4e40-7cd5-e76b-ac35f93976be.jpeg)


##注意

例えばhttp://xxx.xxx.xxx.xxx:91を入力するとVue.jsで構成したローカルサーバーにアクセスができ、Vue.jsのデモ画面が閲覧できる。



一度container内でローカルサーバーを立ち上げる→Ctrl +Z で強制終了した場合、指定したportが使用されたままになってしまい、再度ローカルサーバを立ち上げる場面にて「address already in used」と出力されてエラーになる。この問題を避けるには指定したportをkillで消去しなければいけない。

```console:コンテナ内にて
root@ed8e72dc832e:/home# apt-get install lsof / /lsofインストール
root@ed8e72dc832e:/home# lsof -i:90  //port 90を使用しているプロセスを表示する
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    1077 root   21u  IPv4 994397      0t0  TCP localhost:91 (LISTEN)
root@ed8e72dc832e:/home# kill -9 1077 //プロセス番号 1077を削除する
```

windowsの場合(powershellでコマンドを実行すること)

```console：powershellにて
C:\Users\fdfpy>  netstat -nao|findstr "91"
 プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:91             0.0.0.0:0              LISTENING       2196

C:\Users\fdfpy> taskkill /f /pid 2196
成功: PID 2196 のプロセスは強制終了されました。
```



node.jsでローカルサーバーを立ち上げたときにホストからアクセスできない場合の対応は[こちら](https://qiita.com/hotdrop_77/items/a2ca316c97ba4b748d9a)


# 8. コンテナからイメージファイルを作成する。

<b>構文</b>
docker commit [コンテナ名] [イメージ名]:[タグ]

```console:コンテナ外にて
pi@raspberrypi:~ $ docker commit ed8e72dc832e custom-rasp:rasp
sha256:e6e896468bece61e92ff30cb440efcfc3a56eed3bb986b47f162c9901ec3c01b
pi@raspberrypi:~ $ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
custom-rasp          rasp                e6e896468bec        6 minutes ago       601MB
<none>               <none>              d7ac96770fef        About an hour ago   601MB
<none>               <none>              3646b21d0ac3        About an hour ago   601MB
nginx                latest              96fa93c111fd        2 weeks ago         97.6MB
resin/rpi-raspbian   latest              28f1ee4d4d5a        8 months ago        128MB
docker/compose       1.9.0               78c3b8586e4a        2 years ago         59.5MB
```







# 9. イメージファイルを別のマシンに移す

[こちら](https://qiita.com/rjegg/items/0bef14ee419c8298126c)をご覧ください。

# 10. Docker hubにイメージをアップロードする



# 10-1 イメージファイルを決められた形式の名前に変更する
Docker Hubにイメージをアップロードする場合、Imageファイル名を指定した形式で決めないといけないです。

すでにImageファイル名がある場合、下記のコマンドでImageファイル名を変更する。

docker tag [従来のImageファイル名] [Docker Hubアカウント名]/[従来のImageファイル名]:latest

```console:コンテナ内にて
pi@raspberrypi:~ $ docker tag 3130485e78a3 fdfpy/3130485e78a3:latest

pi@raspberrypi:~ $ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED            SIZE
fdfpy/3130485e78a3   latest              3130485e78a3        27 minutes ago     1.68GB   ←名前を変更した
stockget             20200410            3130485e78a3        27 minutes ago     1.68GB　 ←すでにあるImage
stockget             20200316            732b01dc576f        3 weeks ago        1.66GB
stockapri            20200224            e7b9ee411bf3        6 weeks ago        1.32GB
stockget             v0                  e18cee2f2da6        3 months ago       1.11GB
ubuntu               18.04               154a1aa86195        3 months ago        46.7MB
resin/rpi-raspbian   latest              28f1ee4d4d5a        14 months ago       128MB
```

# 10-2 Docker Hubにログインする
```console:コンテナ内にて
pi@raspberrypi:~ $ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: fdfpy
Password:
WARNING! Your password will be stored unencrypted in /home/pi/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```


# 10-3 Docker Imageファイルをアップロードする

```console:コンテナ内にて
pi@raspberrypi:~ $ docker push fdfpy/3130485e78a3:latest
The push refers to repository [docker.io/fdfpy/3130485e78a3]
f7dce5f67e14: Pushed
aaaaca953bab: Pushed
77f7899a8a08: Mounted from library/ubuntu
e22dd39d4c8f: Mounted from library/ubuntu
c193d85f5937: Mounted from library/ubuntu
1f1b075df34b: Mounted from library/ubuntu
latest: digest: sha256:cf651e8654168b43f9879df364bec2a02965045053d0d6ca4d6631d418864ae3 size: 1578
```

# 11 その他

bad marshal data (unknown type code)が出たら「find /usr -name '*.pyc' -delete」を実行したら正常に動作した