Dockerの基礎を学ぶ

# Dockerの基礎を学ぶ
Dockerの個人学習で学んだことをアウトプットするために作成した記事です。
インストールするところから基礎的な使い方まで学んだことを順番に書いていきます。

目次
- 準備（Dockerのインストール）
- 基礎練習（Hello World）
- 基礎練習（ubuntuコンテナの作成・起動）
- 基礎練習（コンテナの基本操作）


## 準備（Dockerのインストール）
まずはDockerをインストールします。
インストール方法は[Dockerマニュアル](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ubuntu/)にも記載されていますがこのページではコマンドと簡単な説明だけメモしておきます。

### インストールに必要なパッケージのインストール
curlなど　Dockerのインストールで利用するパッケージ類をあらかじめインストールします。
```
apt update

apt install ca-certificates
apt install curl
apt install gnupg
```


### GPG鍵の取得
Dockerの公式GPG鍵をcurlコマンドで追加します
```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```


### リポジトリの追加
Dockerリポジトリをセットアップします。（aptコマンド実行時に参照するファイルにDockerリポジトリのURLを追加）

```
 echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

### Dockerのインストール
aptコマンドでDockerをインストールします。
```
apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

### インストール確認
正常にインストールされていればバージョンが表示されます。
```
docker -v
```


## 基礎練習（Hello World）
Dockerの公開レジストリで公開されているイメージをダウンロードして
アプリケーションを実行するところまで実施します。
ここでは`Hello World`というイメージを公式のレジストリからダウンロードして実際に実行するところまでの流れを書きます。


### docker search
まずは`docker serch [registory name]`コマンドでレジストリーの内容を確認してみます。
今回は`library`というレジストリの内容を確認しています。
実際に実行してみると以下のような出力結果になりました。

```
root@ubuntu-64bit:~# docker search library
NAME          DESCRIPTION                                     STARS     OFFICIAL
memcached     Free & open source, high-performance, distri…   2362      [OK]
busybox       Busybox base image.                             3415      [OK]
alpine        A minimal Docker image based on Alpine Linux…   11269     [OK]
redis         Redis is the world’s fastest data platform f…   13281     [OK]
ubuntu        Ubuntu is a Debian-based Linux operating sys…   17556     [OK]
nginx         Official build of Nginx.                        20769     [OK]
python        Python is an interpreted, interactive, objec…   10086     [OK]
node          Node.js is a JavaScript-based platform for s…   13889     [OK]
hello-world   Hello World! (an example of minimal Dockeriz…   2440      [OK]
mariadb       MariaDB Server is a high performing open sou…   5960      [OK]
httpd         The Apache HTTP Server Project                  4868      [OK]
rabbitmq      RabbitMQ is an open source multi-protocol me…   5254      [OK]
traefik       Traefik, The Cloud Native Edge Router           3446      [OK]
centos        DEPRECATED; The official build of CentOS.       7773      [OK]
sonarqube     Official images for SonarQube, code analysis…   2495      [OK]
php           While designed for web development, the PHP …   7738      [OK]
haproxy       HAProxy - The Reliable, High Performance TCP…   1975      [OK]
telegraf      Telegraf is an agent for collecting metrics …   708       [OK]
registry      Distribution implementation for storing and …   4127      [OK]
nextcloud     Nextcloud manual docker image                   4312      [OK]
vault         Vault is a tool for securely accessing secre…   1156      [OK]
ruby          Ruby is a dynamic, reflective, object-orient…   2380      [OK]
caddy         Caddy 2 is a powerful, enterprise-ready, ope…   871       [OK]
consul        Consul is a datacenter runtime that provides…   1455      [OK]
kong          The Cloud-Native API Gateway for APIs and Mi…   822       [OK]
```

### docker pull
レジストリに公開されているイメージをダウンロードする際には`docker pull [image name]`コマンドを利用します。
今回は公式レジストリにある`hello world`をpullしてきます。
```
docker pull hello-world
```

ダウンロードした内容は`docker images`コマンドで確認できます。
`docker pull`が成功していれば以下のような出力結果になるかと思います。
```
root@ubuntu-64bit:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    74cc54e27dc4   3 months ago   10.1kB
```


### docker run
dockerイメージの用意ができたので、これを使ってコンテナを作成します。
コマンドは`docker run [IMAGE ID or REPOSITORY Name]`です。

以下のような出力結果が得られれば成功です。
```
root@ubuntu-64bit:~# docker run 74cc54e27dc4

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

## 基礎練習（ubuntuコンテナの作成・起動）
別のイメージファイルからコンテナを作成し、そのコンテナ環境でbashを起動するところまで実施します。コマンド実施後はコンテナの標準入力に接続されます。

①ubuntuのイメージをpullします
```
docker pull ubuntu
```

②IMAGE IDを確認します
```
root@ubuntu-64bit:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    602eb6fb314b   3 weeks ago    78.1MB
```

③コンテナを作成し、作成したコンテナ環境に入ります
```
docker run -it --name test_ubuntu 602eb6fb314b /bin/bash
```
コマンドが成功すると、コンテナが立ち上がるとともにコンテナの標準入力に接続されます。プロンプトのホスト名などが変わるので、うまくいったかどうかはすぐにわかると思います。


コマンドに色々なオプションをつけていますが、各オプションの意味は次の表にまとめています。
|option  |説明  |
|---|---|
|-i  |コンテナで実施したコマンドの標準入力に接続する  |
|-t  |コンテナに疑似TTY端末を割り当てます  |
|--name  |起動するコンテナに名前を付けます。省略すると適当な名前が付きます  |
|/bin/bash  |コンテナ内で最初に実行するコマンドを指定します。（今回は/bin/bashを指定）  |

④コンテナから抜ける
`exit`コマンドでコンテナ内のbashコマンドプロンプトを抜けて、ホストのプロンプトに戻ります。exitで抜けたあと`docker ps`コマンドを実行するとコンテナが停止していることが確認できます。



## 基礎練習（コンテナの基本操作）
コンテナの作成は`docker run`コマンドを利用します。
当然コンテナにも作った後ずっと起動しておきたいものや、一瞬起動させて用が済んだら停止させたいものなどいろいろあるかと思います。
このセクションには作った後のコンテナを操作する方法を書いていきます。
実際にコンテナの起動、停止、バックグラウンド実行などdockerサブコマンドを使ってみます。


### コンテナの起動
停止しているコンテナを起動させるコマンドは`docker start`です。
以下操作例です。
```
### docker psでコンテナが停止していることを確認しています
root@ubuntu-64bit:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                         PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   50 minutes ago      Exited (127) 18 minutes ago              test_ubuntu


### CONTAINER IDを指定してコンテナの起動を試みています
root@ubuntu-64bit:~# 
root@ubuntu-64bit:~# docker start 15f81be4e406
15f81be4e406


### docker psでコンテナが起動していることを確認しています
root@ubuntu-64bit:~# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   51 minutes ago   Up 5 seconds             test_ubuntu
root@ubuntu-64bit:~# 
```


### コンテナの停止
起動しているコンテナを停止させるコマンドは`docker stop`です。
以下操作例です。
```
### docker psでコンテナが起動していることを確認しています
root@ubuntu-64bit:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS         PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   About an hour ago   Up 9 minutes             test_ubuntu


### CONTAINER IDを指定してコンテナの停止を試みています
root@ubuntu-64bit:~# docker stop 15f81be4e406 
15f81be4e406


### docker psでコンテナが停止していることを確認しています
root@ubuntu-64bit:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                       PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   About an hour ago   Exited (137) 9 seconds ago             test_ubuntu
root@ubuntu-64bit:~# 
root@ubuntu-64bit:~# 
root@ubuntu-64bit:~# 
```

### 起動中のコンテナに接続する
起動しているコンテナに接続するコマンドは`docker attach`です。
以下操作例です。

```
### docker psでコンテナが起動していることを確認しています
root@ubuntu-64bit:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS         PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   About an hour ago   Up 7 minutes             test_ubuntu


### docker attachコマンドでコンテナのbashに接続を試みています
root@ubuntu-64bit:~# docker attach 15f81be4e406


### プロンプトがコンテナのbashに変わることが確認できます
root@15f81be4e406:/# 
root@15f81be4e406:/# 
```


### コンテナを停止させることなくコンテナのbashから抜ける
普通に`exit`などのコマンドを入力すると、bashから抜けた時点でコンテナも停止してしまいます。
コンテナを停止させることなく、コンテナのbashから抜ける方法は以下です。

コンテナ内に入っている状態で、［Ctrl］＋［P］、［Ctrl］＋［Q］を押下する。
以下操作例です。（コマンドではないのでわかりづらいですが画面のイメージを載せておきます。）
```
### 出力例
root@15f81be4e406:/# 
root@15f81be4e406:/# read escape sequence
root@ubuntu-64bit:~# 
root@ubuntu-64bit:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS          PORTS     NAMES
15f81be4e406   602eb6fb314b   "/bin/bash"   2 hours ago   Up 20 minutes             test_ubuntu
root@ubuntu-64bit:~# 
```

# 参考文献
この記事は以下の文献を参考に執筆しました。

[Docker Engine インストール（Ubuntu 向け）](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ubuntu/)
[Dockerコンテナのアタッチとデタッチについて](https://qiita.com/R_R/items/40d256389b59b66eaf6b)
書籍：中井悦治, Docker実践入門 -コンテナ技術の基礎から応用まで, 株式会社技術評論社