Dockerの大まかなイメージから自分が作成したものをDockerhubにあげて、インストールして実行まで

# はじめに

:bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1:
この記事の『使い方』以降は今後Dockerを使う方には意味のない記事になるかもしれません。ご了承ください。
:bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1::bow_tone1:
<br>

<font color="red">

**dockerコマンド使うのに『Docker Desktop』と『Docker Toolbox』の選択肢があるようです。**

基本的に『Docker Desktop』の方が容易に使え結構使っているかもの予測です。(あくまで個人のです、)

**以下記事は結構前にあまりdockerを使ったことがない人が『Docker Toolbox』でやろうとして書いた記事になることご了承ください(前に書いた記事なので)。**

その後色々したことも追記したので**整合性とれていなくなっているものあるかもです。**

と言うのも途中に『Docker Desktop』入っていますが昔は使わないでそのまま使用できました、、(絶対不要の自信がなく記述はそのままにしています。)

ちなみに『Docker Desktop』入っていない状態でdockerコマンドも使えていましたし使えています。

以下リンクのように共存できるようなので只今(ただいま)お試し中です。
=> 追記: 諦めました。『Docker Desktop』インストールでdocker使えるがターミナルではどうしてもdockerコマンド使えないので以下の手順のように使うにしました、、普通の何もしていないPCなら『Docker Desktop』インストールだけでターミナルでもdockerコマンド使えていた認識違ったのですかね、、

参考
https://docs.docker.jp/desktop/mac/docker-toolbox.html

ちなみに、
『Docker Desktop』使う場合、大手企業などは有料版使用必須の可能性あるので注意が必要かと、
逆に『Docker Toolbox』の場合は『Docker Desktop』を使う前提で作られたものとか使ったりする場合色々はまったり使えないみたいなことあるかもです。(わかりづらくすみません)

正直dockerコマンド個人で使う場合はどちらでもいいような気がしますが『Docker Desktop』から入った方が比較的優しいのではと思ったりしました(◍•ᴗ•.◍) ※個人の感想です。

**なのでこの記事前に『Docker Desktop』使う検討することオススメさせていただきます！**:bow_tone1:

ちなみにDockerって何?的なことも書いているのでそこら辺は少しは参考になるのではないかなと思っています！:bow_tone1:

よろしくお願いします！:bow_tone1:
</font>


# 最初に少しメモ
参考URL
http://docs.docker.jp/index.html
https://hub.docker.com/ ※ここにあるイメージを使ってコンテナ作成したりします。

# Dockerで行うことの大まかなイメージ
まず初めに『Docker』というものは、『コンテナ』というものを使います。

その『コンテナ』を使うために必要なことがたくさんあります。
その必要なことをここで書いていきたいと思います。

ここから『コンテナ』の道のりを話していくので、一度頭の中を真っ白にしてください。

まず土台となる『マシーン』なるものが必要になります。
いわば作業する土台です。
それは、Web開発している方におなじみ『VirtualBox仮想マシン』です。
仮想マシンで捉えにくければマシーンで大丈夫です。
ウィーン、ウィーンって操作するあのマシーンです。

次ですが、その『マシーン』の中で動かす『コンテナ』なるものが必要になってきます。
早速今回の『コンテナ』が出てきました。

しかし、このコンテナを作成するのにもまだまだ少しひと手間が必要です。
順番でいうと
『Dockerfile』→　『Dockerimage』→　『コンテナ』以下図参考

いきなり沢山の用語が出てきてこんがらがるかもしれませんが、引かないでください。

まず、Dockerfileとはいわば設計書の本体だと思ってください。
そしてその本体をコピーして色々なところで使います。

そのコピーされるものがDockerimageだと思ってください。

そのコピーを使って実際動く『コンテナ』を作成、動かす感じです。

で、動かすための環境にマシーンなるものが大元にあると行った感じ。
なので、まとめると
マシーンの中にDockerfileを作って、DockerfileからDockerimageなるものを作成して、コンテナをたてて、動かすです。

|<img width="989" alt="スクリーンショット 2018-05-27 2.16.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/bf43dc47-073c-b8dc-fe24-95444ab98431.png">|
|:-:|


ちなみに、『Dockerfile』は自分で作成することも可能ですが、誰かが使ったものを使うことも可能です。

自分で作成すると書いてはいますが、本当の一からだとかなりしんどいはずです。
なので一般的には、公式などが作成したものを『ベース』にして追加して作成していく感じです。

もちろん自分が追加作成したものも、誰かが追加作成したものを『ベース』にすることもできます。
その公式が作ったもの、自分で作ったもの、他の人が作ったベースがあるところが、Dockerhubです。

|<img width="898" alt="スクリーンショット 2018-05-27 2.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/8c36dffb-8a9c-c45a-6eb6-262e08d58345.png">|
|:-:|

ここまででコンテナの話をしてきましたが、このコンテナで知っておかないといけない大事なことがあります。それは、コンテナ一つは一つのサーバーとしてしか扱えないということ。

世の中のサービスはWebサーバー、データーベースサーバー、メールサーバー色々あって、それを連携させていますが、ここでのコンテナも同じようにサーバーを一つ一つ作るようにコンテナを一つ一つ作らないといけません。

しかし、それだと毎回大変ですし、いつもなら忘れないのに、忘れてうまくいかないなどがあります。

なのでDockerにはこの作業を書いておく手順書を用意して、その手順書の実行を行えばそれ通りに行ってくれるようにしてくれるものがあります。

それがDocker Composeなるものです。以下図参考

ちなみにこれ以降に関してDocker Composeのお話をしませんのでご了承ください。

|<img width="908" alt="スクリーンショット 2018-05-28 1.29.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/86667212-0be9-05ee-0bc5-e8e25a57d9d9.png">|
|:-:|
**※以下でDocker Composeの話は行なっていません。**

では、色々Dockerのイメージが少なからずつかめたので次は早速使っていきたいと思います。
最初は最初のマシーンを入れるまでの作業ぐらいに思って進めていただければ嬉しいです。

# 使い方
## まず初めに
※環境はmacです。

- Macのバージョンの確認を行います。DockerはOS X 10.8 「Mountain Lion」以上のバージョンが必須なので、そうでない場合マックのOSのバージョンをあげてください。

|<img width="243" alt="スクリーンショット 2018-05-27 22.03.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/ec3c39d2-efd7-669b-1d9f-4766afd36cc9.png">|
|:-:|

- ~~https://store.docker.com/editions/community/docker-ce-desktop-mac
でDockerMacのインストール(intelチップの方)~~


- 以下のコマンドでDockertoolboxのインストール

```
$ brew update
$ brew install docker-toolbox --cask
```
※少し前までは『$ brew cask install docker-toolbox』
参考:https://www.mathkuro.com/mac/brew-cask-command-error/

再インストールしたい場合は以下のコマンドを

```
$ brew cask reinstall docker-toolbox
↓
//また変わってました。
$ brew reinstall --cask docker-toolbox
```

参考:https://qiita.com/Ryosuke-Hujisawa/items/67f9dff2fadd729165dc

- virtualboxが自分のパソコンに入っていようが、いまいが最新でなければインストールして最新にする。結構大事見たい。　インストールしなおせば勝手に上書きされて最新になるみたい。
ダウンロードはこちら→ https://www.virtualbox.org/wiki/Downloads


## いよいよ

インストールしたDockerのアイコンクリックで問題なさそうです。
~~- アプリケーションに**Docker Quickstart Terminal**いるはずなのでクリックして起動。すぐなければDocerフォルダとかの中みるとあるかと思う。でここからは打つコマンド入れながら書きます。と思っていましたが入れる環境で異なるみたいです。アプリケーション内に以下のアイコンがあればクリックしてください。そうするとスタートできます。~~

~~<img width="200" alt="スクリーンショット 2019-01-28 9.56.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/9d419a65-3741-6d33-b0ed-83830ea379c9.png">~~


```
$ docker-machine ls
```
でdocker-machine入っているのないかな？ってみる。defaultってやつ入ってないかなって
入ってなかったら以下のコマンド打って、Dockerを操るdefaultマシーンを入れる

```
$ docker-machine create --driver virtualbox default
```
※このコマンドでVirtualBox仮想マシンを作成・起動してる。結構時間かかる。通信具合でも異なるかもですが、2時間ぐらいかかりました。この時にvirtualboxのGUIを開いていればインストールと同時にdefaultのものが以下画像のようにぴょこんっと出てきます。
<img width="207" alt="スクリーンショット 2019-01-28 10.03.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/b8e9240a-710b-c4d1-ad65-01d07fc6b62f.png">



ちなみに次起動する時は`$ docker-machine start default`
より、
**virtualboxのGUIから起動する方が確かそうです。。**きっと使うものによって変わるかもしれません。

<img width="411" alt="スクリーンショット 2019-01-12 16.32.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/5c0b971b-2993-0e0f-516c-a2ada554b2c1.png">
そのあとに上記のアプリケーションに**Docker Quickstart Terminal起動した方が確かそう…(アプリケーションのDockerの中に入っている、以下のもの)
<img width="191" alt="スクリーンショット 2019-01-17 1.55.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/fe7a3829-82c1-23a5-f81e-a85bae39d597.png">



次に以下のコマンド打って環境変数のセットを行う

```
$ docker-machine env default
```
それだけではダメで以下のコマンドで環境変数マシンにセットする。今後行わないようにする設定もできるみたいですが、今はシンプルに覚えたいのでそういうのは書きません。

```
$ eval "$(docker-machine env default)"
```

これである程度できたのでDockerhubのリポジトリからimage取得コンテナ実行まで行う以下のコマンドうつ。

```
$ docker run hello-world
```
　説明:run=コンテナ作成実行 hello-world=Dockerhubにあるimage
本当はタグの指定するのもありだけど指定しなければ最新の持ってくるらしいのでお試しないらないかと…

ちなみに出力は以下のようなものがでればOKです。

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
```



## 一段階終わってとりあえず休憩

```
$ docker run docker/whalesay cowsay boo
```
※booのところ色々変えれば色々くじらさんがつぶやいてくれる。

```
$ docker run sachikokame/docker-whale
```
※勝手に色々喋るくじらさん

```
$ docker run -d -p 8000:80 nginx
```
※nginxのイメージをポート8000で自分のローカルのwebブラウザで見れるようにする。
webブラウザに上にwelcom nginxってでる。`$ http://<自分のipアドレス>:8000/`
ちなみに自分のipアドレスは`$ docker-machine ip default `で確認できる。ちなみにポートが4000なら`$ http://<自分のipアドレス>:4000/`みたいな感じで。

## 自分でイメージを作成してDockerhubにあげて、あげたものをインストールして実行まで
※Dockerhubのアカウントない場合作らないとこれはできません。
こちらで登録を→ https://cloud.docker.com/
※全てをかくと読むのがいやになるので流れを書きます。詳しくは以下のurlに乗ってます
(簡単な方)
http://docs.docker.jp/docker-for-mac/step_four.html
と
(難しい方)
http://docs.docker.jp/get-started/part2.html

- ディレクトリ作成

```
$ mkdir mydockerbuild
```
- ディレクトリ移動
 
```
$ cd mydockerbuild
```
- 大事なDockerfileをつくる

```
$ touch Dockerfile
```

- 使いたいファイルもあれば作る

```
$ touch 作りたいファイル
```

- 開いて必要事項の記述、Dockerfile、使いたいファイルなど。ファイルは記入終わったらcommand+Sで保存することを忘れない

```
$ open -e Dockerfile
```

- イメージを作成、イメージの名はfriendlyhello。別になんでもいいとは思います。このイメージ名はどうせあとで変更するので。最後の.も忘れないように

```
$ docker build -t friendlyhello .
```

- 作成したイメージがあるかの確認一覧にfriendlyhelloが入ればイメージの作成無事にできてる。

```
$ docker images
```


### 先に行く前にDockerhubでのリポジトリを作らないと。送る先がなければ送れない。
https://hub.docker.com/
に行き、以下の感じでリポジトリの作成を

<img width="1276" alt="スクリーンショット 2018-05-27 4.03.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/395d2802-df34-f9aa-f624-19369d6111f4.png">
<img width="1277" alt="スクリーンショット 2018-05-27 4.19.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/5f3ff709-7ebd-ad1b-aa52-c7b70550f1bf.png">


- Dockerhubにイメージを送るためタグ付けとイメージ名の変更をする。
※最後のlatestはタグ名。無難に。

```
docker tag <名前を変更したいイメージ名> <自分のDockerhubのユーザ名>/<作成したリポジトリ名>:latest

```
又は

```
docker tag <名前を変更したいイメージのid> <自分のDockerhubのユーザ名>/<作成したリポジトリ名>:latest

```
どっちでも行けそう？

- dockerhubにログインする

```
$ docker login -p=<Dockerhubのパスワード> -u=<Dockerhubのユーザー名>
```
※Login Succeededって最後に出ればログインできたということ。

- 作ったリポジトリにイメージを上げる、最後のlatestのタグは違うものにした場合変更してください。

```
$ docker push <自分のDockerhubのユーザ名>/<作成したリポジトリ名>:latest
```

- pushが無事にできたら今あるものをイメージid指定で削除する。削除しないと持ってこれないから。

```
$ docker rmi -f <Dockerイメージid>
```

- 自分が作成したイメージの取得、コンテナ作成、実行。作ったものによってまちまち

```
$ docker run <自分のDockerhubのユーザ名>/<作成したリポジトリ名>
とか
$ docker run -p 4000:80 <自分のDockerhubのユーザ名>/<作成したリポジトリ名>:latest
とか
```
# こんなエラーが出たら1
<エラー内容>

```
docker: Error response from daemon: driver failed programming external connectivity on endpoint hungry_swartz ………: Bind for 0.0.0.0:8000 failed: port is already allocated.
```

解決策
以下のコマンドで動いているの表示して

```
$ docker ps
```

動いている　IDを指定して終了させる

```
$ docker kill a1ssdsf612b20f //こんな感じ
```

消したの確認できたら再度試したいコマンドを実行させる。

# こんなエラーが出たら2
<エラー内容>

```
Couldn't connect to Docker daemon. You might need to start Docker for Mac.
```

マシンを動かせばいいので

```
$ docker-machine start default
```
あらかじめ作っておいたマシーンの再スタート今回のマシーン名はdefault

```
$ docker-machine env default

$ eval "$(docker-machine env default)"
```
次に環境変数のセット

# こんなエラーが出たら3
<エラー内容>

```
ERROR: for nginx  Cannot start service nginx: b'driver failed programming external connectivity on endpoint nginx (893cfd4931f8f898adb32abb2a9a94ad50c951e4fa7f869605d86f1182802f3a): Bind for 0.0.0.0:80 failed: port is already allocated'
```
他のでこのポート使っているようなので

```
$ docker ps
```
のコマンド打って起動中のものを確認おそらく PORTS のところで0.0.0.0:80なのあるからその子を消すためにそのコンテナID今回<6cf85db82a03>指定して終了させる

```
$ docker stop 6cf85db82a03
```


# 最後にパッとみたいコマンド集(例)
```
$ docker-machine ls ドッカーマシン一覧の確認

$ docker-machine stop default デフォルトのドッカーマシンのストップ

$ docker-machine start default デフォルトのドッカーマシンのスタート

$ docker images　自分のDockerマシーンで作成しているイメージ一覧みたい時に

$ docker rmi -f <削除したいイメージid> イメージの削除(削除しないと同じものdockerhubからインストールできないとか)

$ docker rmi $(docker images) イメージ全削除

$ docker run -p 4000:80 friendlyhello　をポート4000でfriendlyhelloのイメージをフォアで実行

$ docker run -d -p 4000:80 friendlyhelloをポート4000でfriendlyhelloのイメージをバックで実行

$ docker stop <終わらせたいコンテナid> 指定したコンテナを終了させる。

$ docker kill <終了したいコンテナid> 終了したいコンテナを終了させる

$ docker rm <削除したいコンテナid>

$ docker rm $(docker ps -a -q) 全ての終了しているコンテナの削除$(docker ps -a -q)はコンテナのid達の集約

$ docker ps 実行中コンテナのみ表示

$ docker ps -a 全てのコンテナの表示

$ docker container ls　作成したDockerコンテナの一覧みたい時に

$ docker-machine ip default ipアドレスの確認defaultは現在使ってるマシーン名

$ docker logs acf008c9058b acf008c9058bにはコンテナのIDを入れる

$ docker inspect web webはイメージ名 ボリュームがホスト上で使っている場所を探す

$ docker image prune 不要な宙ぶらりんイメージの削除
https://docs.docker.jp/config/pruning.html#prune

```

# Dockerfileメモ

- 行うこと→変数に値入れて、ログ出しているだけの例

```
ENV HOGE hoge

RUN ["bin/bash", "-c", "echo $HOGE"]
```

```
RUN /bin/bash -c "HOGE=hoge; echo $HOGE"
```

```
ENV HOGE="hoge"

RUN echo $HOGE
```

- 行いそうなミス

```
('ls') #「Shift」＋「7」
```
ではなく

```
(`ls`) #「Shift」＋「Option」＋「_」
```









コマンドの詳しい説明→ 
[全て]
http://docs.docker.jp/engine/reference/commandline/index.html
[run]
http://docs.docker.jp/engine/reference/commandline/run.html
[build]
http://docs.docker.jp/engine/reference/commandline/build.html

そのほか
https://docs.docker.com/engine/reference/builder/#usage

# ある日
以下のエラーが出ました。
```
Error checking TLS connection: ssh command error:
command : ip addr show
err     : exit status 255
output  : 
```

```
$ docker-machine rm default
$ docker-machine create --driver virtualbox default

$ docker-machine env default
$ eval "$(docker-machine env default)"

ymlある箇所で
$ docker-compose up --build -d
```

そんな時はマシーンごと作り直さないといけないようでした、、
https://github.com/docker-archive/toolbox/issues/317#issuecomment-160478347

# 最後に
今後は自在にDockerfileを書きたい、自在にバーチャル世界を作りたい( ･ὢ･ )
よろしくお願いします。:hatched_chick:


sachikoのmemo
docker exec -it [Dockerコンテナid] bash
mysql -u root -p　mysqlログイン
hostname -i 
docker-compose up
docker-compose up --build
docker-compose up --build -d コンテナの中に入りたい時に使う。
docker exec -i -t コンテナ名 bash　コンテナの中に入る