RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Docker環境構築~RPMビルド【ハンズオン】

アイキャッチ画像

はじめに

こんにちは C2ZTAk6 です。
今回は初めにDockerについての説明を行ったのち、ハンズオン形式で
「CentOS8環境にDockerインストール~Dockerコンテナ上で、OpensslのSRPMからビルドを行いOpensslのRPMを作成する手順」を紹介していきたいと思います。

目次

Dockerとは

仮想化環境を構築するためのツールとなり、コンテナ型の仮想化プラットフォームと呼ばれております。
具体的には、WindowsLinuxのホストマシンなどにコンテナと呼ばれる仮想環境を構築し、
コンテナの中でアプリケーションやミドルウェア、OSなどを動かすことが出来るツールとなります。

f:id:C2ZTAk6:20211020095132p:plain
コンテナ型の仮想プラットフォーム構成イメージ

Dockerfileとは

Dockerで作成するコンテナイメージを管理するためのファイルです。
Dockerfileに記載する内容は、必要なミドルウェア、アプリケーション、
ディレクトリ構成、各種設定などを記載致します。

・以下は今回のハンズオンで使用するDockerfile変数の説明となります。

変数名 説明
FROM ベースイメージを指定します。
ARG ビルド時にDockerに渡す変数を定義します。
WORKDIR 作業用ディレクトリを定義します。
RUN FROMで記載したベースイメージに対してコマンドを実行することができます。

※その他Dockerfileの変数を調べたい場合は、公式ドキュメントをご参照ください。

Dockerイメージとは

Dockerコンテナを立ち上げる基になるのがDockerイメージです。
Dockerイメージは、docker hubというDockerの公式サイトからダウンロードしてくることもできます。

また、自身で作成したDockerfileをbuildすることで、自作のDockerイメージを作成することもできます。

f:id:C2ZTAk6:20211020100858p:plain
Dockerfileを元にDockerContainer作成までのイメージ

SRPMとは

SRPM とは、RPM パッケージを作成する事が出来るソースパッケージとなります。
SRPM には、ソースコード、パッチ、作成方法が記載されたspecファイル等が含まれており、
spec ファイルを元にビルド(rpmbuild)を行うと
ディストリビューションが配布しているRPMパッケージと同等の物を作る事が出来ます。

なお、specファイルに記載されている情報を自分好みに修正することで、
ディレクトリ構成やコンパイル時のオプションなどを制御することが可能となります。

Dockerコンテナ上でRPMを作成するメリットとは

ホストOS上でRPMを作成する場合は、対象のRPMを作成する際に

  • どういったミドルウェアをインストールしたか
  • どういった設定を行ったのか

後追いでの確認が困難となり、
最悪の場合は、同じSPECファイルを元にRPMを作成しても以前と同じRPMが作成できないというリスクがあります。

Dockerfileにコンテナに必要なミドルウェア、アプリケーション、ディレクトリ構成、各種設定などを記載してコード化することで、必要な情報の整理ができ、ホストOS上に不要なミドルウェア、アプリケーションなどインストールする必要もなくなります。
また、作成したDockerfileを元にDockerコンテナ上でRPMを作成すれば、毎回新しい環境でRPMが作成されることになり、以前とは同じRPMが作成できないというリスクがなくなります。

Docker環境構築

※以降からハンズオン形式での説明となります。

・CentOS8をインストールした仮想マシンを用意

[root@rpm-test-server ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

必要なミドルウェアインストール

・dnfコマンドを使用して、ホストOSに必要なミドルウェアをインストールします。

[root@rpm-test-server ~]# dnf install -y yum-utils device-mapper-persistent-data lvm2 wget mock
CentOS-8 - AppStream                                                                                                                                                                                         7.9 kB/s | 4.3 kB     00:00
CentOS-8 - AppStream                                                                                                                                                                                         3.6 MB/s | 9.3 MB     00:02
CentOS-8 - Base                                                                                                                                                                                              6.1 kB/s | 3.9 kB     00:00
CentOS-8 - Base                                                                                                                                                                                              5.3 MB/s | 7.5 MB     00:01
CentOS-8 - Extras                                                                                                                                                                                            3.0 kB/s | 1.5 kB     00:00
CentOS-8 - Extras
~~~~~~~~~~省略~~~~~~~~~~
完了しました!

・Docker公式ページを参照するリポジトリを設定します。

[root@rpm-test-server ~]# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
repo の追加: https://download.docker.com/linux/centos/docker-ce.repo

リポジトリのリストに、docker-ce-stable が追加されていることを確認する。

[root@rpm-test-server Openssl]# dnf repolist
repo id                                                                                                           repo の名前
AppStream                                                                                                         CentOS-8 - AppStream
BaseOS                                                                                                            CentOS-8 - Base
docker-ce-stable                                                                                                  Docker CE Stable - x86_64
extras                                                                                                            CentOS-8 - Extras

DockerCEのインストール

・dnfコマンドを使用して、ホストOSにDockerCEをインストールします。

[root@rpm-test-server ~]# dnf install -y docker-ce docker-ce-cli containerd.io
Docker CE Stable - x86_64                                                                                                                                                                                    221 kB/s | 3.5 kB     00:00
依存関係が解決しました。
~~~~~~~~~~省略~~~~~~~~~~
完了しました!

Docker起動及び、自動起動設定

・systemctlコマンドにて、Dockerサービスを起動させます。

[root@rpm-test-server ~]# systemctl start docker

・Dockerサービスが起動していることを確認する。

[root@rpm-test-server ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-10-15 21:40:16 JST; 34s ago
     Docs: https://docs.docker.com
 Main PID: 12645 (dockerd)
    Tasks: 8
   Memory: 43.0M
   CGroup: /system.slice/docker.service
           mq12645 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

1015 21:40:12 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:12.977524850+09:00" level=info msg="Loading containers: start."
1015 21:40:15 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:15.411238922+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferre>
10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:15.411780590+09:00" level=info msg="failed to read ipv6 net.ipv6.conf.<bridge>.accept_ra" bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra
10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:15.411800783+09:00" level=info msg="failed to read ipv6 net.ipv6.conf.<bridge>.accept_ra" bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra
10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:16.095902384+09:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:16.247442276+09:00" level=info msg="Loading containers: done."
10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:16.335702315+09:00" level=info msg="Docker daemon" commit=79ea9d3 graphdriver(s)=overlay2 version=20.10.9
10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:16.336171122+09:00" level=info msg="Daemon has completed initialization"
10月 15 21:40:16 rpm-test-server.mdomain systemd[1]: Started Docker Application Container Engine.
10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:16.381474167+09:00" level=info msg="API listen on /var/run/docker.sock"

・Dockerサービスの自動起動設定を行う。

[root@rpm-test-server ~]# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

・Dockerサービスの自動起動設定の確認を行う。(enableになっていること)

[root@rpm-test-server ~]# systemctl is-enabled docker
enabled

・インストールしたDockerのバージョンを確認する。

[root@rpm-test-server ~]# docker --version
Docker version 20.10.9, build c2ea9bc

RPM作成用Dockerベースイメージ作成

・mkdirコマンドにて、ディレクトリを作成する。

[root@rpm-test-server ~]# mkdir -p /root/RPM/{Baseimage,Openssl}

・Baseimage、Opensslディレクトリが作成されていることを確認する。

[root@rpm-test-server ~]# ls -l /root/RPM/
合計 0
drwxr-xr-x. 2 root root 6 1015 22:57 Baseimage
drwxr-xr-x. 2 root root  6 1016 01:41 Openssl

・Baseimageディレクトリに移動する。

[root@rpm-test-server ~]# cd /root/RPM/Baseimage/

Dockerfile作成

・viコマンドにて、Dockerfileの作成を行います。

[root@rpm-test-server Baseimage]# vi Dockerfile
FROM centos:8

# 必要なパッケージ、フォルダなど
RUN yum install gcc gcc-c++ make autoconf automake rpm-build wget -y
RUN mkdir -p /root/rpmbuild/{SPECS,SOURCES}

Dockerベースイメージ作成用スクリプト作成

・viコマンドにて、Dockerベースイメージ作成用スクリプトの作成を行います。

[root@rpm-test-server Baseimage]# vi base.sh
VERSION='8'
NAME_RPM='rpmbuild_base'
docker build -t $NAME_RPM:$VERSION .

Dockerベースイメージ作成スクリプト実行

・作成したDockerベースイメージ作成スクリプトを実行します。

[root@rpm-test-server Baseimage]# sh base.sh
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM centos:8
8: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:8
 ---> 5d0da3dc9764
Step 2/3 : RUN yum install gcc gcc-c++ make autoconf automake rpm-build wget -y
 ---> Running in fbc9dabbe91b
~~~~~~~~~~省略~~~~~~~~~~
Step 3/3 : RUN mkdir -p /root/rpmbuild/{SPECS,SOURCES}
 ---> Running in da70aa6d2f3b
Removing intermediate container da70aa6d2f3b
 ---> 47940803c713
Successfully built 47940803c713
Successfully tagged rpmbuild_base:8

Dockerイメージが作成されているか確認

・REPOSITORY欄にrpmbuild_baseが作成されていることを確認する。

[root@rpm-test-server Baseimage]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
rpmbuild_base   8         47940803c713   38 seconds ago   511MB
centos          8         5d0da3dc9764   4 weeks ago      231MB
[root@rpm-test-server Baseimage]#

Dockerコンテナ上で、SRPM(Openssl)からビルドを実行

・Opensslディレクトリに移動

[root@rpm-test-server ~]# cd /root/RPM/Openssl/

Dockerfile作成

・viコマンドにて、Dockerfileの作成を行います。

[root@rpm-test-server Openssl]# vi Dockerfile
# ベースイメージ
FROM rpmbuild_base:8

# 変数
ARG URL_SOURCE0="https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm"

# ディレクトリ移動
WORKDIR /root/rpmbuild/SOURCES/

# Openssl srpmダウンロード
RUN wget $URL_SOURCE0

# ユーザー作成
RUN useradd -s /sbin/nologin mockbuild

# 必要なパッケージインストール
RUN dnf -y --nogpgcheck install lksctp-tools-devel perl zlib-devel krb5-devel

# Openssl srpmインストール
RUN rpm -ivf openssl-1.1.1g-15.el8_3.src.rpm

# ディレクトリ移動
WORKDIR /root/rpmbuild/SPECS/

# srpmからOpensslをビルド
RUN rpmbuild -bb openssl.spec

# Dockerコンテナ上で、srpmから作成されたOpensslインストールテスト実施
RUN rpm -ivh --force --nodeps --test /root/rpmbuild/RPMS/x86_64/*.rpm

# Dockerコンテナ上で、srpmから作成されたOpensslインストール実施
RUN rpm -ivh --force --nodeps /root/rpmbuild/RPMS/x86_64/*.rpm

vi コマンドの使い方は、以下記事もご参考ください!
vi コマンド【使い方まとめ】 - RAKUS Developers Blog | ラクス エンジニアブログ

SRPMビルドスクリプト作成

・viコマンドにて、SRPMビルドイメージ作成用スクリプトの作成を行います。

[root@rpm-test-server Openssl]# vi rpmbuild.sh
# 変数
NAME_RPM='openssl'
VERSION='1.1.1g'

# ビルドされたrpmを配置する際のディレクトリ作成
mkdir -p  /tmp/create-rpmbuild/

# Openssl作成用Dockerイメージ作成
docker build -t $NAME_RPM:latest .

# コンテナ終了時にコンテナ自動的に削除
docker run --rm --name $NAME_RPM -itd $NAME_RPM sh

# コンテナ上に作成されたRPMをホストOSに状にコピー
docker cp ${NAME_RPM}:/root/rpmbuild/RPMS/x86_64/openssl-${VERSION}-15.el8.x86_64.rpm /tmp/create-rpmbuild/
docker cp ${NAME_RPM}:/root/rpmbuild/RPMS/x86_64/openssl-libs-${VERSION}-15.el8.x86_64.rpm /tmp/create-rpmbuild/
docker cp ${NAME_RPM}:/root/rpmbuild/RPMS/x86_64/openssl-devel-${VERSION}-15.el8.x86_64.rpm /tmp/create-rpmbuild/
docker cp ${NAME_RPM}:/root/rpmbuild/RPMS/x86_64/openssl-static-${VERSION}-15.el8.x86_64.rpm /tmp/create-rpmbuild/
docker cp ${NAME_RPM}:/root/rpmbuild/RPMS/x86_64/openssl-devel-${VERSION}-15.el8.x86_64.rpm /tmp/create-rpmbuild/

# コンテナ停止
docker stop ${NAME_RPM}

# Openssl用Dockerイメージ削除
docker rmi ${NAME_RPM}:latest

SRPM(Openssl)ビルドスクリプト実行

SRPMからOpensslのRPMをビルドするスクリプトを実行する。

[root@rpm-test-server Openssl]# sh rpmbuild.sh
Sending build context to Docker daemon  4.096kB
Step 1/11 : FROM rpmbuild_base:8
 ---> 47940803c713
Step 2/11 : ARG URL_SOURCE0="https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm"
 ---> Using cache
 ---> 9c6a07f70f2c
Step 3/11 : WORKDIR /root/rpmbuild/SOURCES/
 ---> Using cache
 ---> 91b3bef3ec6f
Step 4/11 : RUN wget $URL_SOURCE0
 ---> Using cache
 ---> 2318dc6d3c4a
Step 5/11 : RUN useradd -s /sbin/nologin mockbuild
 ---> Using cache
 ---> 8e57c50993a5
~~~~~~~~~~省略~~~~~~~~~~
Removing intermediate container 95c6bb93b199
 ---> 538078ef2772
Successfully built 538078ef2772
Successfully tagged openssl:latest
3479522ed3d3d981faef54ec5e9a0e831984431377bc9a8cf9b09addb321ff61
openssl
Untagged: openssl:latest
Deleted: sha256:538078ef2772180b5cc0650f8cecd80474c29a1790991298d2ab05636825279a
Deleted: sha256:04c421d5a98c31c6d70ab035da0c964a98d1e54ac679d1604fe8d0e03a076850
Deleted: sha256:013c357eb7ca648af3ad90df4b03a9ada73c11b1f5d32f2286eeed5d4d87831b
Deleted: sha256:692bf040e3880686d38953b2744975103dbe0e1970d159bb7d77dfb4faa44cb6
Deleted: sha256:52c42e62f265da49f619d83d2bce9bcc56a38813370715fc18dab699b96e49e4
Deleted: sha256:67025404f47b7ceece317a15d542f7fb7c8caa1053dcbc84512f43eb8d6f8d2c
Deleted: sha256:309dc603c2bf6a08897a2b64b758618d2056dc9ef57545e0f9f506acbeb69162
Deleted: sha256:b5e761f711bd787c0ad14fbed4233e6ae6c43f88c9ebe435ec454964e4669060
Deleted: sha256:8d61bbfdc7afa30f88cf2d09ac28e1c7566975d7971b7acbee2e88945521608a
Deleted: sha256:419e3d452135275ad35b0f9bba27fc63854a5388e88e49e05ab255e291ad41f7
Deleted: sha256:20d4d5a2b412e5e524a660dcb348ca0c688f7ff9d97ad6f3c36cd21eaa835b35
Deleted: sha256:0c140ce4025c8d1a5fdb6f1124915d8cddea89ddaf5febbb485794c9308c7a1c
Deleted: sha256:1fab17399235d6ed8d1c447c9b0ed6419579b5c014c06ed2834c00dfc72a4220
Deleted: sha256:3b9e3b2a67519fb7fec632ea2fd4183f115e7f94ff26634abbee2ceeffa59244
Deleted: sha256:c9b708f383b8f88a7febd8db97608dc7b25abb388a30873233616c49ff77a544
Deleted: sha256:6a1390ee9ac3c3b59ff887240ef0f4d3e18dd7da295c580d3095bea1813baace
Deleted: sha256:898ff5c05d6799e520cf185a4ccfc7c049fe5813f1cb6721f96a64bee8718db5

RPMが作成されているか確認する

・Dockerコンテナ上で、OpensslのRPMが作成され、ホストOSにRPMがコピーされていることを確認

[root@rpm-test-server Openssl]# ls -l /tmp/create-rpmbuild/
合計 6500
-rw-r--r--. 1 root root  722616 1016 03:39 openssl-1.1.1g-15.el8.x86_64.rpm
-rw-r--r--. 1 root root 2427736 1016 03:39 openssl-devel-1.1.1g-15.el8.x86_64.rpm
-rw-r--r--. 1 root root 1532836 1016 03:39 openssl-libs-1.1.1g-15.el8.x86_64.rpm
-rw-r--r--. 1 root root 1963936 1016 03:39 openssl-static-1.1.1g-15.el8.x86_64.rpm

最後に

いかがでしたでしょうか。
今回はDockerの基本的な説明を交えながら、ハンズオン形式でCentOS8環境にDocker環境の構築を行いDockerfileを元に Dockerイメージ作成~Dockerコンテナ上で、SRPMからOpensslのRPMの作成を行いました。

この記事がCentOS8環境でDockerを使おうとしているエンジニアの助けとなれば幸いです。


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    forms.gle

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
    rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.