Docker 教程

Dockerfile实战:创建Nginx镜像

前面分析了 Nginx 镜像的 Dockerfile,内容还是挺多的。如果我们要创建自己的 Nginx 镜像,完全不需要从头再来,可以站在巨人的肩膀上。我们可以基于现有的 Nginx 镜像进行定制化修改,以满足特定的需求。

需求描述

假如我们有一个静态 HTML 页面,我们想使用 nginx 来部署该页面,并且通过 18080 端口访问。为此,我们需要创建一个自定义的 nginx 镜像,然后使用该镜像启动容器,访问静态页面。

创建 Dockerfile

以下是使用 Dockerfile 构建镜像的步骤:

创建 myNginx 目录

创建一个新的 myNginx 目录,用于存放 Dockerfile 和项目相关文件。如下:

root@hxstrive:~/myNginx# ll
total 20
drwxr-xr-x 2 root root 4096  8月 29 13:13 ./
drwx------ 9 root root 4096  8月 29 13:13 ../
-rw-r--r-- 1 root root  160  8月 29 11:51 default.conf
-rw-r--r-- 1 root root  168  8月 29 13:13 Dockerfile
-rw-r--r-- 1 root root   18  8月 29 11:49 index.html

💢注意,该目录仅有三个文件,一个静态的 index.html 页面,和 default.conf nginx 配置文件,以及 Dockerfile 文件。

创建静态网页

将你的网页文件放置在与Dockerfile相同的目录下(实际项目中通常放在一个目录下),index.html 内容如下:

root@hxstrive:~/myNginx# cat index.html 
<h1>My Nginx</h1>

创建 default.conf 文件

default.conf是 Nginx 的默认配置文件(如果名称不是 default.conf,可能会出问题。因为基础 nginx 镜像会默认在 /etc/nginx/conf.d 目录下面创建一个监听 80 端口的默认文件 default.conf)。我们需要使用我们自定义的 default.conf 文件覆盖默认的 Nginx 配置。例如:

server {
    listen 80;
    server_name localhost;

    location / {
        root   /usr/share/nginx/html/myNginx;
        index  index.html index.htm;
    }
}

创建 Dockerfile 文件

在该目录下创建一个名为Dockerfile的文件,并添加以下内容:

FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /usr/share/nginx/html/myNginx
COPY ./index.html /usr/share/nginx/html/myNginx/index.html

说明:

  • FROM nginx:latest:使用官方的 Nginx 最新镜像作为基础镜像,这样可以避免从头开始构建 Nginx 环境,节省时间和资源。

  • COPY./default.conf /etc/nginx/conf.d/default.conf:将本地目录下的 default.conf 文件复制到容器内的 /etc/nginx/conf.d/ 目录下。这个目录是 Nginx 配置文件的存放位置之一,通过替换默认配置文件或添加新的配置文件,可以对 Nginx 的行为进行定制。例如,可以设置不同的服务器端口、虚拟主机、反向代理规则等。

  • RUN mkdir /usr/share/nginx/html/myNginx:在容器内创建一个新的目录 /usr/share/nginx/html/myNginx。这个目录通常是 Nginx 存放网页文件的位置。

  • COPY./index.html /usr/share/nginx/html/myNginx/index.html:将本地的 index.html 文件复制到新创建的目录中。这样,当 Nginx 启动时,它可以根据配置文件中的设置,将这个网页文件提供给客户端访问。

构建镜像

在 myNginx 目录下执行命令来构建镜像:

root@hxstrive:~/myNginx# docker build -t mynginx .
[+] Building 1.0s (9/9) FINISHED                                                                              docker:default
 => [internal] load build definition from Dockerfile                                                                    0.0s
 => => transferring dockerfile: 207B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                         0.0s
 => [internal] load .dockerignore                                                                                       0.0s
 => => transferring context: 2B                                                                                         0.0s
 => CACHED [1/4] FROM docker.io/library/nginx:latest                                                                    0.0s
 => [internal] load build context                                                                                       0.0s
 => => transferring context: 230B                                                                                       0.0s
 => [2/4] COPY ./default.conf /etc/nginx/conf.d/default.conf                                                            0.1s
 => [3/4] RUN mkdir /usr/share/nginx/html/myNginx                                                                       0.3s
 => [4/4] COPY ./index.html /usr/share/nginx/html/myNginx/index.html                                                    0.1s
 => exporting to image                                                                                                  0.2s
 => => exporting layers                                                                                                 0.1s
 => => writing image sha256:65f6c7f25df344794bcdba2ba023d22ada39fa5d1e2cfc138210aaf0e5c55bb1                            0.0s
 => => naming to docker.io/library/mynginx                                                                              0.0s

root@hxstrive:~/myNginx# docker images | grep mynginx
mynginx      latest    65f6c7f25df3   14 seconds ago   188MB

注意:

(1)新构建的镜像名称一定要全部小写,否则会抛错,这是 docker 的硬性要求。

(2)请在 Dockerfile 文件所在的目录下面执行 docker build 指令,当然,也可以将末尾的点号去掉,指定路径来设置构建路径。

启动容器

镜像构建完成后,可以使用以下命令运行容器:

root@hxstrive:~/myNginx# docker run --name mynginx -d -p 18080:80 mynginx
ee745c447885b0445dc49dda7192b1bceed2cd13f4f5951c02969dac5e6d97e0

root@hxstrive:~/myNginx# docker ps | grep mynginx
ee745c447885   mynginx   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   0.0.0.0:18080->80/tcp, :::18080->80/tcp                mynginx

上面命令将在后台运行 mynginx 容器,并将容器的 80 端口映射到宿主机的 18080 端口。

现在,你可以在浏览器中访问 http://宿主机IP:18080  来查看你的 Nginx 服务。你将会看见自定义的 index.html 文件:

6a970063aa40a6544feef767efcb5f19_1724913070304-ddb0c009-5e86-4821-b926-79e41a80c4b0.png

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号