WindowsでDocker Hubからイメージをダウンロードしたりアップロードしたりしてみる

# 概要
Windows10にDocker環境を構築したのでいろいろ試してみた
今回はDocker コンテナの元となるイメージのダウンロード、アップロードなどDockerをインストールして最初にやることのコマンド一覧とまとめ

DockerとDockerイメージの関連は以下を参照

　[Dockerの基本機能と全体像のイメージを整理してみる](https://qiita.com/fkooo/items/934c7b6f1f0c0e8d1b21 "Dockerの基本機能と全体像のイメージを整理してみる")

動作環境とDocker環境構築方法は以下を参照

* Windows 10 Pro 64bit
* Docker for Windows

　[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca "WindowsでDocker環境を試してみる")

## できるようになること

* 自分のローカルマシンにDocker Hubから欲しいイメージをダウンロード
* 自分のイメージをDocker Hubにアップロード

## およその作業時間

30分

## 事前準備

Docker HubにイメージをアップロードするためにDocker Hubのアカウントが必要
（自分のローカルマシンにイメージをダウンロードするだけなら不要）
アカウントは以下のページで作成可能

　[Docker Hub](https://hub.docker.com/ "Docker Hub")

任意のID、メールアドレス、パスワードを登録するだけでアカウント作成できる

## 参考書籍

[プログラマのためのDocker教科書](https://amzn.to/355JaZx "プログラマのためのDocker教科書")　第3章
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4798153222/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798153222&linkCode=as2&tag=docker_start_004-22&linkId=4649efc1ae74515c1254d7d5c2672e90"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798153222&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=docker_start_004-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=docker_start_004-22&l=am2&o=9&a=4798153222" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
わかりやすくてDockerの入門書的な良本です^^
みんな購入していて売れ行き好調なのか第2版が発売されていたのでリンク更新

[【Kindle版】プログラマのためのDocker教科書](https://amzn.to/32lbjJY "【Kindle版】プログラマのためのDocker教科書")
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07BHK5KX7/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07BHK5KX7&linkCode=as2&tag=docker_start_004-22&linkId=4e745c6df3ca7a7c2334b3111aceb9f8"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07BHK5KX7&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=docker_start_004-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=docker_start_004-22&l=am2&o=9&a=B07BHK5KX7" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 使用コマンド一覧

```docker
docker pull イメージ名:タグ名
docker images
docker inspect イメージ名
docker tag 元のイメージ名:タグ名 ユーザ名/イメージ名:タグ名
docker search イメージ名
docker rmi イメージ名
docker login
docker push ユーザ名/イメージ名:タグ名
docker logout
```
## docker pull イメージ名:タグ名

Docker Hubからイメージをダウンロードするコマンド
タグ名は任意項目
イメージ名:タグ名 でタグ名にバージョンが指定できるが指定しないと最新をダウンロードする
pullだけであればDocker Hubのアカウントは不要（もちろんログインも不要）

```docker
> docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest
```

## docker images

ローカルマシンにダウンロードしているイメージの一覧を表示するコマンド

```docker
> docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
ubuntu                      latest              00fd29ccc6f1        2 weeks ago         111MB
```

主要項目の説明は以下の通り
* REPOSITORY イメージ名
* TAG タグ名（通常はバージョン）
* IMAGE ID イメージID
* CREATED 作成日

## docker inspect イメージ名

イメージの詳細を確認するコマンド
詳細情報がJSON形式で返却される

```docker
> docker inspect ubuntu
[
    {
～～～省略～～～
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 110512187,
        "VirtualSize": 110512187,
～～～省略～～～
```

## docker tag 元のイメージ名:タグ名 ユーザ名/イメージ名:タグ名

ダウンロードしたイメージにわかりやすいタグを付けるコマンド
慣習的に付けるユーザ名はDocker HubのID、タグ名はバージョンが良い

```docker
> docker tag ubuntu user/server01:0.1

> docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
ubuntu                      latest              00fd29ccc6f1        2 weeks ago         111MB
user/server01               0.1                 00fd29ccc6f1        2 weeks ago         111MB
```

docker imagesコマンドで確認
タグを付けただけでイメージの実体は同じため同じイメージIDとなる

## docker search イメージ名

Docker Hubに公開されているイメージを検索するコマンド

```docker
> docker search ubuntu
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating s...   7032                [OK]
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            153                                     [OK]
```

主要項目の説明は以下の通り
* NAME イメージ名
* STARS お気に入り数
* OFFICIAL 公式イメージだと[OK]となる
* AUTOMATED Dockerfileをもとに自動生成されたイメージだと[OK]となる

Dockerfileについては別の機会に投稿予定、、、

### 注意

docker search などDocker Hubに接続するコマンド(docker pull/docker login/docker searchなど)で以下のエラーが出た場合はDockerのNetworkのDNS設定をFixedに変更してみる

```docker
Error response from daemon: Get https://index.docker.io/v1/search?q=ubutu&n=25: dial tcp: lookup index.docker.io on 192.168.1.1:XX: read udp 192.168.2.2:XXXXX->192.168.11.1:XX: i/o timeout
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/11edd9f8-d92e-180a-35b1-1bae1cec09cd.png)

Settingsの開き方は以下を参照
　[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca "WindowsでDocker環境を試してみる")

## docker rmi イメージ名

ダウンロードしたイメージを削除するコマンド

```docker
> docker rmi user/server01:0.1
Untagged: user/server01:0.1
```

## docker login

Docker HubにID/パスワードでログインするコマンド

```docker
> 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: IDxxx
Password:
Login Succeeded
```

## docker push ユーザ名/イメージ名:タグ名

Docker Hubに指定したイメージをアップロードするコマンド

```docker
> docker push user/server01:0.1
The push refers to a repository [docker.io/user/server01]
f17fc24fb8d0: Layer already exists
6458f770d435: Layer already exists
5a876f8f1a3d: Layer already exists
d2f8c05d353b: Layer already exists
48e0baf45d4d: Layer already exists
0.1: digest: sha256:f871d0805ee3ce1c52b0608108dbdf1b447a34d22d5c7278a3a9dd78fc12c663 size: 1357
```

### 注意

Docker Hubにpullする場合は、イメージのユーザ名とDocker HubのIDが一致しないと以下のエラーが発生する

```docker
> docker push user/server01:0.1
The push refers to a repository [docker.io/user/server01]
f17fc24fb8d0: Preparing
6458f770d435: Preparing
5a876f8f1a3d: Preparing
d2f8c05d353b: Preparing
48e0baf45d4d: Preparing
denied: requested access to the resource is denied
```

<font color="Red">user</font>部分をdocker tagコマンドでDocker HubのIDに変更して再度pushすればOK

## docker logout

Docker Hubからログアウトするコマンド

```docker
> docker logout
Removing login credentials for https://index.docker.io/v1/
```