自学内容网 自学内容网

Linux下构建OpenEuler22.03+Nginx的Docker镜像

1. 制作OpenEuler22.03的Docker镜像

首先,下载OpenEuler20.03的镜像压缩包:

下载链接为:

https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz

这里我们可以顺便下载一下对应的SHA256校验码:

https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz.sha256sum

使用wget将以上两个东西下载到本地:

wget https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz
wget https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz.sha256sum

下载下来之后是这样的:

先对比一下sha256校验码是否正确:

sha256sum openEuler-docker.x86_64.tar.xz > temp_file

diff temp_file openEuler-docker.x86_64.tar.xz.sha256sum

rm temp_file

若没有显示任何不同则说明校验成功,这个openEuler-docker.x86_64.tar.xz​是一个完整的压缩包。

接着我们就可以运行以下命令,构建OpenEuler22.03的Docker镜像了:

[aderversa@localhost openEuler22.03]$ sudo docker load -i openEuler-docker.x86_64.tar.xz
[sudo] aderversa 的密码:
9ffaa5c81d2b: Loading layer [==================================================>]  220.9MB/220.9MB
Loaded image: openeuler-22.03-lts:latest

[aderversa@localhost openEuler22.03]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
openeuler-22.03-lts   latest              700ab852642b        2 years ago         213MB

2. 使用Dockerfile构建OpenEuler22.03+Nginx的镜像

2.1. 方法1:镜像中编译

使用vim Dockerfile​创建并打开Dockerfile,然后写入下面的内容:

FROM openeuler-22.03-lts:latest

# 默认nginx版本是1.26.2
ARG nginx_version=1.26.2
ENV NGINX_VERSION=nginx_version

ENV LANG en_US.utf8


RUN set -eux; \
    # 安装nginx编译时的依赖库
    yum install -y tar wget openssl-devel pcre-devel zlib-devel gcc make --nobest && \
    # 用于存放nginx的源码和压缩包
    mkdir -p /tmp/nginx && \
    cd /tmp/nginx && \
    # 根据nginx的版本去获取相应的压缩包,因此需要在构建时指定nginx的版本
    # 这要求用户自己去网上查看有哪些版本
    wget https://nginx.org/download/nginx-${nginx_version}.tar.gz && \
    # 这里暂时没有找到一个进行自动化校验nginx的方法,所以没有校验,不能运行就多构建几次吧
    # 解压缩
    tar -zxvf nginx-${nginx_version}.tar.gz && \
    cd nginx-${nginx_version} && \
    # nginx会被默认安装到/usr/local/nginx,
    # 这里是指定编译参数的地方,想要什么自己定义
    ./configure --with-http_ssl_module && \
    # 编译并安装
    make && make install && chmod +x /usr/local/nginx/sbin/nginx && \
    # 因为nginx默认链接静态库,因此原本的库都不需要了
    # 而且这些软件包存在的话会使得镜像的空间很大,白白浪费空间
    yum clean all && \
    yum remove -y tar openssl-devel pcre-devel zlib-devel gcc make --skip-broken && \
    yum autoremove && \
    # 删除压缩包和解压后的文件,都不需要了
    rm -rf /tmp/nginx

EXPOSE 80

CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

接下来只需要运行Docker构建镜像的命令:

sudo docker build -f ./Dockerfile --build-arg nginx_version=1.24.0 -t nginx:1.24.0 .

请注意,这里的nginx_version​是按照nginx官方的版本来的,你可以去:https://nginx.org/en/download.html。查看有哪些版本可以使用。

使用以下命令查看镜像是否构建成功:

[aderversa@localhost ~]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
nginx                 1.24.0              466b3a1aa924        About an hour ago   608MB
nginx                 latest              9bea9f2796e2        7 weeks ago         192MB
openeuler-22.03-lts   latest              700ab852642b        2 years ago         213MB

我们可以看到,相较于从DockerHub上拉取下来的nginx,这种方法构建的nginx似乎内存空间占用非常大。

使用其他Linux发行版作为基础镜像

你也可以试一试使用别的Linux镜像作为基础镜像(只要它支持yum的话),但如果不支持,你可能需要自己改装一下安装方便的命令,比如使用Ubuntu的时候,将:

sudo yum install gcc
# 改成
sudo apt install gcc

怎样做取决于读者自身的需求。

2.2. 方法2:Linux宿主机编译nginx,然后将其放到镜像里面

采用这种方法的好处,我们不再需要在宿主机中安装各种工具,这些工具可能含有依赖,并且一旦安装可能还卸载不干净。这些我们用不到的工具就会白白占用空间。

之所以能够这样做,是因为Nginx默认是静态链接的,这样它不依赖任何动态库。只要内核支持,那么它就能够运行。

为了避免在容器内安装工具,这里我们在宿主机中编译nginx之后,再使用Dockerfile构建镜像。但是这样做的话如果需要对镜像和Linux宿主机的Linux内核版本由要求。但胜在构建出来的镜像空间小,只是在OpenEuler的基础上增加了5MB左右。

并且使用这种方法对基础镜像要求没那么多,可能只是需要一个Linux环境就可以了。因此不使用OpenEuler而使用其他的Linux镜像也是完全没有问题的。

进入某个目录(自己决定),然后vim Dockerfile​,写入以下内容:

FROM openeuler-22.03-lts:latest

# 默认nginx版本是1.26.2
ARG nginx_version=1.26.2
ENV NGINX_VERSION=nginx_version

ENV LANG en_US.utf8

COPY ./nginx /usr/local/nginx

EXPOSE 80

CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

再次vim build_nginx.sh​,写入以下内容:

#!/bin/bash

# 获取第一个命令行参数
nginx_version="$1"
prefix="$2"

echo "${prefix}"

# 检查是否提供了参数
if [ -z ${nginx_version} ]; then
  echo "Usage: $0 <nginx_version> <nginx_path=/usr/local/nginx>"
  exit 1
fi

if [ -z ${prefix} ]; then
  prefix="/usr/local/nginx"
fi

WORKDIR="$PWD"

echo "${nginx_version}"
echo "${prefix}"
echo "${WORKDIR}"

wget https://nginx.org/download/nginx-${nginx_version}.tar.gz

tar -zxvf nginx-${nginx_version}.tar.gz

cd nginx-${nginx_version}

./configure --with-http_ssl_module --prefix=${prefix}

make && make install

mv ${prefix} ${WORKDIR}

cd ${WORKDIR}
docker build -f Dockerfile -t nginx:${nginx_version} .

rm -rf ${WORKDIR}/nginx*

运行命令:

chmod +x build_nginx.sh
sudo ./build_nginx.sh 1.24.0

之后,等待安装完成,该脚本会自动把中间文件删除。如果中间某个命令失败了,那么它也会负责删除这些中间文件。

使用以下命令查看镜像是否构建的镜像:

[aderversa@localhost nginx]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED              SIZE
nginx                 1.24.0              606e9907154f        About a minute ago   218MB
nginx                 latest              9bea9f2796e2        7 weeks ago          192MB
openeuler-22.03-lts   latest              700ab852642b        2 years ago          213MB

可以看到,这下nginx的空间占用终于是小下来了,而不是安装了工具之后的600多MB的SIZE。

3. 启动nginx容器

使用以下命令运行nginx容器:

sudo docker run -d --name nginx-test -p "80:80" nginx:1.24.0

这里1.24.0​是我在构建镜像是指定的版本,可能和你构建的不一样。

查看Linux的IP,然后使用浏览器去访问一下该IP的HTTP服务,看看Nginx容器是否成功运行。

[aderversa@localhost nginx]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:34:c6:ed brd ff:ff:ff:ff:ff:ff
    inet 192.168.137.131/24 brd 192.168.137.255 scope global dynamic noprefixroute ens33
       valid_lft 1709sec preferred_lft 1709sec
    inet6 fe80::88ff:2ec5:a6de:c6/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:75:9b:58:9d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:75ff:fe9b:589d/64 scope link
       valid_lft forever preferred_lft forever

查看ip,发现为:192.168.137.131​,我们直接使用curl​来模拟浏览器访问:

[aderversa@localhost nginx]$ curl http://192.168.137.131
<!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>

可以看到访问成功了。这样构建就算完成了。


原文地址:https://blog.csdn.net/A_zyx0808/article/details/145235968

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!