Docker コマンド覚書

個人的にいつもdockerのコマンドで迷子になってしまうので
ここに備忘録として残します。

※Dockerのコマンドについては公式マニュアルが非常にわかりやすく整理されていてマニュアルを都度見ても理解(非常に、簡易な英語で記述されてます)できるので、詳細は公式マニュアルをおすすめします。

# 1.コンテナに対するコマンド

## (1)任意のDockerイメージからコンテナを作成し起動状態にする

```docker

docker run --name some-running-container -d -v /c/Users/your_host/:/var/www/html/your_guest/ -p 11180:80 nginx
# --name コンテナ名の指定 
# -d バックグラウンドで実行 
# -v ホスト側共有ディレクトリ(フルパス):コンテナ側共有ディレクトリ(フルパス)
# -p ホスト側port:コンテナ側port 
# 最後のオプション(利用するコンテナイメージ) 
```
## (1)-2 任意のDockerイメージからコンテナを作成し、いったん停止状態にする

```docker

docker container create --name something-name -it -v /c/Users/your-name/:/var/www/html/your-name -p 8080:80 centos:latest /bin/bash
# --name コンテナ名の指定 
# -d バックグラウンドで実行 
# -v ホスト側共有ディレクトリ(フルパス):コンテナ側共有ディレクトリ(フルパス)
# -p ホスト側port:コンテナ側port 
# コンテナ内で実行するコマンド　(例: /bin/bashなど)
# 最後のオプション(利用するコンテナイメージ) 
```
ただし、上記createコマンドでコンテナを作成後はすぐに停止状態となるため
コンテナ内のCLIに入れない。
そのため、作成したコンテナで何か作業をする必要がある場合は

```docker

docker container start something-name 
docker container attach something-name 
```
このように上記コマンドをたたいてやる必要がある。



## (2)動作しているコンテナ一覧を取得

```docker

docker container ls 
# docker container ls --help を実行するとわかるが、実行中のコンテナのみを表示

docker container ls -a
# 実行、停止問わずすべてのコンテナを表示
```

**以下が上記コマンドの実行例となる**

```docker
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
3e2cb7259af9        nginx               "nginx -g 'daemon of…"   8 seconds ago       Up 6 seconds        0.0.0.0:11180->80/tcp   some-running-container
```


## (3)指定したコンテナを削除する

起動中のコンテナをそのまま削除することはできないためコンテナを停止させる。

```docker
# コンテナ停止コマンド
docker contaienr stop some-running-container 
# 停止中コンテナ確認コマンド
docker container ls -a

# 実行例
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
3e2cb7259af9        nginx               "nginx -g 'daemon of…"   2 minutes ago       Exited (0) 4 seconds ago                       some-running-container
# 指定したコンテナのstatusが<Exited>となっている点を確認する

```

**その後、停止済みのコンテナを実際に削除**

```docker
docker container rm some-running-container or 60eb477a4e15
# コンテナ名あるいはコンテナIDで削除
```


# ■dockerコンテナ起動時に任意のコマンドを指定する場合

## (1)dockerコマンド入力時に最後にコンテナ内で実行するコマンドを指定

```docker
docker run -ti --name  some-running-shell centos /bin/bash
# dockerコマンドの最後に当該のコンテナ内で実行したいコマンドを指定する
```

**実行例**

```
C:\Users\root\development_php7>docker run -ti --name  some-running-shell centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
aeb7866da422: Pull complete
Digest: sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b
Status: Downloaded newer image for centos:latest
[root@f2f08a3dcb76 /]#
```

## (2)ログイン中のコンテナ内から一時的に抜ける

ctrl + P -> ctrl + Q
を実行すると、実行中コンテナシェルをぬける。
この状態で

```docker

docker container ls -a # と実行すると
```

**以下、実行例**

```
C:\Users\root\development_php7>docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f2f08a3dcb76        centos              "/bin/bash"         7 minutes ago       Up 7 minutes                            bash_shell
```
**上記の用にぬけたコンテナのSTATUSがUpの状態になっていることを確認**



## (3)離脱したコンテナへ再度ログインする

```docker

docker container attach <コンテナ名>
```


このコマンドは既に/bin/bashというコマンドを実行中のプロセスへつなぐ模様

```
[root@f2f08a3dcb76 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  11828  2968 pts/0    Ss   02:10   0:00 /bin/bash
root        14  0.0  0.1  51716  3524 pts/0    R+   02:23   0:00 ps aux
```

## (4)コンテナ起動時のプロセスには触れずに新規で任意の起動中コンテナへシェルログインする

```docker

docker container exec -ti some-running-container /bin/bash
```

上記の用にコマンドを実行すると

```
[root@f2f08a3dcb76 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  11828  3056 pts/0    Ss+  02:10   0:00 /bin/bash
root        15  0.4  0.1  11828  2852 pts/1    Ss   02:23   0:00 /bin/bash
root        28  0.0  0.1  51716  3496 pts/1    R+   02:24   0:00 ps aux
```
このように/bin/bashという同様のコマンドで別プロセスが立ち上がっているのがわかる

この際ログインシェル上で< ctrl + P -> ctrl + Q > を実行してシェルを抜けると
次に同様のコマンド

```docker
docker container exec -ti some-running-container /bin/bash
```

上記を使ってシェルログインすると

```
[root@f2f08a3dcb76 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.1  11828  2956 pts/0    Ss+  02:29   0:00 /bin/bash
root        14  0.0  0.1  11828  2888 pts/1    Ss+  02:29   0:00 /bin/bash
root        34  0.4  0.1  11828  2952 pts/2    Ss   02:30   0:00 /bin/bash
root        47  0.0  0.1  51716  3504 pts/2    R+   02:30   0:00 ps aux
```
プロセスが新規で立ち上がる

## (5)起動中のコンテナを停止する

コンテナシェルからログアウト後

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f2f08a3dcb76        centos              "/bin/bash"         30 minutes ago      Up 11 minutes                           bash_shell
```

コンテナが起動中なのを確認する

その後

```docker

docker container stop bash_shell 
docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
f2f08a3dcb76        centos              "/bin/bash"         31 minutes ago      Exited (137) About a minute ago                       bash_shell

# 任意のコンテナのSTATUSが<Exited>となっている点を確認
```

## (6)停止したコンテナを削除する

```docker

docker container rm bash_shell
```


# ■docker-composeに連なるコマンド
## (1)docker-compose.ymlを使用したコンテナ起動
該当のyamlファイルのあるディレクトリ上で以下のようなコマンドを打つ。

```docker
docker-compose up -d
```

## (2)コンテナの正常な起動を確認する

```docker
docker-compose ps

# 以下実行例
           Name                          Command              State           Ports
--------------------------------------------------------------------------------------------
development_php7_app_1        /usr/sbin/httpd -DFOREGROUND    Up      0.0.0.0:11180->80/tcp
development_php7_mysql_1      docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp
development_php7_postgres_1   docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
```

## (3)起動したコンテナを一時停止する

```docker
docker-compose stop

# 以下、実行例
           Name                          Command              State    Ports
----------------------------------------------------------------------------
development_php7_app_1        /usr/sbin/httpd -DFOREGROUND    Exit 0
development_php7_mysql_1      docker-entrypoint.sh mysqld     Exit 0
development_php7_postgres_1   docker-entrypoint.sh postgres   Exit 0
```

Stateの項目が Exit 0 となっているのが確認できればOK。

更に再度、起動させる場合は

```docker
docker-compose start
```
上記コマンドを実行すると再度サービスが起動する

## (4)停止中のコンテナを削除する
docker-composeファイルを使用したコンテナを一度に削除するときは、
以下のようなコマンドを実行する

```docker
docker-compose rm
# 実行すると、本当に削除するかどうかを聞かれるので[y]を押す。
# その後、再度
docker-compose ps 
# 以下、実行結果
Name   Command   State   Ports
------------------------------

``` 
上記の用に慣ればdocker-composeで起動されたコンテナが一度に
削除される。

## (5)Dockerfileなどを修正し、再度コンテナを実行したい場合

```docker
docker-compose build
# と実行すうると変更したDockerfileを用いて再度ビルドをしてくれる
```



# ■dockerイメージに対するコマンド
## (1)ダウンロード済みのイメージ一覧

```docker
docker images -a

# 実行例
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              be1f31be9a87        8 days ago          109MB
```

## (2)任意のdockerイメージの削除

```docker

docker rmi 6bb891430fb6 75835a67d134 ...
# コマンドオプションのコンテナIDはスペース区切りで複数指定可能
```

## (3)ダウンロード済みのコンテナイメージすべてを一度に削除

```docker
docker image prune -a # or --all
```
上記コマンドで**未使用中のコンテナイメージ**を一度に削除できる