【Linux】Dockerイメージの作成手順

# 1. アプリケーションの構築手順を確立する

まずは、イメージのベースとなるOSを選定します。
今回はRockyLinuxを利用しますがDockerイメージを軽量にしたい場合はAlpineがおすすめです。
Dockerhubで好みのディストリビューションを選ぶとよいでしょう。
[https://hub.docker.com/](https://hub.docker.com/)


とりあえずコンテナをベースOSのコンテナを起動するために下記のファイルをコピペで作成します。imageの部分は自身の選定したOSを記載します。

```dokcer-compose.yaml
version: '3.8'
services:
  test:
    container_name: test
    image: rockylinux:8.6.20227707
    command: tail -f /dev/null
```

・コンテナを起動します。

```
# docker-compose up -d
[+] Running 2/2
 ? test Pulled                                                                                                                     3.5s
   ? a8c22950d6e2 Already exists                                                                                                   0.0s
[+] Running 2/2
 ? Network docker_default  Created                                                                                                 0.2s
 ? Container test          Started                                                                                                 1.8s
```

・コンテナにログインします。

```
# docker exec -it test bash
```

ここからは、通常のサーバのように構築します。
今回はプロキシサーバとしてsquidをインストールします。

```
# dnf update -y
# dnf install -y squid
```

通常ならここでsystemctlコマンドで起動したいのですがコンテナは基本的に隔離されている必要があるのでホストOSとカーネルを共有しているDockerでは基本的にsystemctlコマンドは利用できません。※権限を与えて利用することは可能
それなのでsquidコマンドでサービスを起動します。
事前にsystemctlコマンドを利用しないサービスの起動コマンドを調べる必要があります。


```
# squid -f /etc/squid/squid.conf
```

これでアプリケーションのインストールから起動までの手順が確立しました。
今度はこの手順をDockerfileに記載します。

# 2. Dockerfileの作成

Dockerfileは、Dockerイメージの設計書です。ビルドすることで自動的に設計書の通りにイメージが作成されます。

・Dockerfileを作成します。

```Dockerfile
FROM rockylinux:8.6.20227707
RUN dnf update -y && \
        dnf install -y squid
EXPOSE 3128
CMD ["squid", "-f", "/etc/squid/squid.conf"]
```

・イメージを作成する際にはリポジトリ名とタグを付与します。
例ではリポジトリ名をcustom-proxyとしタグを1.0としています。

```
# docker build -t custom-proxy:1.0 .
[+] Building 1.5s (6/6) FINISHED
 => [internal] load .dockerignore                                                                                                  0.0s
 => => transferring context: 2B                                                                                                    0.0s
 => [internal] load build definition from Dockerfile                                                                               0.1s
 => => transferring dockerfile: 170B                                                                                               0.0s
 => [internal] load metadata for docker.io/library/rockylinux:8.6.20227707                                                         1.3s
 => [1/2] FROM docker.io/library/rockylinux:8.6.20227707@sha256:afd392a691df0475390df77cb5486f226bc2b4cbaf87c41785115b9237f3203f   0.0s
 => CACHED [2/2] RUN dnf update -y &&  dnf install -y squid                                                                        0.0s
 => exporting to image                                                                                                             0.1s
 => => exporting layers                                                                                                            0.0s
 => => writing image sha256:b2ba902e43e48617b0147c0abcf3d668319a9f3f20fd481fcfd4a2aa57906d26                                       0.0s
 => => naming to docker.io/library/custom-proxy:1.0
```

・Dockerイメージの一覧を確認する。

```
# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED          SIZE
custom-proxy                  1.0       b2ba902e43e4   40 minutes ago   547MB
```

・Dockerイメージをファイル出力する。

```
# docker save custom-proxy:1.0 > custom-proxy.tar
```

おまけ

・Dockerイメージをインポートする場合は下記の通り。

```
# docker load < custom-proxy.tar
```