Docker環境セットアップとよく使うコマンド#初心者向け

# はじめに
Dockerってほんとに便利ですよねぇ。
以下では、Dockerのインストール方法とよく使うコマンドを書いていきます。

# Dockerとは
- アプリケーションとその依存関係を”コンテナ”と呼ばれる包装にパッケージ化できるプラットフォーム
- HyperVisorによるゲストOS仮想化と比べると、軽量でリソース効率的と言われている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/5dc540ec-760a-1dc2-321a-1519f57159ef.png)

以下のようなコンテナのイメージのバージョンのことをTagという。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/78ac5861-7d61-5746-632d-09448ecb9db8.png)
「nginx:1.14-perl」のようにTagを指定する。

### DockerFile

DockerFileに、取り込むimageのTagや起動後にインストールしたいパッケージ、実行したいコマンドを記載することができる。

```Dockerfile:Apache Server
FROM ubuntu:18.04
RUN apt-get -y update && apt-get install -y apache2
CMD ["apachectl","-D","FOREGROUND"]
```
FROM：元にするイメージを指定
RUN：Buildするときに実行したいコマンドを書く（インストールコマンドなど）
CMD：コンテナ実行時に実行したいコマンドを書く

**CMDの例**
- shell形式
CMD service mysqld start
- exec形式
CMD ["apachectl","-D","FOREGROUND"]

参考

https://zenn.dev/hisamitsu/articles/8388214d4ab0f3

### データ管理
コンテナは停止後にデータが消えてしまう。ホストOS上の特定のディレクトリをvolumeとしてmountするなどの方法がある。
### ネットワーク管理
コンテナ同士でデータをやり取りする方法がいくつかある。
詳しくは以下の記事を参照（私の記事です）。


# Dockerのインストール（Ubuntu 18.04）

```
sudo apt-get remove docker docker-engine
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install -y docker-ce
sudo docker -v
```

出力例

```
Docker version 24.0.5, build ced0996
```

# よく使うコマンド

### ローカルのイメージの確認
```
docker images
```
### イメージの実行
```
docker run hello-world
docker run docker/whalesay cowsay hello world
```
ローカルにイメージがなければDocker Hubから取得して実行します。
上記のようにTagを指定しない場合、latestのタグが付いているイメージが実行されます。

### コンテナを対話的なモードで起動し、ターミナルに接続する
```
docker run -it —rm -p 10081:80 ubuntu:18.04 
```
ホストの10081ポートをコンテナの80ポートにフォワーディングするという設定になっています。
サーバとして動くようなコンテナでは、この「-d」を指定しないと、コンテナが終了するまでプロンプトに戻ってこなくなってしまうので、これは指定必須です。
—rmを指定すると、実行後に自動的にコンテナを削除します。
—nameを指定すると、その名前でそのコンテナに対して操作ができるので、コンテナIDをコピペしなくて済みます。

参考

https://codezine.jp/article/detail/12831

### Docker Hubからdockerユーザのwhalesayというイメージをダウンロード
```
docker pull docker/whalesay 
```
### Dockerfileからdocker-whaleイメージを作成する
```
docker build -t docker-whale .
```
### ローカルイメージの詳細確認
```
docker inspect docker-whale
```
### ローカルイメージの構築履歴表示
```
docker history docker-whale
```
### ローカルイメージのタグ付け
```
docker tag イメージID ユーザ名/docker-whale:latest
```
### Docker Hubへのログイン
```
docker login
```
### タグ付けしたイメージのpush
```
docker push ユーザ名/docker-whale
```
### ローカルイメージの削除
```
docker rmi –f docker-whale
```
### 起動中のコンテナ一覧を表示する
```
docker ps
```
### 停止中のものも含めて全てのコンテナ一覧を表示する
```
docker ps -a
```
### 停止中のものも含めて全てのコンテナ一覧を表示する（コンテナIDのみを表示）
```
docker ps -aq
```
### 全てのコンテナを削除
```
docker rm $(docker ps -aq)
```
### 該当のIDのコンテナを起動/停止/再起動する
```
docker start/stop/restart [コンテナID]
```
### 起動状態のコンテナにログイン
```
docker attach [コンテナID]
```
なお、tomcatコンテナなど、本来バックグラウンドで実行されることを前提としているコンテナにはattachではコンソールに入ることができません。よって、以下のような手順を踏みます。
```
docker run -d -name tomcat -p 8080:8080 tomcat:tag
docker exec -it tomcat bash
```
### コンテナからイメージを作成する
```
docker commit [コンテナID] ubuntu_img(イメージ名)
```
### コンテナの/app/data.txtをホストの/home/userにコピーする
```
docker cp [コンテナIDかコンテナ名]:/app/data.txt /home/user
```


参考：
https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

https://knowledge.sakura.ad.jp/13265/

https://qiita.com/nuco_fn/items/22cf85a2646d96361d0b#dockerfileのベストプラクティス

https://qiita.com/hihihiroro/items/6dda871dc2566801a6da