制作Dcoker镜像

文章目录

    • 一、Docker构建镜像的原理
      • 1、镜像分层原理
      • 2、Docker的镜像结构
      • 3、分层存储原理
      • 4、构建命令与层的关系
      • 5、最终镜像的创建
    • 二、docker commit 构建镜像
      • 1、使用场景
      • 2、手动制作yum版的nginx镜像
        • 2.1、启动一个centos容器,安装好常用的软件以及nginx
        • 2.2、关闭nginx后台运行
        • 2.3、自定义web页面
        • 2.4、提交为镜像
        • 2.5、从自己的镜像启动容器
    • 三、DockerFile
      • 1、什么是DockerFile
      • 2、DockerFile构建镜像过程
    • 四、DockerFile的常用指令
      • 1、FROM
        • 1.1、指令格式
        • 1.2、示例
      • 2、ARG
        • 2.1、指令格式
        • 2.2、作用域
        • 2.3、预定义ARG
        • 2.4、示例
      • 3、LABEL
        • 3.1、指令格式
        • 3.2、示例
        • 3.3、多个标签
        • 3.4、单行多标签
        • 3.5、多行多标签(推荐)
        • 3.6、查看镜像标签
      • 4、EXPOSE
        • 4.1、指令格式
        • 4.2、示例:同时监听TCP和UDP协议的端口
      • 5、ENV
        • 5.1、指令格式
        • 5.2、示例
        • 5.3、持续性
        • 5.4、注意事项
      • 6、ADD
        • 6.1、指令格式
        • 6.2、选项
        • 6.3、示例
          • 1、通配符匹配
          • 2、相对路径
          • 3、绝对路径
          • 4、特殊字符处理
      • 7、COPY
        • 7.1、指令格式
        • 7.2、选项
        • 7.3、COPY --from
        • 7.4、COPY --chown 和 COPY --chmod
        • 7.5、COPY --link
      • 8、USER
        • 8.1、指令格式
        • 8.2、示例
      • 9、WORKDIR
        • 9.1、指令格式
        • 9.2、示例
      • 10、VOLUME
        • 10.1、指令格式
        • 10.2、示例
        • 10.3、注意事项
      • 11、ENTRYPOINT
        • 11.1、指令格式
        • 11.2、示例
      • 12、RUN
        • 12.1、指令格式
        • 12.2、示例:缓存Go包
        • 12.3、示例:缓存apt包
        • 12.4、示例:访问GitLab
      • 13、CMD
        • 13.1、指令格式
        • 13.2、注意事项
    • 五、DockerFile制作镜像(制作nginx镜像)
      • 1、下载centos镜像
      • 2、创建对应目录
      • 3、进入指定目录下载源码包
      • 4、编写DockerFile
        • 4.1、解析
      • 5、构建镜像
      • 6、测试验证
    • 六、镜像上传
      • 1、阿里云仓库
        • 1.1、注册账户
        • 1.2、创建个人版实例
        • 1.3、设置Registry登录密码
        • 1.4、创建镜像仓库
        • 1.5、登录阿里云Docker Registry
        • 1.6、将镜像推送到Registry
      • 2、Docker Hub上传镜像

一、Docker构建镜像的原理

1、镜像分层原理

Docker镜像是由一系列只读的层(layers)组成的,每个层代表了一组文件系统的更改。这些更改可以是添加文件、删除文件、修改文件等操作。镜像的最底层通常是一个基础镜像,比如基于CentOS、Ubuntu、Alpine等操作系统。往上每一层代表了Dockerfile中每个指令的执行结果。重要的是,每一层都是不可变的,一旦创建就不会被修改,新的更改会在其上新建一层。

2、Docker的镜像结构

489206588e3d8b2b61c611f85790f220

docker的分层镜像结构如图所示,镜像的最底层必须是一个启动文件系统(bootfs)的镜像层。bootfs的上层镜像称为根镜像(rootfs)或者基础镜像(Base Image),它一般是操作系统,比如centos、debian或者Ubuntu。

用户的镜像必须构建在基础镜像之上。如图所示,emacs镜像层就是在基础镜像上安装emacs创建出来的镜像,在此基础上安装apache又创建了新的镜像层。利用这个新的镜像层启动的容器里运行的是一个已经安装好emacs和apache的Debian系统。

3、分层存储原理

Docker镜像采用UnionFS(联合文件系统,如AUFS、OverlayFS等)实现分层存储。UnionFS允许将多个文件系统层次叠加以形成一个单一的合并视图。对于Docker镜像来说,每个层都是只读的,除了最顶层的可写层(在容器运行时创建)。

  • 基础层:通常是操作系统层,包含最低级别的文件和库。
  • 中间层:由Dockerfile中的每个指令生成,每个层都是对前一层的增量修改。
  • 读写层(容器层):容器运行时,会在镜像的顶部添加一个可写的层,用于保存容器运行时的所有改动。

4、构建命令与层的关系

  • 在Dockerfile中,每个RUNCOPYADD等指令执行后,都会在现有镜像基础上添加一个新的只读层。
  • 如果指令没有导致文件系统的变化(例如,执行一个检查系统状态的命令但不改变任何文件),Docker可能不会创建新的层。
  • 重复的构建步骤可以通过Docker的缓存机制避免重复执行,从而加速构建过程。

5、最终镜像的创建

构建过程的最后,Docker将所有这些层组合起来,并为这个组合赋予一个唯一的ID,这就是最终的Docker镜像。这个镜像可以被打上标签(tag),便于识别和后续的拉取、推送操作。

二、docker commit 构建镜像

1、使用场景

  • 构建临时的测试镜像;
  • 容器被入侵后,使用docker commit,基于被入侵的容器构建镜像,从而保留现场,方便以后追溯。

2、手动制作yum版的nginx镜像

2.1、启动一个centos容器,安装好常用的软件以及nginx
[root@localhost ~]# docker run -it --name centos-v1 centos:7 bash
[root@95ef0464ffb2 /]# yum install -y epel-release
[root@95ef0464ffb2 /]# yum install -y nginx
[root@95ef0464ffb2 /]# yum install -y wget vim pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
2.2、关闭nginx后台运行
[root@95ef0464ffb2 /]# sed -i '/^pid \/run\/nginx.pid;$/a daemon off;' /etc/nginx/nginx.conf

[root@95ef0464ffb2 /]# egrep -v "^$|^#" /etc/nginx/nginx.conf | head -5
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
daemon off;
2.3、自定义web页面
[root@95ef0464ffb2 /]# echo 'hello yum_nginx' > /usr/share/nginx/html/index.html
2.4、提交为镜像
docker commit -m "my first nginx image v1" centos-v1 centos_nginx:v1

image-20240526175243723

2.5、从自己的镜像启动容器
docker run -d -p 8080:80 --name my_centos_nginx centos_nginx:v1 /usr/sbin/nginx

image-20240526175506018

三、DockerFile

1、什么是DockerFile

DockerFile 是一个用于自动构建 Docker 镜像的文本文件,其中包含了用户可以给出的所有构建镜像所需的指令和参数。

这个文件按照从上至下的顺序定义了一系列构建镜像的步骤,每个指令通常对应于镜像中的一个层。

DockerFile 的设计使得镜像的创建过程高度可编程、可重复及可共享,有利于实现持续集成和持续部署(CI/CD)的工作流程。

2、DockerFile构建镜像过程

1、首先,创建一个目录用于存放应用程序以及构建过程中使用到的各个文件等;
2、然后,在这个目录下创建一个Dockerfile文件,一般建议Dockerfile的文件名就是Dockerfile;
3、编写Dockerfile文件,编写指令,如,使用FROM 指令指定基础镜像,COPY指令复制文件,RUN指令指定要运行的命令,ENV设置环境变量,EXPOSE指定容器要暴露的端口,WORKDIR设置当前工作目录,CMD容器启动时运行命令,等等指令构建镜像;
4、Dockerfile编写完成就可以构建镜像了,使用docker build -t 镜像名:tag . 命令来构建镜像,最后一个点是表示当前目录,docker会默认寻找当前目录下的Dockerfile文件来构建镜像,如果不使用默认,可以使用-f参数来指定dockerfile文件,如:docker build -t 镜像名:tag -f /xx/xxx/Dockerfile
5、使用docker build命令构建之后,docker就会将当前目录下所有的文件发送给docker daemon,顺序执行Dockerfile文件里的指令,在这过程中会生成临时容器,在临时容器里面安装RUN指定的命令,安装成功后,docker底层会使用类似于docker commit命令来将容器保存为镜像,然后删除临时容器,以此类推,一层层的构建镜像,运行临时容器安装软件,直到最后的镜像构建成功。

四、DockerFile的常用指令

官方文档

1、FROM

指定基础镜像,必须为第一个命令

1.1、指令格式
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
  • FROM指令用于指定基础镜像
  • –platform选项可用在FROM多平台镜像的情况下指定平台。例如,linux/amd64、lunux/arm64、windows/amd64。
  • AS name表示为构建阶段命令,在后续FROM和COPY --from=name说明中可以使用这个名词,引用此阶段构建的映像。
  • tag或digest值是可选的。如果您省略其中任何一个,构建器默认使用latest标签。如果找不到指定tag,构建起将返回错误。
  • 为了保证镜像精简,可以选用体积较小的Alpin或Debian作为基础镜像
1.2、示例
ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD  /code/run-app

FROM extras:${CODE_VERSION}
CMD  /code/run-extras

2、ARG

定义创建镜像过程中使用的变量

ARG是唯一可以位于FROM指令之前的指令

2.1、指令格式
ARG <name>[=<default value>]

<name>是变量名,[=<default value>]是可选的默认值。

2.2、作用域

ARG变量的定义从其在Dockerfile中的定义行开始生效,并在构建阶段结束时失效。

要在多个构建阶段使用相同的ARG,每个阶段都需要重新声明ARG。

2.3、预定义ARG

Docker预定义了一系列ARG变量,如HTTP_PROXY、HTTPS_PROXY等,这些可以在构建时不需在Dockerfile中声明,直接通过命令行的--build-arg使用。

2.4、示例
FROM busybox
ARG user1
ARG buildno=1

在这个例子中,user1没有默认值,而buildno的默认值是1。

3、LABEL

为生成的镜像添加元数据标签信息

这些元数据以键值对的形式存在

3.1、指令格式
LABEL <key>=<value> <key>=<value> <key>=<value> ...
  • 键(key):应当是唯一的标识符,用于描述标签的内容类别。
  • 值(value):与键相关联的具体数据内容,可以包含任何字符串,包括空格。如果值中需要包含空格或特殊字符,应使用双引号包围并适当使用转义字符(如\)。
3.2、示例
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
3.3、多个标签

可以在单行或多行上指定多个标签,尽管这样做在Docker 1.10版本后不再减少最终镜像的大小,但仍然是一种组织代码的可选方式

3.4、单行多标签
LABEL multi.label1="value1" multi.label2="value2" other="value3"
3.5、多行多标签(推荐)
LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

使用双引号而非单引号:当值中包含环境变量插值等需要解析的元素时,必须使用双引号,因为单引号会阻止变量展开。

如果基础镜像(即FROM指令指定的镜像)中已经包含了某些标签,那么这些标签会被继承。如果有相同键的标签在新镜像的Dockerfile中被重新定义,那么新定义的值将覆盖原有的值。

3.6、查看镜像标签
docker image inspect --format='{{json .Config.Labels}}' myimage
{
  "com.example.vendor": "ACME Incorporated",
  "com.example.label-with-value": "foo",
  "version": "1.0",
  "description": "This text illustrates that label-values can span multiple lines.",
  "multi.label1": "value1",
  "multi.label2": "value2",
  "other": "value3"
}

4、EXPOSE

声明镜像内服务监听的端口

  • 文档作用EXPOSE主要是为了提供一种文档记录的方式,帮助理解容器设计意图中哪些端口需要被外部访问。它不改变容器的实际行为,也不直接导致端口暴露给宿主机或其他网络服务。
  • TCP与UDP:默认情况下,如果没有指定协议,EXPOSE认为端口使用TCP协议。你也可以明确指定端口为UDP,如EXPOSE 80/udp。若需同时支持TCP和UDP,需分别声明两次:EXPOSE 80/tcpEXPOSE 80/udp
  • 运行时覆盖:尽管Dockerfile中指定了EXPOSE,但在运行容器时,可以通过docker run-p标志灵活地重写这些设置,比如映射到不同的宿主机端口,或者更改协议。
4.1、指令格式
EXPOSE <port> [<port>/<protocol>...]
4.2、示例:同时监听TCP和UDP协议的端口
EXPOSE 80/tcp
EXPOSE 80/udp
docker run -p 80:80/tcp -p 80:80/udp ...

5、ENV

用于设置环境变量

5.1、指令格式
ENV <key>=<value> ...
  • 设置环境变量:允许为后续构建阶段中的所有指令设置环境变量,变量名是<key>,变量值是<value>。这些环境变量可以在后续的RUNCMD等指令中通过引用,支持环境变量替换。
  • 嵌套解析:环境变量的值可以包含或引用其他环境变量,并且支持使用引号和反斜杠来包含空格或特殊字符,但引号会被移除,除非转义。
5.2、示例
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
    MY_CAT=fluffy
    
#批量设置
5.3、持续性
  • 持久化:通过ENV设置的环境变量不仅在构建阶段有效,还会保留在从该镜像创建的容器中。你可以使用docker inspect查看这些值,通过docker run --env <key>=<value>来覆盖它们。
  • 继承性:在多阶段构建中,子阶段会继承父阶段设置的环境变量。
5.4、注意事项
  • 副作用:环境变量的持久性可能导致意料之外的行为变化。例如,设置DEBIAN_FRONTEND=noninteractive会改变apt-get的行为,可能给镜像的使用者带来混淆。

  • 构建时使用:如果环境变量只在构建过程中需要,而在最终镜像中不需要,可以考虑在单独的命令中设置,如:

    RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
    
  • 使用ARG:或者,可以使用ARG指令来设置构建时的变量,这些变量不会保存在最终的镜像中。

6、ADD

用于将文件、目录或远程文件URL添加到镜像的文件系统中

6.1、指令格式
ADD [OPTIONS] <src> ... <dest>
ADD [OPTIONS] ["<src>", "<dest>"]
  • <src>可以是本地路径、通配文件、目录或URL。支持通配符(如*?)。URL要求绝对路径必须指向文件。
  • <dest>目标路径,绝对或相对于当前WORKDIR。指定目录。如果 <dest>结尾是/<src>是URL,Docker会根据URL中的文件名来命名解压,解压后的文件保存在指定的目录中。
6.2、选项

--keep-git-dir: 保留远程Git仓库中的.git目录。

--checksum: 验证资源的校验签。

--chown: 设置文件权限。

--link:硬链接处理。

--exclude:排除模式匹配的文件或目录。

6.3、示例
1、通配符匹配
ADD hom* /mydir/
#添加以"hom"开头的所有文件到mydir目录中

ADD hom?.txt /mydir/
#单字符匹配
2、相对路径

<dest>是相对路径,它会相对于当前的WORKDIR

ADD test.txt relativeDir/
#将test.txt添加到relativeDir内
3、绝对路径

<dest>以斜杠开头,它是绝对路径。

ADD test.txt /absoluteDir/
#将test.txt添加到absoluteDir根目录下
4、特殊字符处理

如果文件名包含如方括号等特殊字符,需要按照Go语言规则转义路径

ADD arr[[]0].txt /mydir/

7、COPY

编写Dockerfile的时候copy宿主机文件到镜像中。

7.1、指令格式
COPY [OPTIONS] <src> ... <dest>
COPY [OPTIONS] ["<src>", ... "<dest>"]
7.2、选项
  • --from=<name>:从之前的构建阶段或指定的镜像中拷贝文件,而非当前构建上下文。
  • --chown=<user>:<group>:设置拷贝文件的用户和组所有权。
  • --chmod=<perms>:设置拷贝文件的权限模式。
  • --link[=<boolean>]:启用链接层机制,使得文件独立于前序层,优化缓存使用。
  • --parents[=<boolean>]:保留源路径中的父目录结构。
  • --exclude=<pattern>:排除符合指定模式的文件或目录
7.3、COPY --from

允许从一个已有的镜像、构建阶段或者其他命名的上下文中复制文件

FROM alpine AS build
COPY . .
RUN apk add clang
RUN clang -o /hello hello.c

FROM scratch
COPY --from=build /hello /

在一个多阶段构建中,可以指定从名为build的构建阶段复制文件

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
#也可以直接从其他镜像复制文件,比如从官方的Nginx镜像中复制配置文件
7.4、COPY --chown 和 COPY --chmod
COPY [--chown=<用户>:<组>] [--chmod=<权限>...] <源路径>... <目标路径>
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
COPY --chown=myuser:mygroup --chmod=644 files* /somedir/
7.5、COPY --link
COPY [--link[=<布尔值>]] <源路径> ... <目标路径>
# syntax=docker/dockerfile:1
FROM alpine
COPY --link /foo /bar

相当于

FROM alpine
# 第一个构建

FROM scratch
COPY /foo /bar
# 第二个构建,并将两个镜像的所有层合并在一起

8、USER

用于设置后续当前构建阶段中默认使用的用户名(或 UID)以及可选的用户组(或 GID)。

如果所指定的用户没有主组,那么镜像(或之后的指令)将会以根组(root group)的身份运行。

8.1、指令格式
USER <user>[:<group>]

USER <UID>[:<GID>]
8.2、示例
FROM microsoft/windowsservercore
# 在容器中创建 Windows 用户
RUN net user /add patrick
# 为后续指令设置用户 patrick
USER patrick

9、WORKDIR

用于为 Dockerfile 中随后的 RUN, CMD, ENTRYPOINT, COPY, 和 ADD 指令设置工作目录。

如果指定的工作目录不存在,即使之后的 Dockerfile 指令未使用到它,也会被创建。

9.1、指令格式
WORKDIR /path/to/workdir
9.2、示例
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

Dockerfile 中可以多次使用 WORKDIR 指令。如果给出的是相对路径,它将是相对于前一个 WORKDIR 指令的路径。

最后的 pwd 命令的输出将是 /a/b/c

10、VOLUME

创建一个数据卷挂载点

10.1、指令格式
VOLUME ["/data"]
10.2、示例
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

这个 Dockerfile 将生成一个镜像,使得执行 docker run 时会在 /myvol 创建一个新的挂载点,并将 greeting 文件复制到新创建的卷里。

10.3、注意事项
  • 在基于 Windows 的容器上,容器内卷的目标必须是:
    • 一个不存在或为空的目录
    • 除了 C: 以外的其他驱动器
  • 若在 Dockerfile 中声明卷后,有任何构建步骤修改了卷内的数据,这些更改将会被丢弃。
  • 列表解析遵循 JSON 数组格式。你需要使用双引号(")而不是单引号(')来包围文本。
  • 宿主机目录是在容器运行时声明的:由于宿主机目录(即挂载点)依附于特定宿主机,为了保持镜像的可移植性(因为无法确保特定的宿主机目录在所有宿主机上都存在),你不能在 Dockerfile 中直接从宿主机挂载目录。VOLUME 指令不支持指定宿主机目录参数。你需要在创建或启动容器时指定挂载点。

11、ENTRYPOINT

指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数

每个DockerFile中只能有一个ENTRYPOINT,当指定多个时只有最后一个起效

11.1、指令格式
ENTRYPOINT ["executable", "param1", "param2"]
#exec形式

ENTRYPOINT command param1 param2
#shell形式
11.2、示例
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

当你运行这个容器时,可以看到top是唯一的进程:

docker run -it --rm --name test top -H

12、RUN

运行指定命令

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像层

当命令较长时可以使用\来换行

12.1、指令格式
RUN [OPTIONS] <command> ...
#shell形式

RUN [OPTIONS] [ "<command>", ... ]
#exec形式
12.2、示例:缓存Go包
# syntax=docker/dockerfile:1
FROM golang
RUN --mount=type=cache,target=/root/.cache/go-build \
  go build ...
12.3、示例:缓存apt包
# syntax=docker/dockerfile:1
FROM ubuntu
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
  --mount=type=cache,target=/var/lib/apt,sharing=locked \
  apt update && apt-get --no-install-recommends install -y gcc
12.4、示例:访问GitLab
# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache openssh-client
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh \
  ssh -q -T git@gitlab.com 2>&1 | tee /hello
# "Welcome to GitLab, @GITLAB_USERNAME_ASSOCIATED_WITH_SSHKEY" should be printed here
# with the type of build progress is defined as `plain`.
eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
docker buildx build --ssh default=$SSH_AUTH_SOCK .

13、CMD

CMD指令用来指定启动容器时默认执行的命令

13.1、指令格式
CMD ["executable","param1","param2"]
#相当于执行executable param1 param2

CMD ["param1","param2"]
#提供给ENTRYPOINT的默认参数

CMD command param1 param2
#在默认的shell中执行,提供给需要交互的应用

每个Dockerfile 只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行

13.2、注意事项

如果使用CMDENTRYPOINT指令提供默认参数,那么CMDENTRYPOINT指令都应该以exec形式指定。

RUN实际上运行一个命令并提交结果;CMD在构建时不执行任何操作,但指定了镜像的预期命令。

五、DockerFile制作镜像(制作nginx镜像)

1、下载centos镜像

docker pull centos:7

2、创建对应目录

mkdir -pv dockerfile/{web/{nginx,apache},system/{centos,ubuntu}}

image-20240528231449034

3、进入指定目录下载源码包

[root@localhost ~]# cd dockerfile/web/nginx/
[root@localhost nginx]# pwd
/root/dockerfile/web/nginx
[root@localhost nginx]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
[root@localhost nginx]# ls
nginx-1.20.1.tar.gz

4、编写DockerFile

[root@localhost nginx]# vim Dockerfile

FROM centos:7

MAINTAINER misakivv 2830909671@qq.com

RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop

ADD nginx-1.20.1.tar.gz /usr/local/src/

RUN cd /usr/local/src/nginx-1.20.1 \
&& ./configure --prefix=/usr/local/nginx --with-http_sub_module \
&& make \
&& make install \
&& cd /usr/local/nginx

# ADD nginx.conf /usr/local/nginx/conf/nginx.conf

RUN useradd -s /sbin/nologin nginx \
&& ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx \
&& echo 'test nginx !' > /usr/local/nginx/html/index.html

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]
4.1、解析
  1. FROM centos:7: 基于CentOS 7镜像来创建新的Docker镜像。这是构建过程的起点。
  2. MAINTAINER misakivv 2830909671@qq.com: 指定维护者的信息,包括姓名(或昵称)和联系方式。不过,这个指令在Dockerfile最佳实践中已不再推荐使用,建议使用LABEL替代以提供更多元数据信息。
  3. RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop: 安装一系列必要的软件包,包括开发工具、编译器、Nginx依赖库等,-y参数表示自动确认安装过程中的所有提示。
  4. ADD nginx-1.20.1.tar.gz /usr/local/src/: 将当前目录下的nginx-1.20.1.tar.gz文件添加到容器的/usr/local/src/目录中。
  5. 接下来的几行命令是在容器内编译并安装Nginx:
    • cd /usr/local/src/nginx-1.20.1: 进入刚刚解压的Nginx源代码目录。
    • ./configure --prefix=/usr/local/nginx --with-http_sub_module: 配置Nginx,指定安装路径为/usr/local/nginx,并启用http_sub_module模块,该模块用于字符串替换,增强URL重写能力。
    • make && make install: 编译并安装Nginx。
    • cd /usr/local/nginx: 回到Nginx的安装目录。
  6. 注释掉的# ADD nginx.conf /usr/local/nginx/conf/nginx.conf行原本打算将自定义的nginx配置文件复制到Nginx配置目录,但已被注释,意味着使用Nginx默认配置。
  7. RUN useradd -s /sbin/nologin nginx: 创建一个名为nginx的系统用户,并且该用户不能登录(-s /sbin/nologin)。
  8. && ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx: 创建一个软链接,使得可以从系统的标准路径调用Nginx可执行文件。
  9. && echo 'test nginx !' > /usr/local/nginx/html/index.html: 在Nginx的默认网页目录创建一个简单的测试索引页。
  10. EXPOSE 80 443: 声明容器运行时需要监听的端口,分别是HTTP(80)和HTTPS(443)端口。
  11. CMD ["nginx", "-g", "daemon off;"]: 设置容器启动时执行的命令,这里是以非守护进程模式启动Nginx,方便直接查看输出和进行调试。

5、构建镜像

[root@localhost nginx]# docker build -t nginx:v1 .
[root@localhost nginx]# docker images | grep v1
nginx        v1        e5d32f022cdc   56 seconds ago   650MB

image-20240528232421939

6、测试验证

[root@localhost nginx]# docker run -itd -p 8088:80 nginx:v1
0c2810cb9b168890b59264a1990dcc5b5e8782e337a757c99d42dc061cb08a7c

image-20240528232551175

六、镜像上传

1、阿里云仓库

阿里云容器镜像服务

1.1、注册账户

image-20240529090130985

1.2、创建个人版实例
image-20240529090213618
image-20240529090253777
1.3、设置Registry登录密码

image-20240529090420788

1.4、创建镜像仓库
image-20240529090713347
image-20240529091119916
image-20240529091246114
1.5、登录阿里云Docker Registry
docker login --username=misaki0 registry.cn-hangzhou.aliyuncs.com

image-20240529091435645

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

1.6、将镜像推送到Registry
docker tag nginx:v1 registry.cn-hangzhou.aliyuncs.com/misaki_nginx/my_nginx:v1
#将本地nginx:v1镜像创建标签并归属到阿里云镜像服务的指定仓库中
docker push registry.cn-hangzhou.aliyuncs.com/misaki_nginx/my_nginx:v1
#将重新标记的镜像推送到阿里云的容器镜像仓库中

image-20240529092258256

image-20240529092901705

2、Docker Hub上传镜像

目前我还没注册,暂时写不了这部分的镜像上传

但基本思路还是注册登录账户–> 本地登录仓库–> 给需要上传的镜像tag标签 --> docker push -->官网验证即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用Firebase Hosting来托管网站

文章目录 如何利用Firebase Hosting来托管网站前提条件详细步骤1. 安装 Firebase CLI2. 登录 Firebase3. 初始化 Firebase 项目4. 准备网站文件5. 部署到 Firebase6. 配置自定义域名&#xff08;可选&#xff09; 常见问题 如何利用Firebase Hosting来托管网站 以下是更详细的…

硬盘的分区的类型及创建分区的步骤及交换分区、永久挂载的方法

业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;以及硬盘的作用。 硬盘&#xff1a;计算机的存储设备&#xff0c;一个或者多个带磁性的盘组成&#xff0c;可以在盘片上进行数据的读写 连接方式&#xff1a;内部设备 外部设备&#xff08;移…

linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除

linux服务器长期使用宝塔自带计划任务&#xff0c;计划任务执行记录占用服务器空间过大&#xff0c;导致服务器根目录爆满&#xff0c;需要长期排查并删除 /www/server/cron 占用空间过大问题处理 /www/server/cron是什么内容&#xff1f;/www/server/cron是否可以删除&#xf…

低代码开发与人工智能技术在商品推荐系统中的应用

引言 低代码开发和人工智能技术的背景和重要性 随着数字化转型的深入&#xff0c;企业在信息技术领域面临着前所未有的挑战和机遇。快速变化的市场需求、日益复杂的技术环境以及高度竞争的商业环境&#xff0c;迫使企业不断寻求高效的开发和运营解决方案。低代码开发平台应运而…

【设计模式】JAVA Design Patterns——Dependency Injection(依赖注入模式)

&#x1f50d;目的 依赖注入是一种软件设计模式&#xff0c;其中一个或多个依赖项&#xff08;或服务&#xff09;被注入或通过引用传递到一个依赖对象&#xff08;或客户端&#xff09;中&#xff0c;并成为客户端状态的一部分。该模式将客户的依赖关系的创建与其自身的行为分…

3.Spring Cloud LoadBalancer 入门与使用

3.Spring Cloud LoadBalancer 入门与使用 1.什么是 LoadBalancer?1.1负载均衡分类1.2 常见负载均衡策略 2.为什么要学 LoadBalancer?3.如何使用?4.默认负载均衡策略5.随机负载均策略5.1 创建随机负载均衡器5.2 设置随机负载均衡器 (局部设置)5.3 设置全局负载均衡器 6.Nacos…

Codeforces Round 946 (Div. 3) A~G

A.Phone Desktop (枚举) 题意&#xff1a; 小 A A A的手机有一个桌面&#xff08;或称启动器&#xff09;。桌面可以由多个屏幕组成。每个屏幕表示为大小为 5 3 5 \times 3 53 的网格&#xff0c;即五行三列。 有 x x x 个应用程序的图标大小为 1 1 1 \times 1 11 个单…

C51单片机开发--库函数

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 目标 内容 开发过程回顾 使用库函数点灯 什么是库函数? 面向库函数和面向寄存器开发 使用delay模块延时 总结 前言 在嵌入式系统开发中&#xff0c;使用库函数是提高开发效率、简化编程的重要手段之一…

学习Uni-app开发小程序Day21

学习了评分组件、自定义导航栏 评分组件uni-rate 这是需要达到的效果图&#xff0c;这里先分析下效果图&#xff0c; 1、图片是从布局中间弹出的&#xff0c;那这里就要用到uni-popup &#xff0c;设置type从中间弹出 2、这个弹出的顶部和上一张的顶部布局是一样的&#xff0c…

Axios的使用简单说明

axios 请求方式和参数 axios 可以发送 ajax 请求&#xff0c;不同的方法可以发送不同的请求: axios.get&#xff1a;发送get请求 axios.post&#xff1a;发送post请求 axios.put&#xff1a;发送put请求 axios.delete&#xff1a;发送delete请求 无论哪种方法&#xff0c;第一…

怎么使用Stable diffusion中的models

Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model&#xff0c;是预先训练好的Stable diffusion权重&#xff0c;用于生成特定风格的图像。模型生成的图像类型取决于训练图像。 如果训练数据中从未出现过猫的图像&#xff0c;模型就无法生成猫的…

应急响应-网页篡改-典型处置案例

内部系统主页被篡改 事件背景 2019年11月13日&#xff0c;某单位发现其内部系统的主页被篡改&#xff0c;应急响应工程师到达现场后对被入侵服务器进行检查&#xff0c;发现对方采用某开源CMS和第三方phpstudy进行环境部署。由于phpstudy默认不开启Web日志记录&#xff0c;因…

【Pandas】深入解析`pd.read_json()`函数

【Pandas】深入解析pd.read_json()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#x…

SQL面试题练习 —— 计算次日留存率

题目 现有用户登录记录表&#xff0c;已经按照用户日期进行去重处理。以用户登录的最早日期作为新增日期&#xff0c;请计算次日留存率是多少。 样例数据 ----------------------- | user_id | login_date | ----------------------- | aaa | 2023-12-01 | | bbb …

负载箱:充电桩测试利器

随着新能源汽车的普及&#xff0c;充电桩的需求也在不断增长。为了保证充电桩的安全、稳定和高效运行&#xff0c;对其进行严格的测试是必不可少的。在这个过程中&#xff0c;负载箱就成为了充电桩测试的重要工具。 负载箱模拟电动汽车充电的设备&#xff0c;它可以模拟真实的充…

轻兔推荐 —— 一个好用的软件服务推荐平台

给大家推荐一个好用的的软件服务推荐平台&#xff1a;轻兔推荐 网站界面简洁大方&#xff0c;没有太多杂七杂八的功能和页面&#xff0c;有明暗主题色可以选择&#xff0c;默认为亮色&#xff0c;可在网站上方手动切换。 每工作日都会推荐一款软件&#xff0c;有时会加更&…

高铁Wifi是如何接入的?

使用PC端的朋友&#xff0c;请将页面缩小到最小比例&#xff0c;阅读最佳&#xff01; 在飞驰的高铁上&#xff0c;除了窗外一闪而过的风景&#xff0c;你是否好奇过&#xff0c;高铁Wifi信号如何连接的呢&#xff1f; 远动的火车可不能连接光纤吧&#xff0c;难道是连接的卫星…

深入理解python列表遍历:两种方法详解与实例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、使用索引遍历列表 三、直接使用元素遍历列表 四、总结 一、引言 在编程过程…

python-数据可视化(总)

python-数据可视化 ** 数据可视化 指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…

智慧冶金:TSINGSEE青犀AI+视频技术助力打造高效、安全的生产环境

一、建设背景 冶金行业因其特殊的生产环境和工艺要求&#xff0c;对安全生产、环境保护以及质量监控等方面有着极高的要求。因此&#xff0c;将视频智能监控技术引入冶金行业&#xff0c;不仅有助于提升生产效率&#xff0c;更能有效保障生产安全&#xff0c;降低事故风险。 …