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

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

    • 环境变量
    • [Docker 镜像](#Docker 镜像)
    • [Docker CMD 与 ENTRYPOINT 有什么区别](#Docker CMD 与 ENTRYPOINT 有什么区别)
    • [Docker 中的网络:](#Docker 中的网络:)
    • [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 os
    
    app_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入门(下)》中再见!❤️

相关推荐
THMAIL1 小时前
mac M芯片运行docker-desktop异常问题
macos·docker·容器
两点王爷2 小时前
IDEA中springboot项目中连接docker
spring boot·docker·intellij-idea
家庭云计算专家2 小时前
还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍
服务器·人工智能·docker·容器·编辑器
匆匆z22 小时前
AWS EC2 微服务 金丝雀发布(Canary Release)方案
微服务·云原生·金丝雀部署
富士康质检员张全蛋3 小时前
云原生|kubernetes|kubernetes的etcd集群备份策略
云原生·kubernetes·etcd
慧一居士3 小时前
Kubernetes 中kind类型和各类型详细配置完整示例介绍
云原生·kubernetes·yaml配置
slam小白白白3 小时前
轨迹误差评估完整流程总结(使用 evo 工具)
eureka
孤的心了不冷5 小时前
【Docker】CentOS 8.2 安装Docker教程
linux·运维·docker·容器·eureka·centos
头疼的程序员6 小时前
docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)
学习·docker·容器
IT小郭.6 小时前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j