docker desktop付属のチュートリアル＋α


<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->

<!-- code_chunk_output -->

- [docker desktop付属のチュートリアル＋α](#docker-desktop付属のチュートリアルα)
    - [特徴](#特徴)
    - [使用までの流れ](#使用までの流れ)
    - [First, clone a repository](#first-clone-a-repository)
    - [Now, build the image](#now-build-the-image)
    - [Run your first container](#run-your-first-container)
    - [Now save and share your image](#now-save-and-share-your-image)

<!-- /code_chunk_output -->

## docker desktop付属のチュートリアル＋α

※ この記事は「プログラマのためのdockerの教科書　第２版」からの引用が多く、自分のメモのために作成した記事です。

dockerのコマンドプロンプトではなぜかコピーができなかったので以下画像で対応。

#### 特徴
*  複数のコンテナを組み合わせて1つのアプリケーションを構成するマイクロサービス型のアプリケーションと親和性が高い

#### 使用までの流れ
* Dockerfileからイメージを取得または自分でイメージを作成
* コンテナのひな型であるイメージをもとにコンテナを稼働させる
* dockerのイメージさえあれば同じ環境で開発ができるので、オンプレミス環境→クラウドや、クラウド⇔クラウドといったことも容易にできる。


#### First, clone a repository
The Getting Started project is a simple GitHub repository which contains everything you need to build an image and run it as a container.

Clone the repository by running Git in a container.

```
docker run --name repo alpine/git clone https://github.com/docker/getting-started.git
```

alpine/gitという名前のイメージがダウンロードされている。

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/6e67bece-a3f0-a3bd-c0f4-2ca3e2811a26.png)
-->

* dockerイメージとは、アプリケーションの実行に必要なプログラム・ライブラリ・ミドルウェア・OS・ネットワークの設定などを一つにまとめたファイルで、コンテナのひな型であり、その実態はアプリケーションの実行に必要なファイル群が格納されたディレクトリ。

#### Now, build the image
A Docker image is a private file system just for your container. It provides all the files and code your container needs.

dockerfileをビルドしてdockerfileに定義した構成のdockerイメージを作成している

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/f6addb25-c078-78f6-3db9-4868c679f759.png)
-->
↑文法的に一番後ろには.が必要だったっぽい。

↓正常にビルドされた例

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/73102932-f918-1d0d-d3ba-f1a624296702.png)
-->


-t, --tag=""
書式 'name:tag' により名前および任意のタグを指定します


やっていることを理解してみる。

* dockerでビルドすると、ビルドを実行したディレクトリは以下のすべてのファイルがdockerデーモンに転送される。美都度を実行するディレクトリには十分注意する必要がある。
* .dockerigonreでは、ビルドでdockerデーモンに転送したくないファイルを指定する。



load build definition
requirements.txtをコピー
多分見つからなかったので、pip install

繰り返しになるが、dockerfileに記述されたコードを順に実行しているだけ。多分。


#### Run your first container
Start a container based on the image you built in the previous step. Running a container launches your application with private resources, securely isolated from the rest of your machine.

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/b6f61183-deb6-5ec1-fd7a-fdf4d832d219.png)
-->


実行後の文字はコンテナID。多分ハッシュ値で一意なコンテナを見つけるため

docker101tutorialというイメージから
docker-tutorialというコンテナを起動

-d バックグランドで実行するオプション
-p ブラウザからhttp(80番ポート)でのアクセスを許可するために、コンテナからの転送を許可している

* dockerは一つのLinuxカーネルを複数のコンテナで共有している。コンテナ内で動作するプロセスを一つのグループとして管理し、グループごとにそれぞれファイルシステムやホスト名・ネットワーク名を割り当て、グループが異なればプロセスやファイルへのアクセスができない。この仕組みでコンテナを独立した空間として管理する。これを実現するのがLinuxカーネル技術(namespace,cgoups,etc...)


#### Now save and share your image
You must be signed in to Docker Hub to share your image.

Sign in here.
Save and share your image on Docker Hub to enable other users to easily download and run the image on any destination machine.


<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/9a6d46ff-d863-5577-27e9-2f0e9fdffcf6.png)
-->


* docker tag
docker101tutorialにユーザ名/docker101tutorialというタグを設定している。
- google container registryにアップロードするときにはタグを設定しなければならないが、docker hubにイメージをアップロードするときも多分同様だからタグをつけている。
実際にdocker image lsするとユーザ名/docker101tutorialというタグが付いたイメージが作成されている。しかし、docker101tutorialというイメージと、イメージIDが全く一緒であるので、実態としては同じイメージである。リネームしたり、コピーしたりしたわけではない。
- プロジェクトIDがmeri100htであるので、meri100htとしている。実際にdocker hubの自分のページを見に行くと、githubみたいにリポジトリ名をブラウザ上で決めていないのに、meri100htから始まるリポジトリ名となっている。