制作Dcoker镜像

news2024/11/25 14:46:54

文章目录

    • 一、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 -->官网验证即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

气膜建筑:无硬件支撑的奇迹—轻空间

气膜建筑是一种创新的建筑形式&#xff0c;其独特之处在于其内部没有任何硬件支撑&#xff0c;仅靠空气吹起来。这种技术是如何实现的呢&#xff1f; 气膜结构的原理 气膜建筑的核心在于其充气结构。通过不断向气膜内部充入空气&#xff0c;气膜内部会维持一个较高的气压。这种…

C#根据数据量自动排版标签的样例

这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…

Java基础:基本语法(一)

Java基础&#xff1a;基本语法&#xff08;一&#xff09; 文章目录 Java基础&#xff1a;基本语法&#xff08;一&#xff09;1. 前言2. 开发环境搭建2.1 Java开发工具包下载2.2 环境变量配置2.3 Java程序的运行过程 3. 数据类型3.1 基本数据类型3.2 引用数据类型 4. 常量与变…

深度学习中文笔记.pdf

深度学习和机器学习应该如何入门呢&#xff1f;这是很多初学者经常提的问题&#xff0c;针对这个问题&#xff0c;相信很多过来人都会推荐吴恩达的在线课程。不过&#xff0c;由于是英文版本&#xff0c;就将很多人挡在了门外。 于是&#xff0c;在国内&#xff0c;以黄海广博士…

发现一个可以白嫖GPU的平台

网址 https://platform.virtaicloud.com/gemini_web/auth/register?inviteCodeb0322161368ead7f49716688486796dd 驱动云注册有100点的算力点&#xff0c;目前最便宜的机器大概是0.49算力点每小时&#xff0c;安装个sd或者简单学习训练数据的话&#xff0c;应该能用挺久的。…

K8s 小白入门|从电影配乐谈起,聊聊容器编排和 K8s

来听听音乐 电影&#xff0c;是我们生活中的重要调味剂。 配乐&#xff0c;是电影中不可或缺的一部分。 有的时候&#xff0c;配乐可以跟剧情共振&#xff0c;让你按捺不住自己的情绪&#xff0c;或眼含热泪、或慷慨激昂、或人仰马翻、或怅然若失&#xff1b; 有的时候&…

探索研究大语言在生物识别技术——使用ChatGP-4从完成从人脸识别到年龄估计

0.引言 论文提出以下几要点&#xff1a; &#xff08;1&#xff09;. 人脸识别、性别检测和年龄估计的性能评估&#xff1a; 进行了一项研究&#xff0c;使用GPT-4这样的大型语言模型来处理人脸识别、性别检测和年龄估计等任务。这些任务是生物识别技术中的常见应用&#xff…

深入分析 Android Activity (十)

文章目录 深入分析 Android Activity (十)1. Activity 的资源管理1.1 使用资源 ID 访问资源1.2 Drawable 资源1.3 使用 TypedArray 管理资源1.4 使用资源配置 2. Activity 的数据存储2.1 SharedPreferences2.2 文件存储2.3 SQLite 数据库2.4 ContentProvider 3. Activity 的性能…

生产者延迟消息和重试机制

messageDelayLevel1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 延迟消息级别public PutMessageResult putMessage(final MessageExtBrokerInner msg) {//事务消息处理if (tranType MessageSysFlag.TRANSACTION_NOT_TYPE|| tranType MessageSysFlag.TRANSACT…

基于高光谱数据集的创新点实现-高斯核函数卷积神经网络

一、高光谱数据集简介 1.1 数据集简介 数据集链接在这:高光谱数据集(.mat.csv)-科研学术 数据集包含下面三个文件&#xff1a; 文件中包含.mat与.csv,145x145x220, 其实主要使用avirissub.csv文件&#xff0c;在代码上只是将mat文件转成了csv文件。具体avirissub.csv如下&am…

算法学习笔记(7.1)-贪心算法(分数背包问题)

##问题描述 给定 &#x1d45b; 个物品&#xff0c;第 &#x1d456; 个物品的重量为 &#x1d464;&#x1d454;&#x1d461;[&#x1d456;−1]、价值为 &#x1d463;&#x1d44e;&#x1d459;[&#x1d456;−1] &#xff0c;和一个容量为 &#x1d450;&#x1d44e;&…

【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)

目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate&#xff08;预选策略&#xff09; 常见的算法 2.2priorities&#xff08;优选策略&#xff09;常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…

白酒:传统产区的创新之路与品牌重塑

云仓酒庄豪迈白酒作为传统产区的品牌&#xff0c;面临着市场需求的不断变化和消费者口味的多样化。为了保持品牌竞争力和市场地位&#xff0c;传统产区需要不断创新和重塑品牌形象&#xff0c;以满足消费者的需求和期望。 首先&#xff0c;传统产区需要注重产品的品质和口感。品…

Owinps静态IP代理:跨境电商的优选解决方案

在快速发展的电子商务领域&#xff0c;尤其是跨境电商行业&#xff0c;网络的稳定性和安全性是成功经营的关键因素之一。在这背后&#xff0c;少不得一个重要的跨境电商工具——代理IP&#xff0c;而这其中&#xff0c;静态IP因其独特的稳定性和安全性&#xff0c;正逐渐成为众…

IC开发——Ubuntu安装VCS2018

1. 简介 VCS是一种常用的Verilog仿真和综合工具&#xff0c;由Synopsys公司开发。它提供了一个完整的设计验证环境&#xff0c;用于验证硬件设计的正确性和性能。以下是VCS工具的一些主要特点和功能&#xff1a; 仿真功能&#xff1a;VCS支持基于事件驱动的数字电路级仿真&am…

MySQL学习——连接服务器和输入查询

MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;后来被Oracle公司收购。它使用SQL&#xff08;结构化查询语言&#xff09;作为访问和操作数据库的标准语言。 要查看 mysql 客户端程序提供的选项列表&a…

合约的值类型

基本数据类型&#xff1a;整数、枚举、布尔&#xff08;类似java的数据类型&#xff09;Address、Contract&#xff08;这两种是solidity特有的数据类型&#xff09;Fixed byte array&#xff08;定长字节数组&#xff09; Integer(int/uint) int/uint 以8位字节递增&#xf…

硬盘有EFI分区格式化不了,也删不了怎么办,不能读取磁盘

问题&#xff1a;EFI为系统引导分区表明这是一块系统盘&#xff0c;常规操作无法格式化也无法删除&#xff0c;也不能读取 解决&#xff1a; 1.管理员运行cmd 2.输入diskpart 3.输入list disk 查看系统磁盘&#xff0c;并找到你格式化不了的那块磁盘 4.select disk 编号 选择…

【Go专家编程——并发控制——三剑客】

并发控制 我们考虑这么一种场景&#xff0c;协程在A执行过程中需要创建子协程A1、A2、A3…An&#xff0c;协程创建完子协程后就等待子协程退出。 针对这种场景&#xff0c;Go提供了三种解决方案&#xff1a; Channel&#xff1a;使用channel控制子协程 优点&#xff1a;实现…

【稳定检索】2024年核能科学与材料、物理应用国际会议(NESMPA 2024)

2024年核能科学与材料、物理应用国际会议 2024 International Conference on Nuclear Energy Science and Materials, Physical Applications 【1】会议简介 2024年核能科学与材料、物理应用国际会议即将拉开帷幕&#xff0c;这是一场汇聚全球核能科学、材料研究及物理应用领域…