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
docker run -i -t ubuntu
docker run -p 8080:80 nginx
docker run -v /your/local/folder:/container/folder nginx
docker inspect container_name
docker logs container_name
环境变量就像程序用来查找重要信息的便笺,有点像程序理解和更好地工作的秘密消息!
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
在 Docker 中使用 ENV 变量:
docker run -e APP_COLOR=green simple-webapp-color
simple-webapp-color
)并将环境变量 APP_COLOR
设置为“green”。检查环境变量:
docker inspect blissful_hopper
简单来说,环境变量就像程序(或 Docker 容器)可以读取的小注释,用于了解如何运行。您可以在运行程序之前设置这些注释,程序会使用它们来自定义自身。第二个示例中的 export
命令就像在运行程序之前写一个注释,告诉它如何运行。 docker inspect
命令就像窥探容器内部,查看它有什么注释。
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 构建输出:
可以容器化什么?
CMD
在 Docker 中:
CMD ["flask", "run"]
表示容器启动时,它会自动运行 Flask Web 服务器。CMD 示例:
FROM alpine
CMD ["sleep", "5"]
在此示例中,当您使用此映像运行容器时,它会自动休眠 5 秒。
ENTRYPOINT
在 Docker 中:
ENTRYPOINT ["flask", "run"]
表示容器主要用于运行 Flask Web 服务器,但您仍可以根据需要添加更多命令。ENTRYPOINT 示例:
FROM alpine
ENTRYPOINT ["sleep"]
CMD ["5"]
在这里,主要目的是睡觉,并且您仍然可以根据需要覆盖睡眠持续时间。
在这两种情况下,容器在启动时都会休眠几秒钟。关键区别在于您如何提供参数以及它们是否可以轻松覆盖。
CMD 就像在说“这是一个默认的操作”,而 ENTRYPOINT 就像在说“这是主要的操作,但您可以在需要时对其进行微调”。它们都有助于定义容器在启动时执行的操作。
Docker 网络帮助容器(程序)相互通信,确保它们能够顺利协同工作。
默认网络:
docker run ubuntu --network=host
用户定义网络:
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
嵌入式 DNS:
mysql.connect(mysql)
Docker 存储就像决定在使用容器时将数据保存在哪里。您可以将它们保存在容器内,使用卷在容器之间共享它们,或将它们存储在容器外以确保安全。
Docker 中的文件系统:
# 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"]
镜像层:
# Build the Docker image
docker build -t mmumshad/my-custom-app .
容器层:
# 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 type=bind,source=/mysql,target=/var/mysql mysql
存储驱动程序:
管理 Docker 中的数据
关于存储驱动程序
Volumes
好的,这篇文章到此结束。
感谢您阅读本文,我们将在下一篇文章《Docker入门(下)》中再见!❤️