①１日１０分で理解するコンテナ技術入門 - Dockerのインストールと基本コマンド -

# はじめに
[Qiita Engineer Festa 2024](https://qiita.com/official-campaigns/engineer-festa/2024 "")が始まりましたね。これを機に、1記事5～10分くらいを目安に読める、dockerからKubernetesまでの基本的な部分を紹介する記事を書こうと思います。

今回はdockerの初歩の初歩、Dockerのインストールと基本コマンドについて説明します。
# Dockerのインストール方法
Dockerはいろいろなプラットフォームに対応しています。[ここ](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ "")からお使いのプラットフォームを選択すればインストール方法が分かります。例えば、Windows, Macをお使いの方は、[Docker desktop for windows](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/windows/install ""), [Docker desktop for Mac](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/ "")をインストールするだけです。簡単！

## CentOSのインストール例
Docker Desktop for xxxはGUIで簡単にインストールできるので、ここでは例として、CentOSのインストール手順を見てみます。以下のコマンドを入力するだけです。
```bash:CentOSにおけるdockerのインストール手順
 sudo yum remove docker \
                 docker-client \
                 docker-client-latest \
                 docker-common \
                 docker-latest \
                 docker-latest-logrotate \
                 docker-logrotate \
                 docker-engine
 
 sudo yum install -y yum-utils
 
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
 
 sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 
 sudo systemctl start docker
```
インストールできたかを確認するために、以下のコマンドでサンプルのコンテナを立ち上げてみます。
```bash
sudo docker run hello-world
```
以下のような出力が出ていれば成功です。私は諸事情でdockerではなくpodmanを使っているので皆さんとは出力が違うかと思いますが、イメージ的には以下のような感じになるはずです。
```bash
$ sudo docker run hello-world
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob 81df7ff16254 done
Copying config 5dd467fce5 done
Writing manifest to image destination
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org
```
## sudoなしでdockerコマンドを実行する
dockerインストール後、そのままの状態だと、dockerコマンドを実行する際に毎回sudoを入力する必要があり面倒なので、下記の手順でsudoなしで実行できるようにしておきます。
```bash
sudo groupadd docker

sudo gpasswd -a $USER docker

sudo systemctl restart docker
```
上記の手順実行後、再ログインするとsudoなしで実行できるようになります。
# Dockerの基本コマンド
ここまでで無事にdockerがインストールできたと思います。ここからは、実際にdockerを使ってみましょう！
dockerを使う上で最低限覚えておくべきコマンドは下のコマンドです。
|  コマンド |説明  |
|:-|:-:|
| docker **container** run \<image-name> | 新しいコンテナを作成して実行  |
| docker **container** ls | 起動・停止しているコンテナの一覧を確認 |
| docker **container** start \<container-name>| 停止しているコンテナを起動|
| docker **container** stop \<container-name>| 起動しているコンテナを停止 |
| docker **container** rm  \<container-name>| コンテナを削除（停止させてから実行する）  |
| docker **container** exec \<container-name> \<command>| 起動しているコンテナで指定したコマンドを実行 |
| docker **image** build -t \<image-name> .| カレントディレクトリのDockerfileからコンテナイメージをビルドする |
| docker **image** ls | コンテナイメージの一覧を確認  |
| docker **image** rm \<image-name>| コンテナイメージを削除  |

このあたりのコマンドを押さえておけば、最低限コンテナの作成、実行、停止、削除くらいはできます。
## 実際に試してみる
ここから、上記で紹介したコマンドの一部を、下記の流れで実行していきたいと思います。
1. nginxイメージからnginxのコンテナを実行
    1. `docker container run`コマンド
    1. `docker container ls`コマンド
1. nginxのコンテナを停止
    1. `docker container stop`コマンド
1. nginxのコンテナを再起動
    1. `docker container start`コマンド
1. nginxのコンテナを再度停止させ、削除
    1. `docker container stop`コマンド
    1. `docker container rm`コマンド
    1. `docker image rm`コマンド
### nginxイメージからnginxのコンテナを実行
`docker container run`コマンドを使います。`-d`オプションでバックグラウンドで起動し、`-p`オプションでコンテナのポートとホストのポートをポートフォワーディングしています。実際にアクセスする場合は、ホスト側のポート番号でアクセスします。
```bash
$ docker container run -d -p 10000:80 nginx
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Resolved "nginx" as an alias (/home/opc/.cache/containers/short-name-aliases.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob b7923aa4e8a6 done
Copying blob 9b3addd3eb3d done
Copying blob 5529e0792248 done
Copying blob 7b5f78f21449 done
Copying blob 09f376ebb190 done
Copying blob 57910a8c4316 done
Copying blob 785625911f12 done
Copying config 4f67c83422 done
Writing manifest to image destination
6ea50099132cd25e8c5d1cfbca34cfe9dd4f4f34017e7de1e332fa12b88f5b66
```
作成したコンテナを、`docker container ls`コマンドで確認してみます。
```bash
$ docker container ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS             PORTS                  NAMES
6ea50099132c  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute  0.0.0.0:10000->80/tcp  keen_goldstine
```
`curl`コマンドで、nginxにアクセスしてみます。
```bash
$ curl localhost:10000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
コンテナの80ポートとホストの10000ポートをポートフォワーディングしているので、ポート10000にアクセスします。現在操作しているのはコンテナが動作しているホストなので、localhostを指定しています。
### nginxのコンテナを停止
それでは起動させたnginxのコンテナを、`docker container stop`コマンドで停止させます。停止させる際にコンテナ名かコンテナIDが必要になるので、`docker container ls`コマンドで確認します。
```bash
$ docker container ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                  NAMES
f2c433815e89  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago  Up 3 seconds  0.0.0.0:10000->80/tcp  optimistic_pare
```
コンテナIDは`f2c433815e89`だとわかりました。ではこのコンテナを停止してみます。
```bash
$ docker container stop f2
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
f2
```
コンテナIDを指定するときは、一意に識別できるところまで入力すればOKです。今回は1つしかコンテナがないので、fだけでも停止できます（**ほかのコマンドでも同様です！**）。

### nginxのコンテナを再起動
停止させたnginxのコンテナを、`docker container start`コマンドで再起動してみます。このコマンドもコンテナIDを指定しますので、先ほど調べた`f2c433815e89`を指定します（`f`だけでよい）。
```bash
$ docker container start f
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
f
```
コンテナが起動したかを、`docker container ls`コマンドで確認してみます。
```bash
$ docker container ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS             PORTS                  NAMES
f2c433815e89  docker.io/library/nginx:latest  nginx -g daemon o...  5 minutes ago  Up About a minute  0.0.0.0:10000->80/tcp  optimistic_pare
```
起動していることが分かります。一応、`curl`も使ってみます。
```bash
$ curl localhost:10000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```
ちゃんとスタートページが返ってきていますね。
### nginxコンテナを再度停止させ、削除
まずは、`docker container stop`コマンドで再度停止させます。
```bash
$ docker container stop f
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
f
```
停止させたコンテナを、`docker container ls -a`コマンドで確認します。
```bash
$ docker container ls -a
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS                     PORTS                  NAMES
f2c433815e89  docker.io/library/nginx:latest  nginx -g daemon o...  7 minutes ago  Exited (0) 33 seconds ago  0.0.0.0:10000->80/tcp  optimistic_pare
```
`STATUS`がExitedになっているので、停止していることが分かります。
次に、このコンテナを削除します。コンテナの削除は、`docker container rm`コマンドで行います。例にもれずコンテナIDも指定します。
```bash
$ docker container rm f
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
f
```
削除されたかどうか、再度`docker container ls -a`コマンドで確認してみます。
```bash
$ docker container ls -a
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
```
何も表示されなくなりました。これで無事コンテナを削除することができました。

今ホストOSには、コンテナは削除されたものの、nginxコンテナの元になったコンテナイメージは残っています。コンテナイメージを確認するには、`docker image ls`コマンドを使います。
```bash
$ docker image ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx  latest      4f67c83422ec  11 days ago  192 MB
```
このコンテナイメージも削除してきれいな状態に戻しましょう。コンテナイメージの削除は、`docker image rm <image-id>`コマンドを指定します。このコマンドで指定するIDは、**IMAGE ID**である点に注意してください。`docker image ls`コマンドの出力から、**IMAGE ID**は`4f67c83422ec`であると分かるので、これを指定します。
```bash
$ docker image rm 4
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Untagged: docker.io/library/nginx:latest
Deleted: 4f67c83422ec747235357c04556616234e66fc3fa39cb4f40b2d4441ddd8f100
```
`docker image`コマンドも同様、一意に識別できるところまでIDを指定すればよいので、今回は`4`だけで大丈夫です。
# まとめ
以上、Dockerのインストール方法から、とりあえず使うためのコマンド紹介でした。次回はもう少しdockerを使いこなすために、カスタムコンテナイメージを作成するためのDockerfileについて紹介します。
[次の記事](https://qiita.com/goroneko/items/c9b3e7d5292128f72e13 "")
# 参考
1. https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/
2. https://qiita.com/DQNEO/items/da5df074c48b012152ee