はじめに
こんにちは C2ZTAk6 です。
今回は初めにDockerについての説明を行ったのち、ハンズオン形式で
「CentOS8環境にDockerインストール~Dockerコンテナ上で、OpensslのSRPMからビルドを行いOpensslのRPMを作成する手順」を紹介していきたいと思います。
目次
- はじめに
- 目次
- Dockerとは
- Dockerfileとは
- Dockerイメージとは
- SRPMとは
- Dockerコンテナ上でRPMを作成するメリットとは
- Docker環境構築
- RPM作成用Dockerベースイメージ作成
- Dockerイメージが作成されているか確認
- Dockerコンテナ上で、SRPM(Openssl)からビルドを実行
- 最後に
Dockerとは
仮想化環境を構築するためのツールとなり、コンテナ型の仮想化プラットフォームと呼ばれております。
具体的には、Windows、Linuxのホストマシンなどにコンテナと呼ばれる仮想環境を構築し、
コンテナの中でアプリケーションやミドルウェア、OSなどを動かすことが出来るツールとなります。
Dockerfileとは
Dockerで作成するコンテナイメージを管理するためのファイルです。
Dockerfileに記載する内容は、必要なミドルウェア、アプリケーション、
ディレクトリ構成、各種設定などを記載致します。
・以下は今回のハンズオンで使用するDockerfile変数の説明となります。
変数名 | 説明 |
---|---|
FROM | ベースイメージを指定します。 |
ARG | ビルド時にDockerに渡す変数を定義します。 |
WORKDIR | 作業用ディレクトリを定義します。 |
RUN | FROMで記載したベースイメージに対してコマンドを実行することができます。 |
※その他Dockerfileの変数を調べたい場合は、公式ドキュメントをご参照ください。
Dockerイメージとは
Dockerコンテナを立ち上げる基になるのがDockerイメージです。
Dockerイメージは、docker hubというDockerの公式サイトからダウンロードしてくることもできます。
また、自身で作成したDockerfileをbuildすることで、自作のDockerイメージを作成することもできます。
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 10月 15 21:40:12 rpm-test-server.mdomain dockerd[12645]: time="2021-10-15T21:40:12.977524850+09:00" level=info msg="Loading containers: start." 10月 15 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 10月 15 22:57 Baseimage drwxr-xr-x. 2 root root 6 10月 16 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 10月 16 03:39 openssl-1.1.1g-15.el8.x86_64.rpm -rw-r--r--. 1 root root 2427736 10月 16 03:39 openssl-devel-1.1.1g-15.el8.x86_64.rpm -rw-r--r--. 1 root root 1532836 10月 16 03:39 openssl-libs-1.1.1g-15.el8.x86_64.rpm -rw-r--r--. 1 root root 1963936 10月 16 03:39 openssl-static-1.1.1g-15.el8.x86_64.rpm
最後に
いかがでしたでしょうか。
今回はDockerの基本的な説明を交えながら、ハンズオン形式でCentOS8環境にDocker環境の構築を行いDockerfileを元に
Dockerイメージ作成~Dockerコンテナ上で、SRPMからOpensslのRPMの作成を行いました。
この記事がCentOS8環境でDockerを使おうとしているエンジニアの助けとなれば幸いです。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com