WHAT - 容器化系列(二)- docker
目录
- 一、前言
- 二、Docker镜像:可运行软件包
- 三、Docker容器:可执行环境
- 四、容器和镜像的关系
- 五、创建镜像的过程
- 5.1 编写Dockerfile
- 5.2 构建Docker镜像
- 5.3 查看构建的镜像
- 5.4 运行Docker容器
- 5.5 验证容器运行状态
- 5.6 推送镜像到镜像仓库(可选)
- 1. 登录Docker Hub
- 2. 标记镜像
- 3. 推送镜像
- 总结
- 六、创建容器的过程
- 6.1 基本过程:选择镜像、启动容器、运行应用
- 6.2 示例
- 七、docker run 命令
- 7.1 镜像来源
- 7.2 主要参数说明
- 基本参数
- 网络相关参数
- 资源限制
- 其他参数
- 完整示例
- 总结
- 八、其他常见 docker 命令
一、前言
在 WHAT - 容器化系列(一) 我们简单介绍过 Docker 的产生过程以及它从根本上解决本地环境和 PaaS 环境不一致的问题。Docker大大简化了容器的创建、管理和分发,使得容器技术迅速普及,并引发了DevOps和微服务架构的革命。
因此Docker在容器化发展进程具备非常重要的意义,我们今天主要来介绍Docker。在Docker的生态系统中,理解Docker镜像和Docker容器及其关系是至关重要的。
二、Docker镜像:可运行软件包
Docker镜像是一种轻量级、独立的可执行软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
镜像是只读的,并且通常基于层次结构,每一层代表镜像的某个历史状态。
特点:
- 只读性:镜像是不可变的,一旦创建就不能更改。
- 层次结构:镜像由多个层组成,每层都是前一层的增量更新,这样可以提高存储和传输效率。
- 可移植性和一致性:镜像可以在任何支持Docker的环境中运行,确保应用在不同环境下的一致性。
三、Docker容器:可执行环境
Docker容器是基于镜像创建的一个可运行的实例。它是一个轻量级、独立的可执行环境,包含应用程序及其依赖项,并且运行在一个隔离的进程空间中。
容器可以被启动、停止、移动和删除,每个容器都是独立的。
特点:
- 可写层:每个容器在镜像的基础上创建时,会增加一个可写层,允许容器在运行时进行更改。
- 隔离性:容器通过操作系统级虚拟化技术(如Namespaces和cgroups)实现资源的隔离和控制。
- 临时性:容器的生命周期是短暂的,通常用于运行应用程序的一个实例。
四、容器和镜像的关系
容器和镜像之间的关系可以比作面向对象编程中的类和对象:
- 镜像是类:它定义了容器的蓝图或模板,包含所有需要的文件和设置。
- 容器是对象:它是镜像的实例,实际运行中的实体。
容器镜像好比是一个编译好的、打包好的程序文件,容器就是用这个程序文件运行的程序进程。
五、创建镜像的过程
创建Docker镜像的过程主要包括编写Dockerfile和使用Docker命令构建镜像。
以下是详细步骤:
5.1 编写Dockerfile
Dockerfile 是一个文本文件,包含了构建镜像的所有指令。这些指令定义了镜像的基础镜像、安装的依赖、复制的文件、设置的环境变量以及启动容器时运行的命令等。
Dockerfile 示例
以下是一个简单的示例Dockerfile,用于创建一个包含Nginx服务器的镜像:
# 使用官方Nginx基础镜像
FROM nginx:alpine# 维护者信息
LABEL maintainer="yourname@example.com"# 复制本地目录下的文件到镜像中的指定目录
COPY ./index.html /usr/share/nginx/html/index.html# 暴露端口
EXPOSE 80# 启动Nginx服务
CMD ["nginx", "-g", "daemon off;"]
5.2 构建Docker镜像
编写完Dockerfile后,可以使用docker build命令构建镜像。
命令格式
docker build -t <镜像名>:<标签> <Dockerfile所在目录>
示例命令
# 构建镜像并命名为mynginx:latest
# docker build -t mynginx:v1.1 .
docker build -t mynginx:latest .
5.3 查看构建的镜像
构建完成后,可以使用docker images命令查看本地的镜像列表。
docker images
5.4 运行Docker容器
构建完镜像后,可以使用docker run命令基于该镜像创建并运行容器。
命令格式
docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>:<标签>
示例命令
# 运行基于mynginx:latest镜像的容器,映射端口80
docker run -d --name mynginx_container -p 80:80 mynginx:latest
5.5 验证容器运行状态
可以使用docker ps命令查看正在运行的容器列表。
docker ps
5.6 推送镜像到镜像仓库(可选)
如果需要将镜像分享给其他人或在不同环境中使用,可以将镜像推送到Docker Hub或其他私有镜像仓库。
1. 登录Docker Hub
docker login
docker login -u admin <DockerHub域名>
# 示例:docker login -u admin mycontainer myregistry.com
2. 标记镜像
docker tag mynginx:latest <DockerHub用户名>/mynginx:latest
# 示例:docker tag mynginx:latest mycontainer myregistry.com/myapp/mynginx:latest
3. 推送镜像
docker push <DockerHub用户名>/mynginx:latest
# 示例 docker push mycontainer myregistry.com/myapp/mynginx:latest
总结
创建Docker镜像的过程主要包括以下步骤:
- 编写Dockerfile:定义镜像的构建步骤和内容。
- 构建镜像:使用
docker build命令构建镜像。 - 查看镜像:使用
docker images命令查看本地镜像列表。 - 运行容器:使用
docker run命令基于镜像创建并运行容器。 - 验证容器:使用
docker ps命令查看容器运行状态。 - 推送镜像(可选):将镜像推送到镜像仓库,以便共享和使用。
通过以上步骤,可以创建和管理Docker镜像,从而实现应用程序的容器化部署。
六、创建容器的过程
6.1 基本过程:选择镜像、启动容器、运行应用
- 选择镜像:通过Docker命令选择一个已有的镜像或从Docker Hub等仓库中拉取一个镜像。
- 启动容器:基于选定的镜像,Docker引擎创建一个容器实例,并在镜像的基础上添加一个可写层。
- 运行应用:容器启动后,镜像中的应用程序在隔离的环境中运行。
6.2 示例
假设有一个名为myapp的Docker镜像,以下是基于这个镜像创建并运行容器的过程:
# 拉取镜像(如果镜像已存在,可以跳过这一步)
docker pull myapp# 基于镜像创建并运行容器
docker run -d --name mycontainer myapp# 查看正在运行的容器
docker ps# 进入容器
docker exec -it mycontainer /bin/bash# 停止容器
docker stop mycontainer# 删除容器
docker rm mycontainer
七、docker run 命令
7.1 镜像来源
在前面我们提供过下面两个例子:
# 1. 本地build后run
docker build -t mynginx:latest .
docker run -d --name mynginx_container -p 80:80 mynginx:latest# 2. 拉取远端镜像run
docker pull myapp
docker run -d --name mycontainer myapp
对于远端镜像,在Docker中,可以直接通过docker run命令指定远端镜像,而不需要先使用docker pull命令拉取镜像。Docker会在本地没有指定镜像的情况下自动从远端仓库(例如Docker Hub)拉取镜像,然后运行容器。
以下是如何直接指定远端镜像的示例:
# 直接指定远端镜像并运行容器
docker run -d --name mycontainer myapp
在这个命令中,如果myapp镜像不存在于本地,Docker会自动从Docker Hub拉取镜像并运行容器。
如果需要指定具体的镜像版本或标签,可以在镜像名后面加上标签(例如myapp:latest或myapp:v1.0)。
# 直接指定带标签的远端镜像并运行容器
docker run -d --name mycontainer myapp:latest
另外,如果镜像托管在私有仓库或组织名下,需要包括仓库地址或组织名:
# 指定私有仓库中的镜像并运行容器
docker run -d --name mycontainer myregistry.com/myapp:latest# 指定组织名下的镜像并运行容器
docker run -d --name mycontainer myorg/myapp:latest
7.2 主要参数说明
docker run 是 Docker 中用于创建并运行容器的主要命令。这个命令有许多参数,可以用来配置容器的运行方式。以下是一些常用的 docker run 参数及其说明:
基本参数
-
-d或--detach- 作用:以后台模式运行容器。
- 示例:
docker run -d nginx
-
--name- 作用:为容器指定一个名称。
- 示例:
docker run --name mycontainer nginx
-
-p或--publish- 作用:将容器的端口映射到主机的端口。
- 示例:
docker run -p 8080:80 nginx
-
-e或--env- 作用:设置环境变量。
- 示例:
docker run -e MYVAR=myvalue nginx
-
-v或--volume- 作用:挂载主机目录或数据卷到容器。
- 示例:
docker run -v /host/path:/container/path nginx
-
--rm- 作用:容器停止后自动删除容器。
- 示例:
docker run --rm nginx
-
-it- 作用:以交互模式运行容器并绑定终端。
- 示例:
docker run -it ubuntu /bin/bash
网络相关参数
-
--network- 作用:指定容器的网络模式。
- 示例:
docker run --network bridge nginx
-
--link- 作用:连接到其他容器。
- 示例:
docker run --link another_container nginx
资源限制
-
--cpus- 作用:限制容器使用的CPU数量。
- 示例:
docker run --cpus="1.5" nginx
-
--memory- 作用:限制容器使用的内存。
- 示例:
docker run --memory="512m" nginx
其他参数
-
--restart- 作用:定义容器的重启策略。
- 示例:
docker run --restart=always nginx
-
--env-file- 作用:从文件中读取环境变量。
- 示例:
docker run --env-file ./env.list nginx
-
--entrypoint- 作用:覆盖镜像的默认入口点。
- 示例:
docker run --entrypoint /bin/bash ubuntu
-
-u或--user- 作用:以指定用户运行容器。
- 示例:
docker run -u 1001 nginx
-
--log-driver- 作用:指定容器的日志驱动。
- 示例:
docker run --log-driver=syslog nginx
完整示例
结合多个参数的完整示例:
docker run -d --name mynginx -p 8080:80 -v /mydata:/data --env MYVAR=myvalue --network mynetwork --restart=always nginx
-d:以后台模式运行容器。--name mynginx:为容器指定名称为mynginx。-p 8080:80:将主机的8080端口映射到容器的80端口。-v /mydata:/data:将主机目录/mydata挂载到容器的/data目录。--env MYVAR=myvalue:设置环境变量MYVAR为myvalue。--network mynetwork:将容器连接到mynetwork网络。--restart=always:设置容器重启策略为总是重启。nginx:使用nginx镜像。
总结
docker run 命令提供了丰富的参数选项,允许用户精细控制容器的运行方式。通过组合不同的参数,可以满足各种应用场景的需求。
八、其他常见 docker 命令
以下是一些常见的Docker命令及其功能介绍:
-
查看容器:
docker ps这个命令列出当前正在运行的容器。
-
启动或停止容器:
docker start <容器ID或名称> docker stop <容器ID或名称>通过这些命令可以启动或停止指定的容器。
-
删除容器:
docker rm <容器ID或名称>这个命令用于删除指定的容器。
-
在容器中执行命令:
docker exec -it <容器ID或名称> <命令>这个命令允许你在正在运行的容器中执行特定的命令。
-
分析容器的配置:
docker inspect <容器ID或名称>这个命令会返回指定容器的详细配置信息,包括网络设置、挂载的卷、环境变量等。
-
查看容器标准输出日志:
docker logs <容器ID或名称>这个命令用于查看容器的标准输出日志,可以用来调试和监视容器的运行情况。
-
查看镜像:
docker images这个命令列出本地系统中的Docker镜像列表。
-
删除镜像:
docker rmi <镜像ID或名称>这个命令用于删除指定的Docker镜像。
相关文章:
WHAT - 容器化系列(二)- docker
目录 一、前言二、Docker镜像:可运行软件包三、Docker容器:可执行环境四、容器和镜像的关系五、创建镜像的过程5.1 编写Dockerfile5.2 构建Docker镜像5.3 查看构建的镜像5.4 运行Docker容器5.5 验证容器运行状态5.6 推送镜像到镜像仓库(可选&…...
力扣 19题 删除链表的倒数第 N 个结点 记录
题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&am…...
渗透测试之Web安全系列教程(二)
今天,我们来讲一下Web安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。Web…...
【算法】在?复习一下快速排序?
基本概念 快速排序是一种基于交换的排序算法,该算法利用了分治的思想。 整个算法分为若干轮次进行。在当前轮次中,对于选定的数组范围[left, right],首先选取一个标志元素pivot,将所有小于pivot的元素移至其左侧,大于…...
matlab安装及破解
一、如何下载 软件下载链接,密码:98ai 本来我想自己生成一个永久百度网盘链接的,但是: 等不住了,所以大家就用上面的链接吧。 二、下载花絮 百度网盘下载速度比上载速度还慢,我给充了个会员,…...
Tree——输出项目的文件结构(Linux)
输出项目中的文件结构可以使用tree命令。tree是一个用于以树状结构显示目录内容的命令行工具。它非常适合快速查看项目的文件结构。安装: sudo apt-get install tree 使用: 在命令行中导航到项目的根目录,输出文件结构。 tree 也可以将结构输…...
UE5 读取本地图片并转换为base64字符串
调试网址:在线图像转Base64 - 码工具 (matools.com) 注意要加(data:image/png;base64,) FString UBasicFuncLib::LoadImageToBase64(const FString& ImagePath) {TArray<uint8> ImageData;// Step 1: 读取图片文件到字节数组if (!…...
【NOIP普及组】税收与补贴问题
【NOIP普及组】税收与补贴问题 💖The Begin💖点点关注,收藏不迷路💖 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),…...
Docker 部署 mysql 服务
linux用法 Container(容器)集合成 Services(服务) 交互集合成 Stack(堆栈)卸载可能存在的旧版本 sudo apt-get update使apt可以通过HTTPS使用存储库(repository) sudo apt-get ins…...
01- Redis 中的 String 数据类型和应用场景
1. 介绍 String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value 其实不仅是字符串,也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。 2. 内部实现 Str…...
Android音频焦点
什么是音频焦点? 音频焦点是 API 8 中引入的一个概念。它用于传达这样一个事实:用户一次只能专注于一个音频流,例如收听音乐或播客,但不能同时关注两者。在某些情况下,多个音频流可以同时播放,但只有一个是…...
Docker安全配置
Docker安全及日志管理 文章目录 Docker安全及日志管理资源列表基础环境一、Docker安全相关介绍1.1、Docker容器与虚拟机的区别1.1.1、隔离与共享1.1.2、性能与损耗 1.2、Docker存在的安全问题1.2.1、Docker自身漏洞1.2.2、Docker源码问题 1.3、Docker架构缺陷与安全机制1.3.1、…...
文件上传之使用一个属性接收多个文件
在开发过程中,可能遇到这样的业务:文件上传时个数不定,这样我们不能枚举出所有的文件name,这种情况下我们可以使用一个name将所有的文件接收下来; html代码 <!DOCTYPE html> <html lang"en"> …...
chat4-Server端保存聊天消息到mysql
本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端 同时将聊天消息保存到mysql 服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端同时将聊天消息保存到mysql 本文档主要总结了将聊天…...
vivo鄢楠:基于OceanBase 的降本增效实践
在3 月 20 日的2024 OceanBase 数据库城市行中,vivo的 体系与流程 IT 部 DBA 组总监鄢楠就“vivo 基于 OceanBase 的降本增效实践”进行了主题演讲。本文为该演讲的精彩回顾。 vivo 在1995年于中国东莞成立,作为一家全球领先的移动互联网智能终端公司&am…...
arm cortex-m架构 SVC指令详解以及其在freertos的应用
1. 前置知识 本文基于arm cortex-m架构描述, 关于arm cortex-m的一些基础知识可以参考我另外几篇文章: arm cortex-m 架构简述arm异常处理分析c语言函数调用规范-基于arm 分析 2 SVC指令 2.1 SVC指令位域表示 bit15 - bit12:条件码&#…...
k8s笔记——kubernetes中的三种IP
kubernetes概念 Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控 Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行 Pod:kubernetes的…...
Golang | Leetcode Golang题解之第127题单词接龙
题目: 题解: func ladderLength(beginWord string, endWord string, wordList []string) int {wordId : map[string]int{}graph : [][]int{}addWord : func(word string) int {id, has : wordId[word]if !has {id len(wordId)wordId[word] idgraph a…...
微服务中feign远程调用相关的各种超时问题
1. 引言 在spring cloud微服中,feign远程调用可能是大家每天都接触到东西,但很多同学却没咋搞清楚这里边的各种超时问题,生产环境可能会蹦出各种奇怪的问题。 首先说下结论: 1)只使用feign组件,不使用ribbion组件&…...
springboot整合chatgpt,并且让其可以记录上下文
整合很简单,不过需要几个小条件 1.必须要有openai官方的key 2.国内需要有代理服务器或者国外的服务器把项目部署出去也没问题 我没有使用spring的springAI,听说很方便,日后有机会去体验体验,我今天用了两种方式整合了gpt 1.Ch…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
