引言
在https://huggingface.co/搭建环境时需要用到自己写Dockerfile进行环境的搭建,所以对Dockerfile的写法进行一些简单的学习。
介绍
首先了解一下构建Docekr镜像的四种方式:
- 从dockerfile构建:使用
docker build
命令从dockerfile构建镜像 - 从容器构建:使用
docker commit
命令从正在运行的容器构建镜像 - 从其他镜像派生:使用
docker run
命令从其他镜像派生新镜像 - 从镜像仓库拉取:使用
docker pull
命令从docker镜像仓库拉取镜像
Dockerfile是一个文本文件,用于自动构建Docker容器映像。它包含了要在Docker容器中运行的命令和构建参数,以及在容器中运行的软件包,文件和依赖项。我们可以使用如下指令构建镜像
docker build -t [image_name] [dockerfile_path]
例如: docker build -t my_nginx ./nginx
常用命令
首先介绍一下最常用的6个命令:
-
FROM:指定基础镜像,基础镜像是构建镜像的基础,容器的运行环境必须从基础镜像开始构建。常用的基础镜像文章下面已经罗列出来。冒号后为镜像的版本号,例如基于python3基础镜像。
FROM python:3
-
WORKDIR:设置容器内部的工作目录,后续的RUN指令会在此工作目录中执行。如果没有此目录,会自动创建目录。例如:
WORKDIR /app
-
RUN:在容器中执行命令,可以使用shell语句或exec格式,用于安装软件包、更新系统等操作。为了提高构建效率,多个RUN 指令最好合成一行,因为一行RUN 指令构建一层镜像,每一层都会在上一层的基础上构建,构建镜像的每一层都会缓存,以实现构建镜像的加速。例如:
RUN apt-get update && apt-get install -y \ build-essential \ && apt-get clean
-
COPY:将本地文件拷贝到容器中,不支持压缩文件。例如将requirements.txt拷贝到容器app文件夹下:
COPY requirements.txt .
-
ADD:和COPY类似,将文件拷贝到容器中,但是源路径支持URL且可以拷贝压缩文件,docker会自动解压缩。例如:
ADD http://www.example.com/file.txt /opt/
-
CMD:容器启动时执行的命令,可以使用shell语句或exec格式,可以多次使用,最后一行的CMD会覆盖之前的CMD指令。可以使用一下两种格式:
CMD ["python", "main.py"] CMD python main.py
除此之外还有:
-
EXPOSE:暴露容器内部端口,让外部可以访问容器中的服务。可以在容器创建时配置暴露的端口和主机端口映射。
EXPOSE 80
运行容器时使用 -p 参数暴露端口到宿主机上即可。
$ docker run -d -p <host port>:<container port> --name <container name> <image name>
-
VOLUME:挂载数据卷,用于数据持久化。
VOLUME /host/directory:/container/directory
-
ENV:用于设置容器内部的环境变量,在RUN指令中可以使用。例如,可以使用ENV指令设置JAVA_HOME环境变量:
ENV JAVA_HOME /usr/java/default
-
ARG: 用来定义镜像的构建参数,它可以在Dockerfile中定义一个参数,在运行docker build时可以使用–build-arg参数替换该参数。例如
ARG user=root
这样,在docker build时,可以通过–build-arg user=test改变user的值,如果没有提供–build-arg参数,那么user的值就是root。
一般很少用到的一些指令:
-
LABEL:可以为镜像添加元数据。它可以用来添加一些关于镜像的信息,比如作者,版本,描述等等。
LABEL <key>=<value>
-
ONBUILD:用于在构建镜像时触发构建另一个镜像。它可以用来构建一个复杂的镜像,而不是每次在构建镜像时都要执行复杂的指令。例如,在构建一个基础镜像时,可以使用ONBUILD指令触发构建另一个镜像,而不是每次都要手动构建。INSTRUCTION可以是任何Dockerfile指令,例如RUN、ADD、COPY等。
ONBUILD [INSTRUCTION]
当然还有其他命令,但本文就先不介绍了。
基础镜像
- CentOS:一个基于Linux的发行版,拥有丰富的软件资源,可以满足企业级的服务器需求。
- Ubuntu:一个Linux发行版,拥有极大的社区支持,可以提供友好、安全、稳定的操作环境。
- Debian:拥有超过29000个软件包的Linux发行版,可以满足大多数应用场景。
- OpenSUSE:OpenSUSE是一个免费的Linux发行版,拥有完善的安装和管理工具,可以快速安装和配置系统。
- Nginx:高性能的HTTP服务器,可以处理大量的并发请求,并在不同平台上运行。
- MySQL:关系型数据库管理系统,可以存储和管理大量的数据,提供丰富的SQL功能。
- Redis:高性能的Key-Value存储系统,支持多种数据结构,可以满足各种数据存储需求。
- MongoDB:面向文档的NoSQL数据库,可以提供高性能的读写操作,支持大规模的数据存储。
- Apache:开源的Web服务器,支持多种协议,可以满足各种Web应用的需求。
- Node.js:基于JavaScript的服务器端开发平台,可以快速构建高性能的Web应用。
- Java:J面向对象的编程语言,可以编写可移植的跨平台应用程序。
- WordPress:开源的内容管理系统,可以帮助用户快速搭建和管理网站。
- PHP:脚本语言,可以让开发者快速构建动态的Web应用。
- PostgreSQL:开源的对象关系型数据库管理系统,能够处理复杂的数据存储需求。
- Elasticsearch:可扩展的开源搜索引擎,可以快速的处理大量的数据,并能够提供实时的搜索结果。
- RabbitMQ:消息队列系统,可以更快更安全的进行消息传递。
- Memcached:高性能的分布式内存对象缓存系统,用来加快动态Web应用程序的速度。
- Grafana:开源的监控和仪表板软件,可以帮助用户可视化和分析结构化数据。
- Prometheus:开源的系统监控和警报工具,可以收集和存储各种指标数据,以便后续使用。
- Jenkins:开源的自动化软件持续集成和部署工具,可以帮助用户自动化构建和部署软件。
除此之外,还有一个轻量化的Linux发行版Alpine,体积非常小,只有5MB,它包含了最小的工具集(curl、wget、bash、apk、tar、gzip、grep、nano编辑器等),可以在容器中运行精简的应用程序。
原文链接:https://blog.csdn.net/weixin_41099712/article/details/129712146?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168994567416800192286954%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168994567416800192286954&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-1-129712146-null-null.268%5Ev1%5Ekoosearch&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81