【docker集群应用】Dockerfile相关操作命令及案例并搭建本地私有仓库
文章目录
- Dockerfile操作常用的指令
- 1. FROM 镜像
- 2. MAINTAINER 名字
- 3. RUN 命令
- 4. ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]
- 5. CMD ["要运行的程序", "参数1", "参数2"]
- 6. EXPOSE 端口号
- 7. ENV 环境变量=变量值 ...
- 8. ADD 源文件/目录 目标文件/目录
- 9. COPY 源文件/目录 目标文件/目录
- 10. VOLUME ["目录"]
- 11. USER 用户名/UID[:组名/GID]
- 12. WORKDIR 路径
- 13. ONBUILD 命令
- 14. LABEL `<key>=<value> ...`
- 15. ARG <变量名>[=<默认值>]
- 16. HEALTHCHECK 选项 CMD 命令
- 其他
- Dockerfile 案例
- 搭建本地私有仓库
Dockerfile操作常用的指令
在编写 Dockerfile 时,有严格的格式需要遵循:
●第一行必须使用 FROM 指令指明所基于的镜像名称;
●之后使用 MAINTAINER 指令说明维护该镜像的用户信息;
●然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
●最后使用 CMD 指令指定启动容器时要运行的命令操作。
1. FROM 镜像
指定新镜像所基于的基础镜像。
- 格式
FROM <image>[:<tag>]
或
FROM <image>@<digest>
- 示例:
FROM ubuntu:20.04
- 注意:Dockerfile 的第一条指令必须是 FROM。
2. MAINTAINER 名字
说明新镜像的维护人信息(LABEL 指令)。
- 格式:
MAINTAINER <name>
- 示例
MAINTAINER "John Doe <john.doe@example.com>"
- 注意:建议使用 LABEL 指令来替代 MAINTAINER,因为 LABEL 提供了更丰富的元数据支持。
3. RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中。
- 格式:
RUN <command>
或
RUN ["executable", "param1", "param2"]
- 示例
RUN apt-get update && apt-get install -y nginx
- 注意:RUN 指令会创建镜像的一个新层,因此应尽量减少使用次数以提高镜像效率。
4. ENTRYPOINT [“要运行的程序”, “参数 1”, “参数 2”]
设定容器启动时第一个运行的命令及其参数。
- 格式:
ENTRYPOINT ["executable", "param1", "param2"]
或
ENTRYPOINT command param1 param2
- 示例
-ENTRYPOINT ["python", "-m", "http.server", "8000"]
- 注意:ENTRYPOINT 与 CMD 结合使用时,CMD 的参数会传递给 ENTRYPOINT。
5. CMD [“要运行的程序”, “参数1”, “参数2”]
- 作用:启动容器时默认执行的命令或脚本。
- 格式:
CMD ["executable", "param1", "param2"]
或CMD command param1 param2
(shell 形式) - 示例:
CMD ["echo", "Hello World"]
- 注意:Dockerfile 只能有一条 CMD 指令,且 CMD 会被 docker run 时指定的命令或 ENTRYPOINT 覆盖。
6. EXPOSE 端口号
声明容器运行时监听的端口。
- 格式:
EXPOSE <port> [<port>...]
- 示例:
EXPOSE 80 443
- 注意:EXPOSE 仅仅是声明端口,不会实际映射到宿主机。
7. ENV 环境变量=变量值 …
设置环境变量的值。
- 格式
ENV <key>=<value> [<key>=<value>...]
- 示例
ENV NODE_VERSION 14.17.0
- 注意:ENV 定义的变量在容器内和容器启动时都可用。
8. ADD 源文件/目录 目标文件/目录
将本地文件或 URL 添加到镜像中。
- 格式
ADD <src> <dest>
- 示例
ADD ./myapp /usr/src/app
- 注意:ADD 指令会自动解压 tar 文件,且支持 URL 下载。但出于安全和效率考虑,推荐使用 COPY 指令。
9. COPY 源文件/目录 目标文件/目录
复制本地文件或目录到镜像中。
- 格式
COPY <src> <dest>
- 示例
COPY ./myapp /usr/src/app
- 注意:COPY 指令不支持 URL 下载,但比 ADD 更高效和安全。
10. VOLUME [“目录”]
声明容器内的目录为匿名卷。
- 格式
VOLUME ["<mount_point>"]
- 示例
VOLUME ["/data"]
- 注意:VOLUME 指定的目录在容器运行时会被 Docker 初始化为一个卷,数据不会保存在镜像中。
11. USER 用户名/UID[:组名/GID]
指定后续命令执行的用户和组。
- 格式:
USER <user>[:<group>]
或
USER <uid>[:<gid>]
- 示例
USER nginx
- 注意:用户和用户组必须已经存在。
12. WORKDIR 路径
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录。
- 格式
WORKDIR <dirpath>
- 示例
WORKDIR /app
- 注意:WORKDIR 可以使用相对路径和绝对路径。
13. ONBUILD 命令
当该镜像作为其他镜像的基础镜像时,会执行 ONBUILD 指定的命令。
- 格式
ONBUILD <command>
- 示例
ONBUILD COPY . /app
- 注意:ONBUILD 指令在构建当前镜像时不会执行,而是在基于该镜像构建其他镜像时执行。
14. LABEL <key>=<value> ...
为镜像添加元数据。
- 格式
LABEL <key>=<value> [<key>=<value>...]
- 示例
LABEL maintainer="John Doe <john.doe@example.com>"
- 注意:LABEL 指令替代了 MAINTAINER 指令,提供了更丰富的元数据支持。
15. ARG <变量名>[=<默认值>]
设置构建镜像时指定的变量值。
- 格式:
ARG <name>[=<default value>]
- 示例:
ARG VERSION=1.0
- 注意:ARG 定义的变量仅在构建过程中可用,不会保留在容器内。
16. HEALTHCHECK 选项 CMD 命令
指定监控容器服务运行状态的程序。
- 格式
HEALTHCHECK [OPTIONS] CMD <command>
- 示例
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
- 注意:HEALTHCHECK 指令用于监控容器服务的健康状态,帮助自动重启不健康的容器。
注意
- 格式严格:Dockerfile 的指令必须按照特定的格式编写,且每条指令都会创建一个新的镜像层。
- 优化镜像:尽量减少 RUN 指令的使用次数,合并多条 RUN 指令以减少镜像层数。
- 使用最佳实践:推荐使用 COPY 而不是 ADD,避免不必要的文件解压和 URL 下载。
- 安全性:确保镜像中不包含敏感信息,如密码或密钥。
- 可读性:添加注释和文档以提高 Dockerfile 的可读性。
其他
ADD和COPY的区别?
共同点:都可以将本地的文件或目录复制到镜像里
区别:ADD可以通过URL地址下载文件并复制到镜像里,还能将本地的tar压缩包解压后再复制到镜像里(注:URL下载和tar压缩包解压特性不能同时生效)。COPY没有URL下载和tar压缩包解压的特性。
CMD和ENTRYPOINT的区别?
共同点:都可以用来指定容器的启动命令
区别:ENTRYPOINT指定的容器启动命令优先级更高,如果ENTRYPOINT和CMD同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的命令传入参数使用。
COPY可以在多阶段构建种复制构建结果到当前构建中
容器启动命令的优先级排行
docker run --entrypoint=“命令” > 镜像里的ENTRYPOINT指令指定的"命令" > docker run … 镜像:标签 “命令” > 镜像里的CMD指令指定的"命令"
docker容器的重启策略:
docker run --restart=no|always|no-failure|unless-stopped ....
注释:
no:不管容器是正常退出还是异常退出,都不会重启重启。默认策略。
always:不管容器是正常退出还是异常退出,总是会重启容器。
no-failure:只在容器异常退出时重启容器。no-failure:N 表示容器异常退出时最多重启容器N次
unless-stopped:总是重启容器,但不考虑docker服务端进程启动时就已经处于退出状态的容器
Dockerfile 案例
1. 创建工作目录
mkdir /opt/apache
cd /opt/apache
2. 编写 Dockerfile
# 基于的基础镜像
FROM centos:7
# 维护镜像的用户信息
MAINTAINER this is apache image <wl>
# 镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
# 开启 80 端口
EXPOSE 80
# 复制网站首页文件
ADD index.html /var/www/html/index.html
# 方法一:使用脚本启动 Apache
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
# 方法二:直接使用 Apachectl 启动
# ENTRYPOINT [ "/usr/sbin/apachectl" ]
# CMD ["-D", "FOREGROUND"]
3. 编写 run.sh 脚本
#!/bin/bash
rm -rf /run/httpd/* # 清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND # 指定为前台运行
4. 准备网站页面
echo "this is test web" > index.html
5. 生成镜像
docker build -t httpd:centos . --no-cache
6. 运行容器
docker run -d -p 1216:80 httpd:centos
7. 测试
访问 http://192.168.80.10:1216/
8. 解决网络报错
如果提示 [Warning] IPv4 forwarding is disabled. Networking will not work.
,则进行以下操作:
vim /etc/sysctl.conf
# 添加或修改以下行
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
其它
Dockerfile构建镜像的步骤:
1)编写Dockerfile文件,先用FROM指令指定基础镜像
2)用MAINTAINER或LABEL指令指定镜像的元信息(可选)
3)再用RUN COPY ADD ENV EXPOSE WORKDIR等指令编写操作镜像的过程
4)最后用CMD或ENTRYPOINT指令指定容器启动命令
5)完成Dockerfile编写后,用docker build -t 镜像名:标签 . 命令来构建镜像
如何优化镜像的体积大小?
1)尽可能的使用较小体积的基础镜像(推荐使用 alpine 镜像)
2)尽可能的减少Dockerfile中的指令数量,从而减少镜像的层数(比如使用 ; 或 && 将多条Linux命令拼接在一个RUN指令中)
3)在镜像中安装完软件后添加清空安装软件的缓存或删除软件包文件的命令
4)使用多阶段构建,在最终的镜像中只保留必要的文件
#在第一阶段完成软件安装,生成软件的工作目录和文件
FROM 第一构建阶段的基础镜像 as 阶段别名
…
FROM 第二构建阶段的基础镜像
在第二阶段复制第一阶段的软件目录和文件,并使用它们来运行应用程序,这样最终的镜像中只保留必要的文件
COPY --from=第一构建阶段的别名 第一构建阶段的软件目录或文件 当前阶段的路径
…
CMD或ENTRYPOINT 指定容器启动命令
5)构建镜像使用 docker build --no-cache 选项,表示构建新镜像时禁用缓存,确保每次构建的镜像都是最新的,避免因为缓存导致的问题
6)使用 .dockerignore 文件,指定不需要复制到镜像里的文件名或目录名,防止复制多余的文件到镜像中
7)在镜像里一般只安装单个应用
搭建本地私有仓库
1. 下载 registry 镜像
docker pull registry
2. 配置 Docker daemon
编辑 /etc/docker/daemon.json
文件,添加私有镜像仓库地址:
{
"insecure-registries": ["192.168.80.10:5000"],
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
}
然后重启 Docker 服务:
systemctl restart docker
3. 运行 registry 容器
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
参数解释:
-itd
:在容器中打开一个伪终端进行交互操作,并在后台运行。-v
:绑定宿主机的/data/registry
目录到容器的/var/lib/registry
目录,实现数据持久化。-p
:映射端口,访问宿主机的 5000 端口即访问到 registry 容器的服务。--restart=always
:容器退出时总是重启。--name registry
:创建容器并命名为 registry。registry:latest
:使用拉取的最新 registry 镜像。
4. Docker 容器重启策略
no
:默认策略,容器退出时不重启。on-failure
:容器非正常退出时(退出状态非0)重启。on-failure:3
:容器非正常退出时最多重启3次。always
:容器退出时总是重启。unless-stopped
:容器退出时总是重启,但不考虑在 Docker 守护进程启动时已经停止的容器。
5. 上传镜像到私有仓库
- 为镜像打标签:
docker tag centos:7 192.168.80.10:5000/centos:v1
- 上传镜像:
docker push 192.168.80.10:5000/centos:v1
6. 管理私有仓库镜像
- 列出私有仓库的所有镜像:
curl http://192.168.80.10:5000/v2/_catalog
- 列出私有仓库中 centos 镜像的所有 tag:
curl http://192.168.80.10:5000/v2/centos/tags/list
7. 测试私有仓库下载
- 先删除原有的 centos 镜像:
docker rmi -f <centos-image-id>
- 从私有仓库下载镜像:
docker pull 192.168.80.10:5000/centos:v1
其他
上传镜像到Harbor私有仓库的步骤
1)修改docker配置文件 /etc/docker/daemon.json ,添加配置 “insecure-registries”: [“私有仓库地址”] ,重启docker服务
2)使用docker login 指定私有仓库地址登录
3)使用docker tag 给镜像添加仓库名,格式为 仓库地址/项目名/镜像名:标签
4)使用docker push 推送镜像到私有仓库
用容器运行仓库的好处与坏处
坏处:
1)Docker容器的水平伸缩主要是应用于无状态服务的,而数据库是有状态服务,不方便进行快速扩展。
2)Docker是通过Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。如果其他应用过度占用资源,将会影响容器里 MySQL 的读写效率。
3)当一台主机跑多个容器时,IO就会累加,导致IO瓶颈,也会降低 MySQL 的读写性能。
4)如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器数据如果是通过共享数据卷存放到宿主机里,对宿主机硬件损伤也比较大。
好处:
1)容器部署应用和服务的状态管理都非常的方便快捷。
2)通过将数据库程序与数据进行分离,将数据存放到共享存储里,数据库程序放到容器里。如果容器有异常或 MySQL 服务异常,自动启动一个全新的容器就可恢复。
3)容器具有一定自我修复能力,通过设置容器的重启策略,可以实现自动重启容器恢复状态。
4)还可以通过结合K8S实现有状态服务的快速扩展。
原文地址:https://blog.csdn.net/Karoku/article/details/144074877
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!