Docker imageを作りたい！

Dockerについて

初心者のメモ

環境

Ubuntu 18.05.04 LTS

# Dockefileからimegeを作る

DockerFileを作成してそこからDockerimageを作成する。

#### ①作業ディレクトリ作成

```docker:Docker
$mkdir Docker
```

『Docker』ディレクトリを作成する。
　基本的にどこでも問題ないが管理しやすくする目的で`/home/`直下にディレクトリを作成
　ターミナルからだと`mkdir Docker`で作成される

#### ②ファイル作成
　作成したディレクトリに移動して『Dockerfile』を作成する。
　この際は、ターミナルを立ち上げで該当ディレクトリに移動して行う。
　`cd Docker`→`touch Dockerfile`で作成する。


![Screenshot from 2021-11-03 08-24-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/cc953996-4321-9dd2-2d32-31e9e2bae683.png)



#### ③ファイルに色々と書き込む
　`nano Dockerfile`で開いたファイルに色々と書き込む。(私はnano信者です。)

```docker:Dockerfile
FROM nvcr.io/nvidia/tensorflow:20.12-tf1-py3

RUN apt-get update
RUN pip install --upgrade pip
RUN pip install keras==2.2.4
RUN pip install opencv-python
RUN pip install opencv-contrib-python
RUN apt-get install -y libgl1-mesa-dev
```

上記についてはレイヤー数を節約する書き方はしていません。
まずはDockerfileからimageを作る事を優先したのとわかりやすくする為です。

この辺りは詳しい記事がそこらじゅうにあるのでそちらを参考にしてください。

![Screenshot from 2021-11-03 08-25-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/975c68d0-f2e3-0ff5-f0b2-4d29faca1c6d.png)


#### ④imageを作成する。
　ここから本番

```docker:Docker
$docker build <directory>
$docker build -t <name> <directory> ← 基本こっち
```

　`sudo docker build -t file .`

　これでimageが作成されます。

![Screenshot from 2021-11-03 09-07-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/14dc7fb5-ea39-c79c-7abc-b7db0d5c5129.png)

↓ build完了後

![Screenshot from 2021-11-03 09-08-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/8f5c7d0c-dd59-2fd0-cae9-3644ddf487c0.png)



　`docker build .`でもimageは作成されるが
　タグがない`【none】`と表示されます。(ダングリングイメージと言うらしい)

　使いにくいしpush出来ないので`docker rmi <Image ID>`で削除する。

#imageをリポジトリに上げる
　作ったイメージをリポジトリに上げる(pushする)

#### ①Docker Hubにログインする

```docker:docker
$docker login
Username:
Password:
```
DockerHubにログインする。

ちなみに`docker logout`でサインアウト出来る。

#### ②作成したimageファイルを別名義にする。

```docker:docker
$docker tag <source> <target>
```

`<source>`:buildした際に設定したimageの名前
`<target>`:リポジトリ名

こうする事でImageIDは同じだがimage名が変更した物が新たに作成される。

`target`については個人アカウントで登録したDockerの`ユーザー名/リポジトリ名`で設定するのが一般的？
観た資料でそう言ってたので…

![Screenshot from 2021-11-04 15-16-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/4b0daf62-33c1-cbab-c8b9-82741cbbe2f7.png)


#### ③リポジトリにpushする。

```docker:docker
$docker push <images>
```
これでDockerfileから作成したimageがリポジトリに上がる。

ログインしていないとpush成功しないので忘れずに。

![Screenshot from 2021-11-03 13-33-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/2d134f55-ca04-c976-f357-159a41a43056.png)

成功するとTAGの所にlatestって表示されます。

# コンテナからimageを作る
開いたコンテナにpipとかでモジュールをインストールするが抜けると毎回同じ事の繰り返し
面倒なのでコンテナからimageを作る

#### ①止まっているコンテナを動かす。
`docker ps -a`でコンテナ一覧を表示すると大抵STATUSが`Exited`と停止しているので一旦動かす

```docker:docker
$docker restart <container>
```
この操作を行う事でSTATUSが`Exited` → `Up`になり、コンテナが起動状態になります。

```docker:docker
$docker exec <container> <command>
```
上記コマンドでコンテナ内に再度進入出来ます。

![Screenshot from 2021-11-04 15-52-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/5c55dfbb-9fa9-46dc-a2a6-0ce4b3da6bc4.png)


#### ②imageを作る

```docker:docker
$docker commit <container> <new image>
```
`container`:新イメージの元となるコンテナ
`new image`:新イメージの名前

これを行う事で新しいimageが完成します。

![Screenshot from 2021-11-04 15-59-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/1b70beca-050f-78ab-22d4-dc7aca314fab.png)

後は前述ど同様にリポジトリにpushすればOKかと思います。

# まとめ
Dockerfileはもう少しきちんとかける様になりたい。