写点东西《Docker入门(上)》

写点东西《Docker入门(上)》

    • 环境变量
    • Docker 镜像
    • Docker CMD 与 ENTRYPOINT 有什么区别
    • Docker 中的网络:
    • Docker 存储:

Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后,此容器可以轻松传输并在安装了 Docker 的任何机器上运行,而无需担心环境差异。这是一种标准化的软件打包和运行方式。

什么是容器?

容器就像一个小包,其中包含程序运行所需的一切,使其易于在不同的计算机上移动和运行,而不会造成任何麻烦。

很酷的是,这个迷你计算机(容器)就像一个披着斗篷的超级英雄。它可以在任何计算机上运行,无论它们有何不同,因为它自带特殊环境。这是一种整洁有序的方式来组织软件,并确保它无论在何处都能以相同的方式工作。

我们为什么需要 Docker?

  1. 一致性:Docker 确保软件在您的计算机、朋友的计算机或任何计算机上都能以相同的方式工作。它保持一致性。
  2. 可移植性:您可以将软件及其朋友打包到 Docker 容器中,并且它可以随处移动。这就像把你的游戏及其所有规则装进行李箱,然后在朋友家玩一样。
  3. 隔离性:Docker 容器就像一个个小气泡。气泡内部发生的事情会留在气泡内部。这意味着容器中的一个程序不会与容器外的另一个程序发生冲突。
  4. 高效性:Docker 有助于节省计算机资源。您不必为一个程序配备一台完整的计算机,而可以在同一台计算机上运行多个容器,而不会相互干扰。
  5. 速度:Docker 使得启动、停止和共享软件变得快速而简单。这就像打开和关闭游戏机一样——快速而简单。

什么是 Docker 镜像?

Docker 镜像是一个程序及其运行所需的所有内容的快照。它是一个打包版本,其中包括代码、工具和设置,就像一个包含所有成分的饼干食谱快照。

镜像是食谱,而容器是您按照该食谱实际制作和运行程序时获得的内容。

一些基本的 Docker 命令。

  1. docker run nginx

    此命令告诉 Docker 使用“nginx”镜像运行容器。这就像告诉 Docker 启动预制程序(nginx,这是一个 Web 服务器)的新实例。

  2. docker ps

    向您显示正在运行的容器列表。这就像检查当前正在运行哪些程序。

  3. docker ps -a

    向您显示所有容器的列表,包括已停止的容器。这就像检查您运行的所有程序的历史记录。

  4. docker stop silly_sammet

    停止名为“silly_sammet”的正在运行的容器。这就像关闭当前正在运行的程序。

  5. docker rm silly_sammet

    删除名为“silly_sammet”的已停止容器。这就像扔掉您不再需要的程序的说明。

  6. docker images

    列出您拥有的所有 Docker 镜像。这就像查看您可以运行的所有不同程序的菜单。

  7. docker rmi nginx

    删除“nginx”镜像。这就像擦除您不再想使用的程序的食谱。

  8. docker pull nginx

    从互联网下载“nginx”镜像。这就像从食谱中获取新食谱。

  9. docker run ubuntu sleep 5

    使用“ubuntu”镜像运行容器并使其休眠 5 秒。这就像启动一个程序,该程序只需等待一小段时间然后停止。

  10. docker exec distracted_mcclintock cat /etc/hosts

    在名为“distracted_mcclintock”的正在运行的容器内执行命令。这就像窥视食谱以查看特定页面。

  11. docker run -d kodekloud/simple-webapp

    从“kodekloud/simple-webapp”映像中以分离模式运行容器。这就像启动程序并让它在后台运行。

  12. docker attach a043d

    使用 ID“a043d”将您的终端连接到正在运行的容器。这就像跳入正在运行的程序以查看正在发生的事情。

一些 Docker 概念:

  1. 使用标签运行:
  • 标签就像程序的版本。它指定您要运行哪个版本。
  • 示例代码: docker run nginx:latest
  • 这将运行 Nginx 程序的最新版本。
  1. 使用 STDIN 运行:
  • STDIN 就像在键盘上打字。某些程序需要您的输入。
  • 示例代码: docker run -i -t ubuntu
  • 这在 Ubuntu 容器内运行一个交互式终端,允许您键入命令。
  1. 使用端口映射运行:
  • 端口就像门。程序使用它们与外界通信。
  • 示例代码: docker run -p 8080:80 nginx
  • 这运行 Nginx,它在您计算机的端口 8080 上打开门,将其连接到容器的端口 80。
  1. 使用卷映射运行:
  • 卷就像共享文件夹。它们允许您将内容存储在容器外部。
  • 示例代码: docker run -v /your/local/folder:/container/folder nginx
  • 这运行 Nginx,并将您计算机上的一个文件夹连接到容器内的文件夹。
  1. 检查容器:
  • 检查就像仔细查看正在运行的程序。
  • 示例代码: docker inspect container_name
  • 这会为您提供有关正在运行或已停止的容器的详细信息。
  1. 容器日志:
  • 日志就像日记。它们记录程序已执行的操作。
  • 示例代码: docker logs container_name
  • 这会向您显示特定容器的日志或活动。

环境变量

环境变量就像程序用来查找重要信息的便笺,有点像程序理解和更好地工作的秘密消息!

  1. **
    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
  1. 在 Docker 中使用 ENV 变量:

    • Docker 容器也可以使用环境变量。这就像给容器内的程序提供指令。
    • 示例代码:
    • docker run -e APP_COLOR=green simple-webapp-color
    • 这会运行一个 Docker 容器( simple-webapp-color )并将环境变量 APP_COLOR 设置为“green”。
  2. 检查环境变量:

    • 有时,您需要检查正在运行的容器正在使用什么环境变量。
    • 示例代码: 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"]

创建您自己的映像的步骤:

  1. 使用上述内容创建一个名为 Dockerfile 的文件。
  2. 将其保存在与源代码相同的目录中。

构建 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入门(下)》中再见!❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Http各个请求类型详细介绍

1. 前言 在Spring Boot框架中,HTTP请求类型是构建Web应用程序的重要组成部分。常见的请求类型包括GET、POST、PUT和DELETE,每种类型都有其特定的用途和特点。本文将详细比较这四种请求类型,帮助您在开发过程中做出明智的选择。 2. GET请求…

你知道谁才是 “最懂程序员” 的搜索引擎?

大家好,我是奇兵,作为一名程序员,我们开发的过程中几乎每天都和搜索引擎打交道,利用它来搜文档、解决 Bug 等等。 而随着 AI 的发展,搜索引擎也变得越来越智能,市面上也涌现除了越来越多的 AI 搜索引擎。 …

少儿编程 2023年12月中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)

2023年12月scratch编程等级考试三级真题 选择题 1、运行左图程序,想得到右图中的效果,红色框应填写的数值是 A、12 B、11 C、10 D、9 答案:D 考点分析:考查积木综合使用,从右边的图形中可以看到第一层小正方形个数为9个,而左边程序中内外层循环的次数都是一样,所以…

机器学习-协同过滤

1、协同过滤要解决的问题 协同过滤算法主要用于推荐系统,推荐系统是信息过载所采用的措施,面对海量的数据信息,从中快速推荐出符合用户特点的物品。一些人的“选择恐惧症”、没有明确需求的人。 解决如何从大量信息中找到自己感兴趣的信息。…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1:输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几,如果无法根据第一个大写字母判断,则继续根据输入的第二个小写字母进行判断,最终返回正确的英文周几…

排序之希尔排序

希尔排序,也被称为缩小增量排序,是一种基于插入排序的算法。它通过比较相距一定间隔的元素,来工作,然后再逐渐减小间隔,直到整个数组排序完成。这种算法的主要优点是对于部分有序的数组,其效率非常高&#…

编码器与解码器LLM全解析:掌握NLP核心技术的关键!

让我们深入了解:基于编码器和基于解码器的模型有什么区别? 编码器与解码器风格的Transformer 从根本上说,编码器和解码器风格的架构都使用相同的自注意力层来编码词汇标记。然而,主要区别在于编码器旨在学习可以用于各种预测建模…

Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表

文章目录 前言实现代码执行结果 前言 在项目中有时会出现列表很大,无法一次性批量操作,我们需要将列表分成指定大小的几个子列表,一份一份进行操作,本文提供这样的工具类实现这个需求。 实现代码 public class ListUtils {publ…

代币中的decimal精度代表了什么

精度的意义在于允许发送小数的代币。举例,一个CAT代币合约的精度为6。那么 你拥有1个CAT就意味着合约中的balance 1 * 10^6 , 转账 0.1CAT出去的话,就需要输入 0.1*10^6 10^5。 也就时在涉及代币时,查询到的余额、转账的代币数量 都和 代币…

<软考高项备考>《论文专题 - 62 质量管理(1) 》

1 论文基础 1.1 写作要点 过程定义、作用写作要点、思路过程定义、作用写作要点、思路规划质量管理规划质量管理是识别项目及其可交付成果的质量要求、标准,并书面描述项目将如何证明符合质量要求、标准的过程。作用:为在整个项目期间如何管理和核实质量提供指南和…

kafka除了作为消息队列还能做什么?

Kafka 最初是为大规模处理日志而构建的。它可以保留消息直到过期,并让各个消费者按照自己的节奏提取消息。 与其之前的竞品不同,Kafka 不仅仅是一个消息队列,它还是一个适用于各种情况的开源事件流平台。 让我们回顾一下流行的 Kafka 用例。 …

k8s集群配置NodeLocal DNSCache

一、简介 当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,CoreDNS将会承受更大的压力,可能会导致如下影响: 延迟增加:有限的coredns服务在解析大量的域名时,会导致解析结果…