Docker備忘録

dockerの勉強のための備忘録
dockerのイメージ作成からbuidあたりまで
勉強の進捗に従って更新予定


# Dockerイメージの作成
##　docker run コマンドでイメージをHubからダウンロードする
```shell
docker run docker/whalesay cowsay Hello!!
```
ローカルにダウンロードされていない場合は、イメージのpull結果が表示される
```shell
docker run docker/whalesay cowsay Hellodocker run hello-world:latest
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
00bf65475aba: Pull complete 
c57b6bcc83e3: Pull complete 
8978f6879e2f: Pull complete 
8eed3712d2cf: Pull complete 
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
 ____________________________________ 
< Hellodocker run hello-world:latest >
 ------------------------------------ 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   

```

## ローカル上にダウンロード済みのイメージ一覧を表示する

```
docker images
```

```

~/docker 14s
❯ docker images
REPOSITORY        TAG       IMAGE ID       CREATED        SIZE
hello-world       latest    feb5d9fea6a5   7 months ago   13.3kB
docker/whalesay   latest    6b362a9f73eb   6 years ago    247MB
```

`tag`コマンドでイメージにタグ付けすることができる
`/`で区切って任意の名前をつける
```
docker tag docker/whalesay my_whalesay
```

## dockerイメージの削除
コンテナを削除してからイメージを削除or -fコマンド

```
docker rmi docker/whalesay
```

## イメージをPULLする
```
docker pull docker/whalesay(PULLしたいイメージ名)
```
既にイメージがある場合は`Already exists`となる
```
❯ docker pull docker/whalesay
Using default tag: latest
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Already exists
909cd34c6fd7: Already exists
0b9bfabab7c1: Already exists
a3ed95caeb02: Already exists
00bf65475aba: Already exists
c57b6bcc83e3: Already exists
8978f6879e2f: Already exists
8eed3712d2cf: Already exists
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay:latest
```

## Dockerfileについて
Dockerイメージ作成のための指示書
`Dockerfile`を作成する
```
touch Dockerdile
```
ファイルを開いて指示コマンドを記述する
```
FROM docker/whalesay:latest // どのイメージを使うか
RUN apt-get -y update && apt-get install -y fortunes // -yは処理が止まらないようにする
CMD /usr/games/fortune | cowsay // run時に実行されるコマンド
```

### dockerfileからイメージをビルドする
-t : タグ名の指定
```
docker build -t docker-whale(タグ名)
```
実行結果
```
❯ docker build -t docker/whalesay .
[+] Building 25.0s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 158B                                       0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/docker/whalesay:latest          0.0s
 => [1/2] FROM docker.io/docker/whalesay:latest                            0.2s
 => [2/2] RUN apt-get -y update && apt-get install -y fortunes            24.5s
 => exporting to image                                                     0.2s
 => => exporting layers                                                    0.2s
 => => writing image sha256:56e423c8ab3edc2903d97e04f6215b9eb43e54fdd8822  0.0s
 => => naming to docker.io/docker/whalesay                                 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
```
ビルドしたイメージを実行する
```
docker run docker/whalesay
```
## nginxイメージをpull
```
docker pull nginx
```
pullしたイメージを起動する
```
docker run --name test-nginx(tag名) -d -p 8080:80 nginx(コンテナ名)
```
ローカルホスト8080番にアクセスすると、nginxのwelcome画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284176/b5910cf1-dfd8-fedf-ba09-9f5c3d0fd990.png)

`docker ps`コマンドで、現在稼働中のコンテナを確認できる
```
❯ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                   NAMES
e955fcb1d476   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp, :::8080->80/tcp   test-nginx
```
### run中のコンテナは削除できない
実行中のコンテナは削除できないので、一旦stopさせる
```
docker stop test-nginx
```

```
❯ docker stop test-nginx
test-nginx
```
次にコンテナを削除する

```
docker rm test-nginx
```
特に表示されないが、`docker ps`すると先ほどのコンテナが削除されていることを確認できる
```
❯ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
(ここに何も表示されていなければok)
```

## nginxの設定
ホストマシン上のディレクトリをマウントする
ホストマシン(自分のpc上のディレクトリ)にあるファイルをdockerコンテナで立てたnginxに公開する

任意のディレクトリを作成し、その中にhtmlを記述する
```
❯ ls
Dockerfile html

❯ cat ./html/index.html
<!DOCTYPE html>
<html>
<body>

<h1>My Test Head</h1>
<p>My Test documentations</p>

</body>
</html>
```
今回は上記ファイルをnginxを使ってブラウザで確認する
`-v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション>`
`-p <ホスト側のポート番号>:<コンテナ側のポート番号>\`
`<イメージ名>`
```
❯ docker run --name first-nginx -v /Users/docker/html:/usr/share/nginx/html:ro -d -p 8080:80 nginx
```
実行結果としてコンテナのIDが表示される
```
5525a00da1eaa67b563fe981d91e80a257a12b39d02866d65e8c715b44f998d2
```

ブラウザで`htp://localhost:8080`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284176/e6da0271-b97f-76f5-2b6f-527b85b71ead.png)

### dockerコンテナが停止した際にコンテナを削除する
オプション`--rm`をつける
```
docker run --name tmp-nginx --rm -d nginx
```

### dockerコンテナ内とファイルをやりとりする
`docker cp <ローカルのパス>:<tmp-nginx:(パス)>`：ローカルからコンテナへファイルやディレクトリをコピー
`docker cp <tmp-nginx:(パス)>　<ローカルのパス>`：コンテナからローカルへファイルやディレクトリをコピー

ローカルで現在のディレクトリ(./)にコンテナ内のconfigファイルを転送する
```
docker cp tmp-nginx:etc/nginx/conf.d/default.conf ./
```

ローカルにファイルが転送されていることを確認
```
❯ ls
Dockerfile   default.conf
```

###ローカル上でファイルを書き換え、それをbuild時にコンテナ内に転送する
```
server {
    listen       80 -> 8080に変更;
    listen  [::]:80;
    server_name  localhost;
(以下、略)
```
コンテナ側のポート番号を変更してみる
Dockerfileを作成し、ファイル転送の記述を追加する
```
FROM nginx:latest
COPY default.conf　/etc/nginx/conf.d/default.conf
(Dockerfileと同じ階層にいるdefault.confをコンテナ内にコピー) 
```
コンテナを立ち上げる
今回はコンテナ側のポート番号も8080にする(80番だとアクセスできない)
```
docker run --name web -p 8080:8080 --rm nginx:ver1
```

ブラウザ上で表示されればok
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284176/451e43dc-751c-8572-2cf9-0a91b71cb458.png)

# コンテナのライフサイクルについて
#### `CREATED`：　コンテナが立ち上がっているがRunnnungしていない状態
```
docker create --name status-test -it alpine /bin/bash
```
`-i` シェルを展開し双方向に接続できる
`-t`コンテナ内にTTYを割り当てる

状態を確認してみる
```
❯ docker inspect status-test
[
    {
        "Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
        "Created": "2022-04-24T04:35:05.8179181Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "created",  // コンテナが作成されている
            "Running": false,     // 実行状態ではない

```

この状態だと`docke ps`をしても何も表示されない
```
❯ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

#### `Running`：　コンテナが起動している状態

では次にコンテナを起動する
```
❯ docker start status-test
status-test

❯ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
1f1e7bd14ed3   alpine    "/bin/sh"   3 minutes ago   Up 3 seconds             status-test

```
今度はコンテナの情報が表示された
詳細な状態も確認してみる
```
❯ docker inspect status-test
[
    {
        "Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
        "Created": "2022-04-24T04:35:05.8179181Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "running",  //createdからrunningに変わっている
            "Running": true,      // falseからtrueに変わっている

```

#### `Paused`：　コンテナは起動しているが、一時的に応答拒否状態

```
❯ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS                  PORTS     NAMES
1f1e7bd14ed3   alpine    "/bin/sh"   6 minutes ago   Up 2 minutes (Paused)             status-test
(起動中なので表示される)

❯ docker inspect status-test
[
    {
        "Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
        "Created": "2022-04-24T04:35:05.8179181Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "paused", // pausedに変わっている
            "Running": true,    // Runnningのまま
            "Paused": true,     // Paused: trueに変わっている

```

pause状態は`unpause`コマンドで`runnning`状態に戻すことができる
```
❯ docker unpause status-test
status-test

❯ docker inspect status-test
[
    {
        "Id": "1f1e7bd14ed3a6404672309cc69113d84ed5e5c342f7c7c6b510f5eda3e78fa0",
        "Created": "2022-04-24T04:35:05.8179181Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "running",   // runningに変わっている
            "Running": true,
            "Paused": false,       // falseに変わっている

```

#### `Exited`：　コンテナは停止しているが残っている状態
停止しているコンテナを確認する
```
docker ps -a
```
ここに存在しているコンテナは`docker start`コマンドで再起動できる
削除する場合は`docker rm`コマンド





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284176/d1008903-cf03-8e9a-ebdd-d6bc6cd89a99.png)