写点东西《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、阅读代码࿰…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...