尝试在Red Hat通用基础镜像(UBI)中安装Nginx,并启动容器

尝试在可自由再分发的Red Hat Enterprise Linux基础上的容器操作系统映像”Red Hat Universal Base Image”(简称UBI)中安装Nginx并启动容器。

到2020年6月为止,UBI有两种基于RHEL7和RHEL8的版本,分别提供了标准、带有systemd初始化系统和最小化三种包配置选项,对应RHEL7和RHEL8版本。

这次我们将尝试①以RHEL7为基础的标准版本,②以RHEL7为基础的初始化版本。
※虽然只用标准版本就可以了,但由于想在容器中尝试使用systemd,所以也决定尝试初始化版本。

通常我们使用Dockerfile创建镜像,但这次我想尝试用手动逐一执行的方式来创建。

首先要从哪里获取UBI的形象。

寻找UBI的形象

当我在Ubi上搜索并查看时,似乎需要从Red Hat生态系统目录获取结果。我在这个网站的搜索表单中搜索了”ubi7″,结果给出了我想要找的内容。

红帽通用基础镜像7 → 标准
红帽通用基础镜像7简化版 → 最小配置
红帽通用基础镜像7初始化版 → 带有systemd初始化系统

我希望有一个关于Minimal的文字上的定义,我需要解释标准和systemd初始化系统之间的区别。在搜索中,我发现官方已经给出了解释。

由于ubi8-init镜像是构建在ubi8镜像之上的,所以它们的内容几乎相同。然而,它们之间存在一些重要的区别。在ubi8-init中,Cmd被设置为/sbin/init而不是bash,并默认启动systemd Init服务。这包括ps和与进程相关的命令(procps-ng软件包),但它们在ubi8中不包含。此外,ubi8-init的systemd会忽略普通的终止信号(SIGTERM和SIGKILL),但是会在接收到SIGRTMIN + 3时终止,因此ubi8-init将SIGRTMIN+3设置为StopSignal。

我明白了,接下来是寻找仓库的URL。
在刚才的搜索结果中,我选择了标准的(Red Hat Universal Base Image 7),并在点点点中进行搜索时,在[获取此镜像]标签下的[未经验证]标签中找到了。

使用Docker
从已安装并运行Docker服务的系统上使用以下命令:

$ docker pull registry.access.redhat.com/ubi7/ubi

由于拥有了所需的信息,我打算在这个基础映像上安装Nginx并启动容器进行尝试。由于主机只要是Linux就可以,我选择了方便的EC2(t2.micro) Amazon Linux 2。

使用UBI7(标准)将Nginx安装并启动容器。

首先尝试创建镜像时不使用Dockerfile。

$ docker container run -it --name ubi7 registry.access.redhat.com/ubi7/ubi:7.8 /bin/bash

由于yum的默认仓库中没有nginx,所以参考了Nginx官方文档并添加了Nginx的仓库(顺便提一句,UBI8默认仓库已经包含了nginx,不需要进行这个操作)。

# yum install yum-utils
# vi /etc/yum.repos.d/nginx.repo
------下記内容で保存-----
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
--------------------

在安装Nginx时,使用subscription-manager选项来禁用订阅管理。尽管不指定该选项也可以,但出于再分发方面的考虑还是加上为好。

# yum install -y --disableplugin=subscription-manager nginx
# yum clean all
# exit

创建图像。在启动nginx时使用-g “daemon off;”选项来指定以前台方式运行Nginx。容器需要以前台方式运行,否则会立即停止,因此通过这个选项将守护进程模式关闭掉。※也可以在Nginx的配置文件(/etc/nginx/nginx.conf)中写入deamon off;

$ docker container commit -c 'CMD ["-g","daemon off;"]' -c 'ENTRYPOINT ["nginx"]' ubi7 ubi7nginx:standard
docker container run -d --name ubi7nginx -p 80:80 ubi7nginx:standard

确认能够在浏览器中显示。

http://xxxx.xxxx.xxx   ※EC2のパブリックDNS or パブリックIPv4
image.png

由于确认动作已完成,进行清理工作。删除已创建的容器和镜像。

$ docker container rm -f $(docker container ls -qa)
$ docker image rm ubi7nginx:standard

请用中文进行原生语言的改写,只需提供一个选项:
“Can you please pass me the salt?”
“你可以帮我递一下盐吗?”

然后,使用Dockerfile创建镜像并启动容器。

$ vi dockerfile
-------ファイル内容----------
FROM registry.access.redhat.com/ubi7/ubi:7.8
RUN { \
      echo '[nginx-stable]'; \
      echo 'name=nginx stable repo'; \
      echo 'baseurl=http://nginx.org/packages/centos/$releasever/$basearch/'; \
      echo 'gpgcheck=1'; \
      echo 'enabled=1'; \
      echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
      echo 'module_hotfixes=true'; \
      echo ''; \
      echo '[nginx-mainline]'; \
      echo 'name=nginx mainline repo'; \
      echo 'baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/'; \
      echo 'gpgcheck=1'; \
      echo 'enabled=0'; \
      echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
      echo 'module_hotfixes=true'; \
    }  > /etc/yum.repos.d/nginx.repo
RUN yum install -y --disableplugin=subscription-manager nginx && yum clean all
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
-----------------------------
$ docker build -t ubi7nginx:standard .
docker container run -d --name ubi7nginx -p 80:80 ubi7nginx:standard

确认可以通过浏览器显示。

http://xxxx.xxxx.xxx   ※EC2のパブリックDNS or パブリックIPv4
image.png

因为确认了动作,所以进行清理工作。删除已经创建的容器和镜像。

$ docker container rm -f $(docker container ls -qa)
$ docker image rm ubi7nginx:standard

请使用中文将以下句子进行翻译,只需要一个选项:
请提供中文翻译。

使用UBI7(Init),将Nginx安装到容器并启动(通过systemd启动Nginx)。

先试着不使用Dockerfile创建镜像。

$ docker container run -it --name ubi7 registry.access.redhat.com/ubi7/ubi-init:7.8 /bin/bash
# yum install yum-utils
# vi /etc/yum.repos.d/nginx.repo
------下記内容で保存-----
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
--------------------
# yum install -y --disableplugin=subscription-manager nginx
# yum clean all
# systemctl enable nginx.service
# exit
$ docker container commit -c 'CMD ["/sbin/init"]' ubi7 ubi7nginx:systemd
docker run --name ubi7nginx -p 80:80 -d --privileged ubi7nginx:systemd

如果不加上 –privileged 参数,nginx 将无法启动。
试着在没有 –privileged 参数下启动并检查容器内部的进程。

# ps -ef
用户ID 进程ID 父进程ID CPU占用率 启动时间 终端 运行时长 命令
root 1 0 0 22:05 ? 00:00:00 /sbin/init
root 6 0 6 22:07 pts/0 00:00:00 /bin/bash
root 19 6 0 22:07 pts/0 00:00:00 ps -ef

果然,没有nginx。
尝试使用systemctl status查看状态也会出错。

systemctl status nginx.service出现问题,请获取D-Bus连接失败:操作不允许。

搜索错误消息会出现建议在容器启动时加上 –privileged。虽然需要进一步调查详情,但是暂时加上可以顺利进行下一步操作。

确认在浏览器中能够显示。

http://xxxx.xxxx.xxx   ※EC2のパブリックDNS or パブリックIPv4
image.png

确认动作完成后进行清理。删除创建的容器和镜像。

$ docker container rm -f $(docker container ls -qa)
$ docker image rm ubi7nginx:systemd

请帮我将以下句子的中文翻译得更精准地些,只需要一种版本:

“Can you please write down your name in Chinese characters?”
“你可以请写下你的名字用汉字吗?”

使用Dockerfile创建镜像并启动容器

$ vi dockerfile
-------ファイル内容----------
FROM registry.access.redhat.com/ubi7/ubi-init:7.8
RUN { \
      echo '[nginx-stable]'; \
      echo 'name=nginx stable repo'; \
      echo 'baseurl=http://nginx.org/packages/centos/$releasever/$basearch/'; \
      echo 'gpgcheck=1'; \
      echo 'enabled=1'; \
      echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
      echo 'module_hotfixes=true'; \
      echo ''; \
      echo '[nginx-mainline]'; \
      echo 'name=nginx mainline repo'; \
      echo 'baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/'; \
      echo 'gpgcheck=1'; \
      echo 'enabled=0'; \
      echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
      echo 'module_hotfixes=true'; \
    }  > /etc/yum.repos.d/nginx.repo
RUN yum install -y --disableplugin=subscription-manager nginx && yum clean all
RUN systemctl enable nginx.service;
CMD ["/sbin/init"]
-----------------------------
$ docker build -t ubi7nginx:systemd .
$ docker container run -d --name ubi7nginx -p 80:80 --privileged ubi7nginx:systemd

确认能够在浏览器中显示。

http://xxxx.xxxx.xxx   ※EC2のパブリックDNS or パブリックIPv4
image.png

因为确认了操作,所以要进行清理工作。删除创建的容器和镜像。

$ docker container rm -f $(docker container ls -qa)
$ docker image rm ubi7nginx:systemd

请用中文把以下句子进行简洁的重述:

我参考了一个网站。

・创建RHEL8+nginx镜像
・比较docker容器/镜像命令的新旧版本
・Docker nginx容器立即退出的现象
・使用yum clean命令清除缓存、检查和执行更新 – CentOS6
・解决在Docker容器的CentOS7中出现”Failed to get D-Bus connection: Operation not permitted”的方法
・从外部访问容器(端口转发)
・停止和删除所有Docker容器以及删除镜像的一次性操作
・发布可自由分发的基于Red Hat Enterprise Linux 8的容器操作系统镜像”Red Hat Universal Base Image”

以上就是全部了。辛苦了。

广告
将在 10 秒后关闭
bannerAds