当前位置: 首页 > article >正文

DockerFile详细学习

目录

1.DockerFile介绍

2.DockerFile常用指令

3.指令详细讲解

4.实例

构建Node-Exporter

构建Alertmanager

构建Mariadb


1.DockerFile介绍

什么是 Dockerfile?

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

2.DockerFile常用指令

FROM

指定基础镜像,用于后续的指令构建

RUN

在构建镜像中执行的命令

CMD

指定创建容器时的默认命令(可以被覆盖)

ENTRYPOINT

设置容器创建时的主要命令(不可以被覆盖)

EXPOSE

声明容器运行时监听的特定网络端口

ENV

在容器内设置环境变量

ADD

将文件或目录远程URL复制到镜像内

COPY

将文件或目录复制到镜像中

VOLUME

为容器创建挂载点或声明卷

WORKDIR

设置后续指令的工作目录

USER

指定后续指令的用户上下文

ARG

定义在构建过程中传递给构建器的变量

3.指令详细讲解

FROM

说明: 指定基础镜像,Docker镜像的构建是从这个基础镜像开始的。它是 Dockerfile 中必须的第一条指令。比如,FROM ubuntu:20.04 指定了使用 Ubuntu 20.04 作为基础镜像。

RUN

说明: 在镜像构建过程中执行命令。常用于安装软件包、配置文件、环境等。比如,RUN apt-get update 会在镜像构建时更新软件包列表。

CMD

说明: 设置容器启动时的默认命令。CMD 只是一个默认值,可以通过 docker run 时指定其他命令来覆盖。如果 CMD 没有指定,容器将无法运行。比如,CMD ["echo", "Hello World"]。

ENTRYPOINT

说明: 设置容器启动时的主命令。与 CMD 不同,ENTRYPOINT 设置的命令不可被覆盖。通常与 CMD 一起使用来指定默认参数。比如,ENTRYPOINT ["python3"] 设置容器启动时执行 python3。

EXPOSE

说明: 声明容器在运行时监听的端口。EXPOSE 不会实际开放端口,而是作为一种文档和提醒用途,用来告知其他开发者容器监听了哪些端口。比如,EXPOSE 8080 声明容器在运行时监听端口 8080。

ENV

说明: 设置环境变量。环境变量可以在容器内使用,常用于配置文件或程序。比如,ENV APP_ENV=production 设置了一个名为 APP_ENV 的环境变量。

ADD

说明: 将文件、目录或远程URL复制到镜像中。除了复制本地文件,还可以解压归档文件,甚至从 URL 下载文件。比如,ADD ./app /usr/src/app 会将本地的 app 目录复制到镜像中的 /usr/src/app。

COPY

说明: 与 ADD 类似,用于将本地文件或目录复制到镜像中。但不同的是,COPY 不会解压归档文件,也不支持从 URL 下载文件。比如,COPY ./app /usr/src/app。

VOLUME

说明: 在容器中创建挂载点,并声明挂载卷。这个指令帮助你在容器和宿主系统或其他容器之间共享数据。比如,VOLUME ["/data"] 创建了一个挂载点,容器的 /data 目录可以作为挂载卷使用。

WORKDIR

说明: 设置后续指令的工作目录。所有后续指令都会在这个目录下执行。如果目录不存在,WORKDIR 会创建它。比如,WORKDIR /app 设置当前工作目录为 /app。

USER

说明: 设置后续指令的用户上下文。可以用来指定某个用户来执行后续的命令或运行容器。比如,USER appuser 指定容器在执行后续指令时使用 appuser 用户。

ARG

说明: 定义在构建过程中传递给构建器的变量。这些变量只能在构建阶段使用,不能在容器运行时使用。可以在 docker build 时通过 --build-arg 传递值。比如,ARG VERSION=1.0 定义了一个变量 VERSION,可以在构建时使用。

4.实例

构建Node-Exporter

编写Dockerfile文件构建exporter镜像,要求基于centos完成Node-Exporter服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)

(1)基础镜像:centos:centos7.9.2009;

(2)使用二进制包node_exporter-0.18.1.linux-amd64.tar.gz安装node-exporter服务;

(3)声明端口:9100;

(4)设置服务开机自启。

请使用docker build命令进行构建镜像monitor-exporter:v1.0并使用 docker run 命令运行该容器。

DockerFile:

#基础镜像
FROM centos:centos7.9.2009
#添加文件并自动解压
ADD node_exporter-0.18.1.linux-amd64.tar.gz /opt/
#将启动命令放在/usr/local/bin下
RUN mv /opt/node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin
#声明端口
EXPOSE 9100
#容器启动命令
CMD ["node_exporter"] 

构建镜像:

[root@docker dockerfile]# docker build -t monitor-exporter:v1.0 -f Dockerfile .

指令最后一个 . 是上下文路径,上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

验证开机自启生效:

[root@docker dockerfile]# docker run -d --name exporter-test monitor-exporter:v1.0 && sleep 5 && docker exec exporter-test ps -aux && docker rm -f exporter-test

36d5abb13c32b8fcfd05e19fb1ffe697fa847ac1d1e0d735f80d7f79a0bc588b

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.3  0.1 114828  8228 ?        Ssl  11:29   0:00 node_exporter

root         10  0.0  0.0  51732  1700 ?        Rs   11:29   0:00 ps -aux

exporter-test

构建Alertmanager

编写Dockerfile文件构建alert镜像,要求基于centos完成Alertmanager服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)

(1)基础镜像:centos:centos7.9.2009

(2)使用提供的二进制包alertmanager-0.19.0.linux-amd64.tar.gz安装Alertmanager服务;

(3)声明端口:9093、9094;

(4)设置服务开机自启。

请使用docker build命令进行构建镜像monitor-alert:v1.0并使用 docker run 命令运行该容器。

DockerFile:

#基础镜像
FROM centos:centos7.9.2009
#工作目录
WORKDIR /usr/local/bin
#将文件复制并解压
COPY alertmanager-0.19.0.linux-amd64.tar.gz . 
RUN tar -xzf alertmanager-0.19.0.linux-amd64.tar.gz && rm -f alertmanager-0.19.0.linux-amd64.tar.gz
#切换了工作木录
WORKDIR /usr/local/bin/alertmanager-0.19.0.linux-amd64
#声明端口
EXPOSE 9093 9094
#容器启动命令
CMD ["./alertmanager"]

构建镜像并查看是否启动:

[root@docker dockerfile]# docker build -t monitor-alert:v1.0 -f Dockerfile .
[root@docker dockerfile]# docker run -d --name alert-test monitor-alert:v1.0 && sleep 5 && docker exec alert-test ps -aux && docker rm -f alert-test
fa503911026354e3b97910fe53039359d945d4d5fc7e8180de0717e2eef4d586
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  1.2  0.2 123152 21024 ?        Ssl  11:46   0:00 ./alertmanager
root         15  0.0  0.0  51732  1704 ?        Rs   11:46   0:00 ps -aux
alert-test

构建Mariadb

编写 Dockerfile-mariadb 文件构建 blog-mysql:v1.0 镜像,要求基于 centos完成MariaDB 服务的安装与配置,并设置服务开机自启。

1)基础镜像:centos:7.9.2009;

2)安装 MariaDB 服务并设置 root 用户的密码为 root;

3)创建数据库 djangoblog 并将 sqlfile.sql 导入该数据库;

4)声明端口:3306;并设置开机自启动。

DockerFile:

FROM centos:centos7.9.2009
#yum源操作
RUN rm -rf /etc/yum.repos.d/*
COPY yum/ /root/yum
COPY yum.repo /etc/yum.repos.d/
# 安装 MariaDB
RUN yum -y install mariadb mariadb-server && yum clean all
# 复制 SQL 文件
COPY sqlfile.sql /root/sqlfile.sql
# 初始化 MariaDB
RUN mysql_install_db --user=root && \
    mysqld_safe --user=root & \
    sleep 8 && \
    mysqladmin -u root password 'root' && \
    mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;" && \
    mysql -uroot -proot -e "CREATE DATABASE djangoblog; USE djangoblog; SOURCE /root/sqlfile.sql;"
# 开放 3306 端口
EXPOSE 3306
# 启动 MariaDB
CMD ["mysqld_safe", "--user=root"]

检查是否可用:

[root@docker dockerfile]# docker run -d --name mariadb-test blog-mysql:v1.0 && sleep 15  && docker exec mariadb-test mysql -uroot -proot -e "use djangoblog;show tables" && docker ps | grep mariadb-test && docker rm -f mariadb-test
bc4e13d1a7555f3a15e5dad5b99390593f594c6fd6dcc16b70d4aa0bf8196e1e
Tables_in_djangoblog
accounts_bloguser
accounts_bloguser_groups
accounts_bloguser_user_permissions
auth_group
auth_group_permissions
auth_permission
blog_article
blog_article_tags
blog_blogsettings
blog_category
blog_links
blog_sidebar
blog_tag
comments_comment
django_admin_log
django_content_type
django_migrations
django_session
django_site
oauth_oauthconfig
oauth_oauthuser
owntracks_owntracklog
servermanager_commands
servermanager_emailsendlog
bc4e13d1a755   blog-mysql:v1.0   "mysqld_safe --user=…"   16 seconds ago   Up 15 seconds   3306/tcp   mariadb-test
mariadb-test


http://www.kler.cn/a/534810.html

相关文章:

  • Python 数据挖掘与机器学习
  • 排序算法--希尔排序
  • neo4j-在Linux中安装neo4j
  • 【多线程】线程池核心数到底如何配置?
  • C++资源管理
  • Unity开发游戏使用XLua的基础
  • C++基础系列【4】C++数据类型
  • 基于 .NET 8.0 gRPC通讯架构设计讲解,客户端+服务端
  • SAM 大模型杂谈
  • DeepSeek:基于大模型的任务管理系统
  • 蓝耘智算平台使用DeepSeek教程
  • 网络安全-防御 第一次作业(由于防火墙只成功启动了一次未补截图)
  • [x86 ubuntu22.04]进入S4失败
  • Go 语言 | 入门 | 先导课程
  • 使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
  • frida 通过 loadLibrary0 跟踪 System.loadLibrary
  • Java-128陷阱、抽象类和接口的区别、为什么 hashCode()需要和equals()一起重写、封装继承多态
  • docker 搭建 mysql 主从
  • 人工智能丨PyTorch 强化学习与自然语言处理
  • 小白如何制作精致 PPT?免费 Office 插件来帮忙
  • 116,【8】 攻防世界 web shrine
  • Anaconda 下个人环境的快速安装指南:支持 GPU 运算的 PyTorch 环境
  • 清除el-table选中状态 clearSelection
  • 春晚「宇树科技」人形机器人H1技术浅析!
  • M系列/Mac安装配置Node.js全栈开发环境(nvm+npm+yarn)
  • 脚本批量重启openstack虚拟机并加上启动编号、脚本批量验证openstack虚拟机状态并加上编号