dockerコマンドのメモ

# 概要

`docker` コマンドの使い方を時々忘れるので、メモ的に置いた

# imageの検索と取得

- imageの検索
    - `$ docker search <search_word>`
- imageの取得
    - `$ docker pull <image_name>`
- 取得したimageの一覧
    - `$ docker images`

## 例

```
$ docker search httpd
NAME                                 DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                                The Apache HTTP Server Project                  2646                [OK]                
centos/httpd                                                                         25                                      [OK]
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   23                                      
...
$
$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
b8f262c62ec6: Already exists 
2c31b9311798: Pull complete 
7422a3cdf4e3: Pull complete 
1919d4fbf9e1: Pull complete 
60812fa1ab4c: Pull complete 
Digest: sha256:39d7d9a3ab93c0ad68ee7ea237722ed1b0016ff6974d80581022a53ec1e58797
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
$ 
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              19459a872194        5 days ago          154MB
$ 
```

# containerの生成と削除

コンテナの生成と起動、確認

- `$ docker run -d -p <host_port>:<container_port> -v <host_dir>:<container_dir> --name <container_name> <image> <exec_cmd>`
    - `-d`
        - バックグラウンド実行
    - `-p <host_port>:<container_port>`
        - ホストのポートへのアクセスを、コンテナのポートに転送する
    - `-v <hsot_dir>:<container_dir>`
        - ホストのディレクトリを、コンテナのディレクトリとしてマウントする
    - `--name <container_name> <image> <exec_cmd>`
        - コンテナ名を付けて、イメージからコンテナを生成する。
        - コンテナ生成後に実行するコマンドを記載する(任意)

`docker run`すると、イメージからコンテナが作成され、コンテナが起動する

確認は `docker ps` を利用する

- `docker ps` で、稼働中のコンテナを表示する
- `docker ps -a` で、停止中のコンテナも表示する

## 例

ホストの`/tmp/logdir` を コンテナの`/usr/local/apahce2/logs` としてマウントし、ホストが8000ポートで受けたアクセスを コンテナの80ポートへ転送する、webserverと言う名のコンテナを作る。

```
$ mkdir /tmp/logdir
$ docker run -d -p 8000:80 -v /tmp/logdir:/usr/local/apache2/logs --name webserver httpd
f04d594c3020f472ba3f113e27710c10782f692a43c30386091c6afea7e65c2e
$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
f04d594c3020        httpd               "httpd-foreground"   8 seconds ago       Up 6 seconds        0.0.0.0:8000->80/tcp   webserver
$ 
$ telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /
<html><body><h1>It works!</h1></body></html>
Connection closed by foreign host.
$ 
```

# containerの稼働と停止

- コンテナの稼働
    - `docker start <container_name>`
- コンテナの停止
    - `docker stop <container_name>`

## 例

```
$ docker stop webserver
webserver
$
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
f04d594c3020        httpd               "httpd-foreground"   6 minutes ago       Exited (0) 4 seconds ago                       webserver
$
$ docker start webserver
webserver
$
$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
f04d594c3020        httpd               "httpd-foreground"   7 minutes ago       Up 3 seconds        0.0.0.0:8000->80/tcp   webserver
$

```

# containerに対する操作

コンテナ内でコマンドを実行する

- `docker exec -it <container_name> <command>`
    - `-it` はコマンドの入出力を手元のターミナルに出力する
    - `<command>` は実行するコマンド。`/bin/bash`などでシェルも使える。
- `docker cp <source> <destination>`
    - ファイルは、`<container_name>:/var/... ` のように指定可能

## 例

```
$ docker exec -it webserver ls /
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr
$
$ docker exec -it webserver /bin/bash
root@f04d594c3020:/usr/local/apache2# hostname
f04d594c3020
root@f04d594c3020:/usr/local/apache2# exit
exit
$ 
$ docker cp webserver:/usr/local/apache2/conf/httpd.conf ./
$
$ ls
httpd.conf
$ 
```

# imageの作成とDockerehubへのアップロード

- イメージの作成
    - `docker commit <container_name> <image_name>`
        - イメージ名は、`<DockerHubユーザ名>/<イメージ名>:[タグ名]`
- イメージのアップロード
    - `docker login` で認証しておく
    - `docker push <image_name>`
- コンテナの削除
    - `docker rm <container_name>`
- イメージの削除
    - `docker rmi <image_name>`

イメージを削除する際には、利用しているコンテナを削除している必要がある。

## 例

```
$ docker commit webserver webimage:v0.1
sha256:20a35fc638f1cd084b5e8cd2378528013e0faade6bb2451abcd833f637455ac4
$
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
webimage            v0.1                20a35fc638f1        9 seconds ago       154MB
httpd               latest              19459a872194        5 days ago          154MB
$ 
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: YOUR-DOCKERHUB-NAME
Password: YOUR-DOCKERHUB-PASSWD
WARNING! Your password will be stored unencrypted in /home/YOURACCOUNT/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
$
$ docker push webimage
The push refers to repository [docker.io/library/webimage]
3af5ced8f83b: Preparing 
eb9b7fda09a9: Preparing 
34bee37d8bba: Preparing 
7051e05a2b9a: Preparing 
64c4da2050e7: Preparing 
2db44bce66cd: Waiting 
denied: requested access to the resource is denied
$ 
```
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
f04d594c3020        httpd               "httpd-foreground"   29 minutes ago      Up 21 minutes       0.0.0.0:8000->80/tcp   webserver
$ docker stop webserver
webserver
$
$ docker rmi httpd
Error response from daemon: conflict: unable to remove repository reference "httpd" (must force) - container f04d594c3020 is using its referenced image 19459a872194
$
$ docker rm webserver
webserver
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker rmi httpd
Untagged: httpd:latest
Untagged: httpd@sha256:39d7d9a3ab93c0ad68ee7ea237722ed1b0016ff6974d80581022a53ec1e58797
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
webimage            v0.1                20a35fc638f1        11 minutes ago      154MB
$ docker rmi webimage
Error: No such image: webimage
$ docker rmi webimage:v0.1
Untagged: webimage:v0.1
Deleted: sha256:20a35fc638f1cd084b5e8cd2378528013e0faade6bb2451abcd833f637455ac4
Deleted: sha256:c3f1e405036e5e8ce7ea84d7978f69067e1c177bda0a15b06fab998b65603bfc
Deleted: sha256:19459a87219415cc5751fb48e9aa37ea580b98eed1fe784e76c4bc3c9b3b0741
Deleted: sha256:ebefc32f49862ee9f4f672b338f29aefe056971bcc88912ed87968f5f75b0ae7
Deleted: sha256:fe3c18ca62ea3f45b69ad643869c6fd3ab567a5ad8207adf8d071d54c9152597
Deleted: sha256:62d97f753807d11f7ab72f8ae1911ff22617c9134e3edec13bf909493edb025c
Deleted: sha256:c4e27a02760c0a8711ac5e9f7e0fc7cffeb38b44b4041d0c6ded5087586727a8
Deleted: sha256:2db44bce66cde56fca25aeeb7d09dc924b748e3adfe58c9cc3eb2bd2f68a1b68
$
```

以上。

# appendix.

イメージの取得、起動、破棄の流れ

```
$ docker search httpd
$ docker pull httpd
$ docker run -d -p 8000:80 -v /opt/logs:/usr/local/apache2/logs --name webserver httpd
$ docker stop webserver
$ docker start webserver
$ docker exec -it /bin/bash
root@ID# exit
$ docker stop webserver
$ docker commit webserver dockerUser/webimage:v0.0
$ docker push dockerUser/webimage:v0.0
$ docker rm webserver
$ docker rmi dockerUser/webimage:v0.0
$ docker rmi httpd
$ docker ps -a
$ docker images
```