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>
可以看到访问成功了。这样构建就算完成了。