写点东西《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入门(下)》中再见!❤️