写点东西《Docker入门(上)》
写点东西《Docker入门(上)》
- 环境变量
- Docker 镜像
- Docker CMD 与 ENTRYPOINT 有什么区别
- Docker 中的网络:
- Docker 存储:
Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后,此容器可以轻松传输并在安装了 Docker 的任何机器上运行,而无需担心环境差异。这是一种标准化的软件打包和运行方式。
什么是容器?
容器就像一个小包,其中包含程序运行所需的一切,使其易于在不同的计算机上移动和运行,而不会造成任何麻烦。
很酷的是,这个迷你计算机(容器)就像一个披着斗篷的超级英雄。它可以在任何计算机上运行,无论它们有何不同,因为它自带特殊环境。这是一种整洁有序的方式来组织软件,并确保它无论在何处都能以相同的方式工作。
我们为什么需要 Docker?
- 一致性:Docker 确保软件在您的计算机、朋友的计算机或任何计算机上都能以相同的方式工作。它保持一致性。
- 可移植性:您可以将软件及其朋友打包到 Docker 容器中,并且它可以随处移动。这就像把你的游戏及其所有规则装进行李箱,然后在朋友家玩一样。
- 隔离性:Docker 容器就像一个个小气泡。气泡内部发生的事情会留在气泡内部。这意味着容器中的一个程序不会与容器外的另一个程序发生冲突。
- 高效性:Docker 有助于节省计算机资源。您不必为一个程序配备一台完整的计算机,而可以在同一台计算机上运行多个容器,而不会相互干扰。
- 速度:Docker 使得启动、停止和共享软件变得快速而简单。这就像打开和关闭游戏机一样——快速而简单。
什么是 Docker 镜像?
Docker 镜像是一个程序及其运行所需的所有内容的快照。它是一个打包版本,其中包括代码、工具和设置,就像一个包含所有成分的饼干食谱快照。
镜像是食谱,而容器是您按照该食谱实际制作和运行程序时获得的内容。
一些基本的 Docker 命令。
-
docker run nginx
此命令告诉 Docker 使用“nginx”镜像运行容器。这就像告诉 Docker 启动预制程序(nginx,这是一个 Web 服务器)的新实例。
-
docker ps
向您显示正在运行的容器列表。这就像检查当前正在运行哪些程序。
-
docker ps -a
向您显示所有容器的列表,包括已停止的容器。这就像检查您运行的所有程序的历史记录。
-
docker stop silly_sammet
停止名为“silly_sammet”的正在运行的容器。这就像关闭当前正在运行的程序。
-
docker rm silly_sammet
删除名为“silly_sammet”的已停止容器。这就像扔掉您不再需要的程序的说明。
-
docker images
列出您拥有的所有 Docker 镜像。这就像查看您可以运行的所有不同程序的菜单。
-
docker rmi nginx
删除“nginx”镜像。这就像擦除您不再想使用的程序的食谱。
-
docker pull nginx
从互联网下载“nginx”镜像。这就像从食谱中获取新食谱。
-
docker run ubuntu sleep 5
使用“ubuntu”镜像运行容器并使其休眠 5 秒。这就像启动一个程序,该程序只需等待一小段时间然后停止。
-
docker exec distracted_mcclintock cat /etc/hosts
在名为“distracted_mcclintock”的正在运行的容器内执行命令。这就像窥视食谱以查看特定页面。
-
docker run -d kodekloud/simple-webapp
从“kodekloud/simple-webapp”映像中以分离模式运行容器。这就像启动程序并让它在后台运行。
-
docker attach a043d
使用 ID“a043d”将您的终端连接到正在运行的容器。这就像跳入正在运行的程序以查看正在发生的事情。
一些 Docker 概念:
- 使用标签运行:
- 标签就像程序的版本。它指定您要运行哪个版本。
- 示例代码:
docker run nginx:latest
- 这将运行 Nginx 程序的最新版本。
- 使用 STDIN 运行:
- STDIN 就像在键盘上打字。某些程序需要您的输入。
- 示例代码:
docker run -i -t ubuntu
- 这在 Ubuntu 容器内运行一个交互式终端,允许您键入命令。
- 使用端口映射运行:
- 端口就像门。程序使用它们与外界通信。
- 示例代码:
docker run -p 8080:80 nginx
- 这运行 Nginx,它在您计算机的端口 8080 上打开门,将其连接到容器的端口 80。
- 使用卷映射运行:
- 卷就像共享文件夹。它们允许您将内容存储在容器外部。
- 示例代码:
docker run -v /your/local/folder:/container/folder nginx
- 这运行 Nginx,并将您计算机上的一个文件夹连接到容器内的文件夹。
- 检查容器:
- 检查就像仔细查看正在运行的程序。
- 示例代码:
docker inspect container_name
- 这会为您提供有关正在运行或已停止的容器的详细信息。
- 容器日志:
- 日志就像日记。它们记录程序已执行的操作。
- 示例代码:
docker logs container_name
- 这会向您显示特定容器的日志或活动。
环境变量
环境变量就像程序用来查找重要信息的便笺,有点像程序理解和更好地工作的秘密消息!
- **
Python 脚本 (app.py) 中的环境变量:**
- 想象一下,您有一个用 Python 编写的程序 (app.py)。您可能想在不更改代码的情况下对其进行自定义。您可以使用环境变量。
- 示例代码 (app.py):
import osapp_color = os.getenv("APP_COLOR", "default_color")print(f"The app color is {app_color}")
- 正常运行脚本:
python app.py
- 使用特定颜色运行:
export APP_COLOR=blue; python app.py
-
在 Docker 中使用 ENV 变量:
- Docker 容器也可以使用环境变量。这就像给容器内的程序提供指令。
- 示例代码:
docker run -e APP_COLOR=green simple-webapp-color
- 这会运行一个 Docker 容器(
simple-webapp-color
)并将环境变量APP_COLOR
设置为“green”。
-
检查环境变量:
- 有时,您需要检查正在运行的容器正在使用什么环境变量。
- 示例代码:
docker inspect blissful_hopper
- 此命令提供有关名为“blissful_hopper”的容器的详细信息,包括其环境变量。
简单来说,环境变量就像程序(或 Docker 容器)可以读取的小注释,用于了解如何运行。您可以在运行程序之前设置这些注释,程序会使用它们来自定义自身。第二个示例中的 export
命令就像在运行程序之前写一个注释,告诉它如何运行。 docker inspect
命令就像窥探容器内部,查看它有什么注释。
Docker 镜像
Dockerfile:
Dockerfile 就像一组 Docker 创建映像的指令。它就像一个烘焙蛋糕的食谱。
# Use the Ubuntu base image
FROM Ubuntu# Update apt repository
RUN apt-get update# Install dependencies using apt
RUN apt-get install -y python# Install Python dependencies using pip
RUN pip install flask
RUN pip install flask-mysql# Copy source code to /opt folder
COPY . /opt/source-code# Set the working directory
WORKDIR /opt/source-code# Specify entry point to run the web server
ENTRYPOINT ["flask", "run"]
创建您自己的映像的步骤:
- 使用上述内容创建一个名为
Dockerfile
的文件。 - 将其保存在与源代码相同的目录中。
构建 Docker 镜像:
在终端中运行以下命令:
docker build -t your-image-name .
此命令告诉 Docker 使用当前目录中的 Dockerfile ( .
) 构建镜像,并用您选择的名称 ( -t your-image-name
) 标记它。
分层架构:
- 可以将 Docker 镜像视为一个分层蛋糕。Dockerfile 中的每条指令都会向镜像添加一层。
- 层是可重用的。如果您在代码中更改了某些内容,Docker 只会重新构建受影响的层,从而提高效率。
Docker 构建输出:
- 构建镜像时,Docker 会显示该过程中的每个步骤。如果出现故障,它会给您一条错误消息。
可以容器化什么?
- 几乎所有内容!应用程序、服务、数据库、网站,基本上任何软件都可以进行容器化。
- 这就像将软件放入一个容器中,以便它可以在任何地方运行而不会造成麻烦。
Docker CMD 与 ENTRYPOINT 有什么区别
CMD
在 Docker 中:
- 可以将 CMD 视为在启动容器时程序执行的默认操作。
- 这就像在说,“嘿,在运行此容器时,默认执行此操作。”
- 示例:
CMD ["flask", "run"]
表示容器启动时,它会自动运行 Flask Web 服务器。
CMD 示例:
FROM alpine
CMD ["sleep", "5"]
在此示例中,当您使用此映像运行容器时,它会自动休眠 5 秒。
ENTRYPOINT
在 Docker 中:
- 可以将 ENTRYPOINT 视为容器执行的主要操作。它就像 boss 命令。
- 它在容器启动时设置默认应用程序以运行,但您仍可以根据需要覆盖它。
- 示例:
ENTRYPOINT ["flask", "run"]
表示容器主要用于运行 Flask Web 服务器,但您仍可以根据需要添加更多命令。
ENTRYPOINT 示例:
FROM alpine
ENTRYPOINT ["sleep"]
CMD ["5"]
在这里,主要目的是睡觉,并且您仍然可以根据需要覆盖睡眠持续时间。
在这两种情况下,容器在启动时都会休眠几秒钟。关键区别在于您如何提供参数以及它们是否可以轻松覆盖。
CMD 就像在说“这是一个默认的操作”,而 ENTRYPOINT 就像在说“这是主要的操作,但您可以在需要时对其进行微调”。它们都有助于定义容器在启动时执行的操作。
Docker 中的网络:
Docker 网络帮助容器(程序)相互通信,确保它们能够顺利协同工作。
默认网络:
- Docker 为容器创建默认网络以进行通信。
- 示例代码:
docker run ubuntu --network=host
*
这将使用主机网络运行 Ubuntu 容器,这意味着它与主机共享网络命名空间。
用户定义网络:
- 您可以创建自己的网络以实现更好的组织和控制。
- 示例代码:
docker network create --driver=bridge --subnet=182.18.0.0/16 custom-isolated-network
- 这会创建一个名为
custom-isolated-network
的用户定义桥接网络,并带有特定子网。
列出网络:
- 您可以看到您拥有的所有网络。
- 示例代码:
docker network ls
检查网络:
- 您可以检查特定网络的详细信息。
- 示例代码:
docker network inspect blissful_hopper
*
这显示了有关名为“blissful_hopper”的网络的详细信息。
嵌入式 DNS:
- Docker 具有内置的 DNS 系统,以便容器可以通过名称相互查找。
- 示例代码:
mysql.connect(mysql)
*
这可能是您代码中的一行,其中名为“mysql”的服务使用 Docker 的 DNS 连接到另一个名为“mysql”的服务。
Docker 存储:
Docker 存储就像决定在使用容器时将数据保存在哪里。您可以将它们保存在容器内,使用卷在容器之间共享它们,或将它们存储在容器外以确保安全。
Docker 中的文件系统:
- Docker 使用分层架构来构建镜像。Dockerfile 中的每条指令都会向文件系统添加一个新层。
# Dockerfile
FROM Ubuntu
RUN apt-get update && apt-get install -y python
RUN pip install flask flask-mysql
COPY . /opt/source-code
WORKDIR /opt/source-code
ENTRYPOINT ["flask", "run"]
- Dockerfile 中的层:
*
第 1 层:基本 Ubuntu 层
*
第 2 层:apt 包中的更改
*
第 3 层:pip 包中的更改
*
第 4 层:源代码
*
第 5 层:使用“flask”命令更新入口点
*
第 6 层:容器层
镜像层:
- 构建 Docker 镜像时,它由只读层组成。每层表示对镜像的更改或添加。
*
第 1 层:基本 Ubuntu 层
*
第 2 层:apt 包中的更改
*
第 3 层:pip 包中的更改
*
第 4 层:源代码
*
第 5 层:使用“flask”命令更新入口点
# Build the Docker image
docker build -t mmumshad/my-custom-app .
容器层:
- 当您运行 Docker 容器时,会在只读镜像层之上添加一个读写层。此层特定于正在运行的容器。
*
层 6. 容器层
# Run the Docker container
docker run mmumshad/my-custom-app
卷:
- 卷是一种在容器外保存数据的方式。它们类似于外部存储。
# Create a Docker volume
docker volume create data_volume# Use the volume in a container
docker run -v data_volume:/var/mysql mysql
- 您还可以使用
-v
将主机中的特定目录挂载到容器:
# Mount a host directory to a container directory
docker run -v /path/on/host:/var/mysql/mysql -d mysql
- docker run --mount 命令用于将主机计算机中的特定目录或文件挂载到正在运行的 Docker 容器中。
docker run --mount type=bind,source=/mysql,target=/var/mysql mysql
存储驱动程序:
- Docker 使用存储驱动程序来管理数据的存储和访问方式。一些常见的存储驱动程序包括 AUFS、ZFS、BTRFS、设备映射器、Overlay 和 Overlay2。
管理 Docker 中的数据
关于存储驱动程序
Volumes
好的,这篇文章到此结束。
感谢您阅读本文,我们将在下一篇文章《Docker入门(下)》中再见!❤️
相关文章:

写点东西《Docker入门(上)》
写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…...

chatgpt实用技巧之二反问式提示
大家好,今天跟大家讲实用gpt的小技巧二、反问式提示 有时候不知道怎么给 GPT 提示词,这时候,就可以反问 GPT 如何更好地给提示词。如图片所示 更详细内容可以看下这篇: 按照 GPT 给出的:故事设定角色故事发展主题结局…...

【数据结构和算法】奇偶链表
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:分离节点后合并 三、代码 3.1 方法一:分离节点后合并 四、复杂度分…...

MVC框架
文章目录 JSP 和 ServletMVC 的演进1. JSP Model 12. JSP Model 23. MVC 的一般化4. MVC 的变体 总结 JSP 和 Servlet 如果你有使用 Java 作为主要语言开发网站的经历,那么你一定听过别人谈论 JSP 和 Servlet。其中,Servlet 指的是服务端的一种 Java 写…...

学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研
之前博客介绍了NeRF-SLAM,其中对于3D Gaussian Splatting没有太深入介绍。本博文对3D Gaussian Splatting相关的一些工作做调研。 学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客文章浏览阅读967次,点赞22次࿰…...
Github Copilot 的使用方法和快捷键
Github Copilot是一个基于人工智能技术的代码自动补全工具,它可以为开发者提供实时的代码建议和自动生成代码片段。本文将详细介绍如何安装、设置和使用Github Copilot,并提供一些常用的快捷键来提高开发效率。 1. 安装和设置 1.1 下载并安装VS Code …...
开源iMES工厂管家 - 详细安装部署指南(图解)- 全网独稿
目录 一、服务器环境: 二、部署构成总览: 三、下载 node-v16.17.1-win-x64:Index of /download/release/v16.17.1/ 四、绿色安装 node-v16.17.1-win-x64 五、配置环境变量 六、检查 node-v16.17.1-win-x64 是否成功 七、执行命令组,安装组库与各种依赖 vue3环境配置…...

Codeforces Round 919 (Div. 2)
Problem - A - Codeforces n个约束条件 a x 求出满足n个约束条件的整数的个数 大于等于x,取最大的 小于等于x,取最小的 然后不等于x的,记录在区间范围内的个数,减去这些 #include<bits/stdc.h> #define endl \n #define …...

面向经验丰富的开发人员的最佳 Linux 发行版
在深入研究最佳 Linux 发行版之前,让我们回顾一下历史。到 2021 年,Linux 操作系统已经有 30 年的历史了,从作为开发者 Linus Torvalds 的个人项目开始,它已经走过了很长一段路。最初发布时,其源代码被分发给用户&…...

Rust-借用检查
Rust语言的核心特点是:在没有放弃对内存的直接控制力的情况下,实现了内存安全。 所谓对内存的直接控制能力,前文已经有所展示:可以自行决定内存布局,包括在栈上分配内存,还是在堆上分配内存;支…...

xcode安装及运行源码
抖音教学视频 目录 1、xcode 介绍 2、xcode 下载 3、xocde 运行ios源码 4、快捷键 1、xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有…...

x-cmd pkg | czg - git commit 智能生成工具
目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目,重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式,辅助用户生成规范的 git commit message 约…...
Go的并发练习题目
经典并发题目 现在有4个协程,分别对应编号为1,2,3,4,每秒钟就有一个协程打印自己的编号,要求编写一个程序,让输出的编号总是按照1,2,3,4,1,2,3,4这样的规律一直打印下去 type Token struct { }func newWorker(id int, ch chan Token, nextC…...

Python 网络编程之粘包问题
【一】粘包问题介绍 【1】粘包和半包 粘包: 定义: 粘包指的是发送方发送的若干个小数据包被接收方一次性接收,形成一个大的数据包。原因: 通常是因为网络底层对数据传输的优化,将多个小数据包组合成一个大的数据块一次…...

旧衣回收小程序搭建:降低企业成本,提高回收效率!
在人们环保意识提升下,旧衣回收行业受到了大众的关注,同时旧衣回收具有门槛低、利润大的优势。在我国,回收行业不仅帮助普通人就业获利,还对环保做出了较大贡献。因此,旧衣回收行业成为了当下的热门商业模式࿰…...

Jmeter后置处理器——JSON提取器
目录 1、简介 2、使用步骤 1)添加线程组 2)添加http请求 3) 添加JSON提取器 1、简介 JSON是一种简单的数据交换格式,允许互联网应用程序快速传输数据。JSON提取器可以从JSON格式响应数据中提取数据、简化从JSON原始数据中提取特定…...

[SWPUCTF 2022 新生赛]奇妙的MD5
[SWPUCTF 2022 新生赛]奇妙的MD5 wp 题目页面: 提示:可曾听过ctf 中一个奇妙的字符串。 奇妙的字符串 奇妙的字符串,又跟 MD5 有关,我只知道两个: 一个是 MD5 加密后弱比较等于自身,这个字符串是 0e215…...

MHFormer 论文解读
目录 Multi-Hypothesis Transformer 结果 Introduction & Related work 多假设 为什么作者提出这个模型? 3.Multi-Hypothesis Transformer 3.1 Preliminary 3.2 MultiHypothesis Generation 3.3 Temporal Embedding 3.4. SelfHypothesi…...
Python列表append()函数使用详解
在Python中,列表是一种可变序列类型,可以用来存储多个元素。列表的append()函数是用于在列表末尾添加新元素的内置方法。本文将详细介绍Python列表的append()函数及其使用方法。 一、append()函数的基本语法 append()函数的语法非常简单,只…...

第08章_面向对象编程(高级)拓展练习(关键字:static,代码块,关键字:final,抽象类和抽象方法,接口,内部类,枚举类,注解,包装类)
文章目录 第08章_面向对象编程(高级)拓展练习01-关键字:static1、银行账户类2、图形类3、数组工具类4、二分查找5、二分查找6、素数7、阅读代码,分析运行结果8、阅读代码,分析运行结果 02-代码块9、阅读代码࿰…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...