首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >12 Dockerfile

12 Dockerfile

作者头像
Lemon黄
发布于 2023-12-13 04:01:08
发布于 2023-12-13 04:01:08
31000
代码可运行
举报
文章被收录于专栏:Lemon黄Lemon黄
运行总次数:0
代码可运行

本文我们将了解 Docker 中 Dockerfile、构建镜像、运行容器以及如何将镜像推送到存储库。

Dockerfile

Docker 镜像的最基本构件是 Dockerfile。

Dockerfile 是一个包含指令和参数的简单文本文件。Docker 可以通过读取 Dockerfile 中给出的指令自动构建镜像。

在 Dokcerfile 中,左侧的所有内容都是指令,右侧的内容是这些指令的参数。需要注意的是,创建 Dockerfile,文件名就是Dockerfile,不需要任何的扩展名。

Docker 指令

下表总结了 Dockerfile 中重要的指令及其解释:

Dockerfile 指令

解释

FROM

指定可从容器注册中心(Docker hub、GCR、Quay、ECR 等)拉取的基础映像。

RUN

在镜像构建过程中执行命令。

ENV

设置镜像内的环境变量。它将在构建期间以及正在运行的容器中可用。如果只想购置构建过程中的变量,可以是用 ARG 指令。

COPY

将本地的文件和目录复制到镜像中。

EXPOSE

指定要为 Docker 容器公开暴露的端口。

ADD

它是 COPY 指令的一个功能更丰富的版本。它还允许从作为源文件的 URL 复制,并将 tar 文件自动拉去到镜像中。不过,建议使用 COPY 命令而不是 ADD。如果向下载远程文件,请使用 curl 或使用 RUN 指令。

WORKDIR

设置当前工作目录。我们可以在 Dockerfile 中重复使用这条指令来设置不同的工作目录。如果设置了 WORKDIR,RUN,CMD,ADD,COPY或ENTRYPOINT等指令就会在该目录下执行。

VOLUME

它用于创建卷或将卷挂载到 Docker 容器。

USER

设置运行容器时的用户名和 UID。我们可以使用此指令设置容器的非 root 用户。

LABEL

用于指定 Dokcer 镜像的元数据信息。

ARG

它用于设置带有键和值的构建时变量。当容器运行时,ARG 变量将不可用。如果我们想在正在运行的容器上保留变量,请使用 ENV 指令。

CMD

它用于在正在运行的容器中执行命令。只能由一个 CMD,如果由多个 CMD,则仅适用于最后一个。它可以通过 Docker CLI 进行重写。

ENTRTPOINT

指定 Docker 容器启动时将执行的命令。如果不指定任何 ENTRYPOINT,则默认为 /bin/sh -c。我们还可以适用 CLI 适用 --entrypoint标志覆盖 ENTRYPOINT。

下面我们来了解以下 Dockerfile 的基本组件:

基础镜像(FROM)

基础镜像是 Docker 镜像的起点。它为我们的应用程序提供底层操作系统和环境。我们可以从 Docker Hub 上提供的各种预构建基础镜像中进行选择,例如 AIpine Linux,Centos 或 Nodejs 或 Golang 等特定语言运行时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM node:14

上面的实例中,我们适用版本为 14 的 Nodejs 基础镜像。该镜像包含了 Nodejs 及其运行环境,适合运行 Nodejs 应用程序。

工作目录(WORKDIR)

工作目录是容器内将复制应用程序代码的位置。将工作目录设置为特定路径是一个很好的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WORKDIR /app

例子中,我们将工作目录设置为 /app

复制文件(COPY)

接下来,我们需要将应用程序代码和任何必要的文件复制到容器中的工作目录。这可确保容器具有运行应用程序所需的所有文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY package*.json ./

上面的行会将package.jsonpackage-lock.json文件从主句目录复制到容器中的当前工作目录。

安装依赖项(RUN)

复制必要的文件后,我们适用 npmpipgo mod包管理器安装应用程序的依赖项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RUN npm install

此命令将根据package.json文件来安装 Nodejs 的依赖项。

复制应用程序代码

安装依赖项后,我们可以将应用程序的其余部分复制到容器的工作目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COPY . .

将行将所有文件和文件夹从主机目录复制到容器中的当前工作目录。

暴露端口(EXPOSE)

如果我们的应用程序需要监听特定的端口,则需要在 Dockerfile 中公开暴露该端口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EXPOSE 3000

例子中,我们公开端口 3000,这是 Nodejs Web 应用程序的默认端口。

定义命令(CMD)

最后,我们需要定义容器启动时将要执行的命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CMD ["node", "app.js"]

此命令指定容器执行node命令,并且app.js文件应作为应用程序的入口点。

通过以上的指令组合到 Dockerfile 文件中,我们可以构建一个封装应用程序及其依赖项的镜像。该镜像可以作为容器在任何安装了 Docker 的系统上运行,为我 i 们的应用程序提供一致且隔离的环境。

Dockerfile 示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 拉取官方镜像
FROM node:14

# 设置工作目录
WORKDIR /app

# 从主机复制文件到工作目录
COPY package*.json ./

# npm 安装依赖
RUN npm install

# 复制程序代码到主机目录
COPY . .

# 暴露端口
EXPOSE 3000

# 运行命令行启动程序
CMD ["node", "app.js"]

上面的例子中,我们首先拉取了 Nodejs 为 14 的基础镜像。然后,将工作目录设置为/app并复制package.jsonpackage-lock.json文件到工作目录。 接着,我们适用npm install安装 Nodejs 依赖项。接下来,我们将应用程序代码的其余部分复制到工作目录。然后公开端口 3000 以允许外部访问容器内运行的应用程序。最后,我们定义启动应用程序的命令,并将node app.js指定为入口点。

上面的示例涵盖 Dockerfile 的基本元素,包括基本镜像选择、工作目录设置、复制文件、安装依赖项、公开端口和定义命令。我们可以根据自己的特定应用要求修改此示例,例如适用不同的基础镜像、公开不同的端口或更改入口点命令。

任务一:创建 Dockerfile 运行 Python 运行程序

如下是一个 Python 示例程序,app.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# app.py

# 导入 flash 模块
from flask import Flask

# 创建 Flask 应用实例
app = Flask(__name__)

# 定义跟路由 /
@app.rpute('/')
def hello():
 return "Hello, world!"

# 检查脚本是否被直接执行(而不是作为模块导入)
if __name__ == '__main__':
 # 运行 Flask 应用
  # 在指定端口 3000 启动服务器
 app.run(host='0.0.0.0', port=3000)

Dockerfile 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 拉去 Python3 基础镜像
FROM python:3

# 设置工作目录
WORKDIR /app

# 适用 pip 安装 Flask 库
RUN pip install flask

# 复制应用程序 app.py 到容器中
COPY app.py /app/

# 暴露3000端口
EXPOSE 3000

# 启动一个程序
CMD ["python", "./app.py"]

上面例子演示了如何容器化一个简单的 Flask Web 应用程序。Dockerfile 设置环境并公开端口 3000。Python 代码创建一个 Flask 应用程序,该应用程序/路由响应:Hello,world!。

通过构建并运行 Docker 镜像,我们就可以通过端口 3000 访问 Flask 应用程序。以下终端显示如何构建镜像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@huang-ubuntu:~/Codes/flask_case# docker build -t flask-web-app .
[+] Building 16.0s (9/9) FINISHED                                            docker:default
 => [internal] load build definition from Dockerfile                                   0.0s
 => => transferring dockerfile: 205B                                                   0.0s
 => [internal] load .dockerignore                                                      0.0s
 => => transferring context: 2B                                                        0.0s
 => [internal] load metadata for docker.io/library/python:3                            4.7s
 => [1/4] FROM docker.io/library/python:3@sha256:1987c4ae3b5afaa3a7c5e247e9eaab734808  0.0s
 => [internal] load build context                                                      0.0s
 => => transferring context: 215B                                                      0.0s
 => CACHED [2/4] WORKDIR /app                                                          0.0s
 => [3/4] RUN pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple           10.3s
 => [4/4] COPY app.py /app/                                                            0.3s
 => exporting to image                                                                 0.5s
 => => exporting layers                                                                0.4s
 => => writing image sha256:945fe2bf0a46e45118a43edc203ef5d378420e0e47578c9af7da873df  0.0s
 => => naming to docker.io/library/flask-web-app                                       0.0s
 root@huang-ubuntu:~/Codes/flask_case# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
flask-web-app   latest    945fe2bf0a46   28 seconds ago   1.03GB

任务二:适用 Dockerfile 构建镜像并运行容器

首先,我们从 Dockerfile 构建 Docker 镜像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -t flask-web-app .

然后,我们使用创建的镜像运行容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 3000:3000 flask-web-app

我们可以通过运行 docker ps来检查 docker 容器是是否正在运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@huang-ubuntu:~/Codes/flask_case# docker run -d -p 3000:3000 flask-web-app
17eca2eb0aa66f3e6d382da935ee59f099d5f7debeb7488d6e08bdc989eb8cba
root@huang-ubuntu:~/Codes/flask_case# docker ps
CONTAINER ID   IMAGE           COMMAND             CREATED          STATUS          PORTS                                       NAMES
17eca2eb0aa6   flask-web-app   "python ./app.py"   28 seconds ago   Up 26 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   eager_ptolemy

任务三:验证应用程序

可以通过在浏览器打开 http://127.0.0.1:3000/ 来验证应用程序是否正常运行:

任务四:将镜像推送到公共/私有的存储库(例 Docker Hub)

使用 docker login命令登录 Docker Hub:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker login

在 Docker Hub 创建你自己的存储仓库,我的为huanggz/flask-web-app,然后为本地镜像打上tag标签,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker tag flask-web-app huanggz/flask-web-app

将镜像推送到 Docker Hub:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker push huanggz/flask-web-app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@huang-ubuntu:~/Codes/flask_case# docker tag flask-web-app huanggz/flask-web-app
root@huang-ubuntu:~/Codes/flask_case# docker push huanggz/flask-web-app
Using default tag: latest
The push refers to repository [docker.io/huanggz/flask-web-app]
2009a282a576: Pushed
d087f60c824d: Pushed
10e320de2e18: Pushed
0470b4fe10a4: Pushed
a33e56a39409: Pushed
e10f6c2422e4: Pushed
a04a14a911a5: Pushed
80bd043d4663: Pushed
30f5cd833236: Pushed
7c32e0608151: Pushed
7cea17427f83: Pushed
latest: digest: sha256:d29c9f4dafcad9e9a5d394c1dc1fa2c93b21a542f303d00f738c466d4278c7c8 size: 2631

成功推送到 Docker Hub 上:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 莫奈黄 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker火遍全球!dockerfile构建你必须得会
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。如下所示是一个示例Dockerfile文件内容:
Wu_Candy
2022/07/04
2420
Docker火遍全球!dockerfile构建你必须得会
Docker使用手册-基础篇
类似于github和国内的gitee一样的远程仓库,只不过docker hub是公共的镜像仓库,用户可以上传和下载公开的镜像使用。
用户11014621
2025/02/07
1570
Docker容器:“我竟可以是个饭盒?!”
假设程序员的工作是炒菜做米饭和甜点,那么image就是炒好的菜,container则是装饭菜的饭盒,Registry就是用来存放饭盒的冰箱,将打包好的饭盒传递给不同的人,这也就是K8S部署。假如docker有生命周期的话,那么image就是用来打包,container用来执行和启动的。
才浅Coding攻略
2022/12/12
3490
Docker容器:“我竟可以是个饭盒?!”
Docker-Dockerfile讲解(一)
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2024/11/27
1310
Docker-Dockerfile讲解(一)
《Docker极简教程》--Dockerfile--Dockerfile的基本语法
Dockerfile是一种文本文件,用于定义Docker镜像的内容和构建步骤。它包含一系列指令,每个指令代表一个构建步骤,从基础镜像开始,逐步构建出最终的镜像。通过Dockerfile,用户可以精确地描述应用程序运行环境的配置、依赖项安装、文件复制等操作。这使得应用程序的部署和分发变得更加可控和可重复。Dockerfile的内容可以根据需求自定义,允许开发者根据应用程序的特性和需求来灵活配置镜像的构建过程,从而实现高效、可靠的容器化部署。
喵叔
2024/05/24
3.2K0
Docker 部署一个用 Python 编写的 Web 应用
在 WSL2 中安装 docker https://www.runoob.com/docker/ubuntu-docker-install.html 会报错:
Michael阿明
2022/01/07
9500
Docker 部署一个用 Python 编写的 Web 应用
两小时入门Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。
秃头哥编程
2019/07/04
6390
Docker 容器化部署 Python 应用
Docker是目前主流IT公司广泛接受和使用的,用于构建、管理和保护它们应用程序的工具。
Python数据科学
2019/09/08
3.4K1
万字长文带你看全网最详细Dockerfile教程
Dockerfile是用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。每个指令都会在镜像的构建过程中创建一个新的镜像层,这些层构成了最终镜像的结构。这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。以下是一个简单的Dockerfile示例:
用户1107783
2023/09/11
11.7K2
万字长文带你看全网最详细Dockerfile教程
五分钟学K8S系列<四>-深入浅出Dockerfile
在讨论 Dockerfile 的制作流程之前,我们先来探讨为什么要使用 Dockerfile 进行自动构建。
五分钟学SRE
2024/05/01
4810
【docker】Docker的基本指令和HTML/PYTHON/C++的简单创建示例
Docker 是一个开源平台,专为简化开发、部署和运行应用程序而设计。通过使用称为“容器”(Container)的轻量级虚拟化技术,将应用程序及其依赖环境打包到一个独立的单元中,使应用程序能够在任何环境中一致地运行。
SarPro
2024/05/24
1950
【docker】Docker的基本指令和HTML/PYTHON/C++的简单创建示例
Docker快速入门 02 构建镜像
创建一个包含应用程序及其依赖的目录结构。通常包括应用代码文件、配置文件以及运行所需的库文件等。例如,如果你的应用是一个简单的 Python Web 应用,你需要有 Python 脚本文件以及可能用到的第三方库的安装文件或者依赖清单(如 requirements.txt)。
90后小陈老师
2024/08/27
1510
Docker快速入门 02 构建镜像
docker笔记2023.8.4
1、https://mp.weixin.qq.com/s/pgVdhZMyKDfd5xz1YuMtTA
用户7138673
2023/08/16
6390
docker笔记2023.8.4
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2022/09/28
1.4K0
3.Docker学习之Dockerfile
四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践
    容器,又见容器。Docker容器的最主要优点就在于它们是可移植的。一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内核、平台分布或部署模型的主机版本的单个容器中。此容器可以传输到另一台运行Docker的主机上,并且在没有兼容性问题的情况下执行。而传统的微服务架构会将各个服务单独封装为容器,虽然微服务容器化环境能够在给定数量的基础架构内实现更高的工作负载密度,但是,在整个生产环境中创建、监视和销毁的容器需求总量呈指数级增长,从而显著增加了基于容器管理环境的复杂性。
用户9127725
2022/08/08
5010
四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践
Docker | 加速开发流程的 Dockerfile 最佳实践
Dockerfile 是创建 Docker 镜像的起点,该文件提供了一组定义良好的指令,可以让我们复制文件或文件夹,运行命令,设置环境变量以及执行创建容器镜像所需的其他任务。编写 Dockerfile 来确保生成的镜像安全、小巧、快速构建和快速更新非常重要。
咸鱼学Python
2020/05/18
1.6K0
Docker | 加速开发流程的 Dockerfile 最佳实践
Docker容器化部署,这些最佳实践你不可不知
Docker 作为一种开源的容器化技术,在当今的软件开发和部署领域中发挥着至关重要的作用。它具有诸多显著优势,为开发者和运维人员带来了极大的便利。
天创项目管理分享
2024/11/20
1.4K0
Docker容器化部署,这些最佳实践你不可不知
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2020/10/23
2K0
3.Docker学习之Dockerfile
docker连接两个容器
序 容器是用来提供服务的,每个容器都是运行一个进程,或许是一个web程序,或许是一个数据库服务,而在每个容器之间都是需要相互访问的,从而在这里构建一个python的程序,一个容器运行python的应用程序,一个容器用来运行redis服务,在应用程序中访问redis,具体架构如下: 运行redis的容器 运行redis的时候,步骤如下: 首先下载到redis的镜像,然后根据镜像运行一个镜像的实例,也就是redis这个实例,在其中需要注意的是,容器对外暴露的端口就是6379端口,从而在主机上对应监听一个
企鹅号小编
2018/02/26
1.6K0
docker连接两个容器
Dockerfile命令及实践构建一个网站
dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、
NeilNiu
2023/02/25
1.4K0
相关推荐
Docker火遍全球!dockerfile构建你必须得会
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档