Dockerの基本について

使用環境
Docker: version 20.10.5

業務でDockerを使う機会があったので、備忘録として。
まだ初学者なので、訂正あればご指摘いただけると幸いです。

##Dockerイメージからコンテナを作成する
dockerを使用する上で、一番基本的な流れは
①dockerhubからimageをpull
②①でpullしたイメージからコンテナを作成、実行

順を追って説明する。

①dockerhubからimageをpull
これはdockerhubにあげられているimageを以下のコマンドでダウンロードする。
以下では「gihyodocker/echo:latest」をダウンロードしている。

```
$ docker image pull gihyodocker/echo:latest
```

ダウンロードが完了しているかは、以下のコマンドを実行すれば確認できる。

```
$ docker images
```

これで自分がダウンロードしているimageを確認できる。

②①でpullしたイメージからコンテナを作成、実行
ダウンロードしたimageは以下のコマンドでコンテナとして作成、実行できる。

```
$ docker container run -t -p 3000:3000 gihyodocker/echo:latest
```

このコマンドによって
「http://localhost:3000」
にアクセスすることで、正常に動作していることが確認できるはずだ。

##Dockerイメージの作り方
私の場合はReactアプリの作成の際にdockerを使用したため、今回は一例としてreact環境で話を進める。
以下は私が実際に作成したアプリのディレクトリ構造である。

myapp/
　┣public/
　┣src/
　┣package.json
　・
　・
　・
　┗Dockerfile

```
$ ・・/myapp> npm start
```
このアプリは上のコマンドで起動するようになっている。

このアプリのDockerイメージを作成するために、myapp直下に「Dockerfile」を設置した。

Dockerfileとは・・・イメージを作成する際に実行するコマンドを記述したもの。

```:Dockerfile
FROM node:latest

RUN mkdir /react_test/

ADD public /react_test/public/
ADD src /react_test/src/
ADD .gitignore /react_test/
ADD package.json /react_test/
ADD package-lock.json /react_test/
ADD README.md /react_test/
ADD yarn.lock /react_test/

WORKDIR /react_test

RUN npm install -g create-react-app
RUN npm install --save react react-dom react-scripts
CMD ["npm","start"]

```

以下に基本的なコマンドを記述する。

####FROM
作成するDockerイメージのベースとなるイメージを作成する。今回の例ではnodeが必要ちなるため「node:latest」をダウンロードした。ここでの「:latest」とは、最新verでダウンロードして、とお願いしているわけです。「node:16.3」だの、versionを指定してあげれば自分の環境と同じものをダウンロードすることができる。
####RUN
Dockerイメージビルド時に、Dockerコンテナ内で実行するコマンドの定義。上の例ではmkdirでファイルを配置するためのディレクトリを作成したり、npmのインストールを行っている。
####ADD
Dockerを動作させているホストマシン上のファイルやディレクトリをDockerコンテナ内に加える。今回はアプリを起動するのに必要なファイル、フォルダを加えた。
記述方法としては「ADD　加えたいファイル/フォルダ　加えるディレクトリ」
####CMD
最後にコンテナ内で実行するプロセスの指定。注意点として、Dockerfile内に1つしか持てない。今回はアプリの起動コマンドである「npm start」を書いている。
記述方法は空白毎に配列で区切って書く必要がある。
　　　
　　
これでDOckerイメージを作成する準備は整った。
あとはコマンドを入力していくだけである。

```
$ docker image build -t example:latest .
```
これで「example」という名前のイメージが作成された。
ちゃんと作成されているかは上で記述したように

```
$ docker images
```
で確認できる。

このイメージからコンテナを作成、アプリが起動するか確かめてみよう。
先ほど同様

```
$ docker container run -t -p 9000:8000 example:latest
```
これでlocalhost:90000で起動するはずである。

　　
ここでアプリの起動が確認できたら、いよいよdockerhubに自分のイメージをアップしよう。

##Dockerhubにイメージをアップする
作業手順としては
①dockerhubのアカウント作成
②dockerhubでリポジトリの作成
③dockerhubにイメージをアップ
の3つである。
これも順を追って説明する。

　　
①dockerhubのアカウント作成
特に説明はいらないと思います。以下のリンクでアカウントを作成してください。
https://hub.docker.com/
  
②dockerhubでリポジトリの作成
ヘッダーにある「Repositories」→「Create Repository」でリポジトリ作成画面に移行する。
そこでリポジトリの名前を付けて「Create」をクリックすれば作成完了。リポジトリの名前は「自分のアカウント名/今つけた名前」となっているはずである。
######ここでは例として「atsu123456789/dockerhub」というリポジトリを作ったとする。
　　
③dockerhubにイメージをアップ
先ほど作成した「example」をアップする手順を記述する。
まず、「example」のイメージ名を②で作ったリポジトリ名と同じにする必要がある。
なのでまず「example」の「IMAGE ID」を取得する必要がある。
これは

```
$ docker images
```
から取得できる。
　　
ここで取得したIMAGE IDを用いて

```
$ docker tag IMAGE_ID USER_NAME/IMAGE_NAME:TAG
```
というコマンドを実行しよう。ここで「IMAGE_ID」には先ほど取得したIMAGE IDを、「USER_NAME」、「IMAGE_NAME」には任意を値を入力する。「:TAG」は入力しなくてもよい。入力しなかったら勝手に「latest」となってくれる。
これで、先ほど作った「example」は「USER_NAME/IMAGE_NAME」という名前のイメージになる。
今回の例では「:TAG」は入力せず、「atsu123456789/dockerhub」としよう。

　　
これで準備は整った。あとはpushするだけである。
以下のコマンドでdockerhubにpushしてあげよう

```
$ docker push atsu123456789/dockerhub:latest
```
これでdockerhubにイメージがアップされた。

　　
あとは一番最初に記述したpullコマンドを使うなりして、他人と開発環境の共有などが容易にできる！すごいぞDocker！！！