《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)
文章目录
- 4.1 容器生命周期管理
- 4.1.1 重点基础知识
- 4.1.2 重点案例:启动并管理 Python Flask 应用容器
- 4.1.3 拓展案例 1:调试运行中的容器
- 4.1.4 拓展案例 2:优雅地停止和清理容器
- 4.2 容器数据管理与持久化
- 4.2.1 重点基础知识
- 4.2.2 重点案例:使用卷存储 Python 应用数据
- 4.2.3 拓展案例 1:使用绑定挂载进行数据持久化
- 4.2.4 拓展案例 2:使用临时存储管理敏感数据
- 4.3 容器网络配置
- 4.3.1 重点基础知识
- 4.3.2 重点案例:配置 Python Flask 应用的网络
- 4.3.3 拓展案例 1:容器间通信
- 4.3.4 拓展案例 2:使用 Docker Compose 管理网络
4.1 容器生命周期管理
管理 Docker 容器的生命周期就像是驾驶宇宙飞船,你需要了解如何启动、停止,甚至是销毁这些飞船。这一节将带你穿梭在 Docker 容器的生命周期管理的浩瀚宇宙中。
4.1.1 重点基础知识
深入理解 Docker 容器的生命周期管理是掌握 Docker 使用的关键。下面是一些关于容器生命周期管理的进一步基础知识,它们将帮助你更好地管理你的 Docker 容器。
-
容器创建:
- 使用
docker create
创建一个容器但不启动它。这允许你先配置容器(例如,设置网络和卷),然后再用docker start
命令启动。
- 使用
-
容器状态检查:
docker inspect
命令提供了关于容器配置和状态的详细信息,包括 IP 地址、使用的端口和挂载的卷。
-
容器资源限制:
- 在创建或运行容器时,可以通过各种选项限制其使用的资源,如 CPU、内存等。这对于确保容器不会消耗过多主机资源非常重要。
-
容器与主机间的数据拷贝:
docker cp
命令可以在容器和主机间拷贝文件。这在需要快速复制日志文件或其他数据时非常有用。
-
容器内部运行命令:
docker exec
命令允许你在运行中的容器内执行命令,这对于调试和管理操作非常方便。
-
容器日志管理:
- 了解如何查看和管理容器日志。
docker logs
命令可以帮助你快速定位问题。
- 了解如何查看和管理容器日志。
-
容器的优雅停止:
- 当使用
docker stop
命令时,Docker 会首先向容器发送 SIGTERM 信号,允许容器优雅地停止。如果在指定时间后容器仍未停止,Docker 会发送 SIGKILL 信号强制停止。
- 当使用
通过掌握这些高级技巧和知识,你将能够有效地管理 Docker 容器的生命周期,确保容器的稳定运行和高效管理。这些技能对于任何需要在生产环境中使用 Docker 的人员来说都是非常宝贵的。
4.1.2 重点案例:启动并管理 Python Flask 应用容器
让我们通过一个实际案例来学习如何启动并管理一个 Python Flask 应用的 Docker 容器。这个案例将覆盖从创建容器到管理其生命周期的各个阶段。
步骤 1: 准备 Flask 应用
首先,我们需要准备 Flask 应用。在你的工作目录中,创建以下文件:
-
app.py
:# app.py from flask import Flaskapp = Flask(__name__)@app.route('/') def home():return 'Welcome to the Dockerized Flask App!'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
接下来,编写一个 Dockerfile 用于构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
步骤 3: 构建 Docker 镜像
在包含 Dockerfile 的目录中,运行以下命令来构建镜像:
docker build -t flask-app .
步骤 4: 启动 Flask 应用容器
使用以下命令启动 Flask 应用的 Docker 容器:
docker run -d -p 5000:5000 --name my-flask-app flask-app
这里 -d
参数让容器在后台运行,-p
参数映射了容器和主机的端口。
步骤 5: 查看容器日志
要查看 Flask 应用的输出,可以使用:
docker logs my-flask-app
步骤 6: 停止和重启容器
若需要停止容器,可以使用:
docker stop my-flask-app
要重启已停止的容器,使用:
docker start my-flask-app
步骤 7: 清理容器
使用完容器后,可以将其删除:
docker rm my-flask-app
通过这个案例,你不仅学会了如何为 Flask 应用创建和启动 Docker 容器,还掌握了如何管理容器的基本生命周期,包括查看日志、停止、重启和删除容器。这些技能对于任何使用 Docker 部署和管理 Web 应用的开发者来说都是非常有用的。
4.1.3 拓展案例 1:调试运行中的容器
在这个案例中,我们将探索如何进入一个正在运行的 Docker 容器以进行调试。这是一项非常实用的技能,特别是当你需要诊断或解决运行时问题时。
步骤 1: 运行 Flask 应用容器
首先,确保 Flask 应用的 Docker 容器正在运行。如果尚未运行,可以参考之前的案例来启动它。
步骤 2: 进入运行中的容器
使用 docker exec
命令进入正在运行的容器。这个命令允许你在容器内部启动一个新的交互式命令行会话:
docker exec -it my-flask-app /bin/bash
这里,my-flask-app
是你的容器名称,/bin/bash
是你想在容器内部运行的 shell。对于不包含 bash 的轻量级镜像,你可能需要使用 /bin/sh
或其他 shell。
步骤 3: 在容器内执行命令
一旦进入容器,你就可以像在普通 Linux 环境中一样执行命令了。例如,你可以查看当前目录的文件列表,检查环境变量或者安装额外的调试工具:
ls -l
printenv
apt-get update && apt-get install -y curl
步骤 4: 退出容器
完成调试后,可以输入 exit
命令来离开容器。
注意:在容器内执行的任何更改(比如安装的额外软件包)都不会保存到镜像中,且只在当前容器实例中有效。
通过这个案例,你学会了如何进入正在运行的 Docker 容器并执行调试操作。这种能力对于快速定位和解决应用运行时的问题至关重要,是每位 Docker 用户必备的技能之一。
4.1.4 拓展案例 2:优雅地停止和清理容器
在这个案例中,我们将学习如何优雅地停止一个运行中的 Docker 容器,并在停止后清理容器实例。这是确保容器资源被妥善管理和释放的重要步骤。
步骤 1: 运行 Flask 应用容器
确保你的 Flask 应用容器正在运行。如果尚未启动,可以参考之前的指南来启动它。例如:
docker run -d -p 5000:5000 --name my-flask-app flask-app
步骤 2: 优雅地停止容器
当你需要停止容器时,使用 docker stop
命令。这个命令会向容器发送 SIGTERM 信号,提醒容器优雅地停止。默认情况下,Docker 会等待 10 秒让应用处理停止请求:
docker stop my-flask-app
步骤 3: 确认容器已停止
使用 docker ps -a
命令确认容器的状态。你会看到 my-flask-app
容器的状态为 Exited
。
docker ps -a
步骤 4: 清理停止的容器
停止容器后,它仍然会占用磁盘空间。为了释放这些资源,可以使用 docker rm
命令来删除容器:
docker rm my-flask-app
步骤 5: 验证容器已被删除
再次运行 docker ps -a
命令确认容器已被删除。你不应该再看到 my-flask-app
容器。
通过这个案例,你可以看到如何优雅地停止并清理 Docker 容器。这不仅是良好的资源管理实践,也是维护 Docker 环境整洁的关键步骤。掌握这些技巧可以帮助你高效地管理容器资源,保持你的 Docker 环境的清洁和有序。
通过这些案例的学习,你将能够有效地管理 Docker 容器的生命周期,从容器的诞生到退休,每一个环节都能游刃有余。掌握这些技能,你将成为 Docker 宇宙中的优秀飞行员!
4.2 容器数据管理与持久化
在 Docker 世界中,数据管理和持久化是一项至关重要的技能。它就像是给你的容器建造一个记忆盒子,即使容器消失了,记忆仍然留存。让我们深入了解如何在 Docker 中管理数据,并保证它的持久性。
4.2.1 重点基础知识
深入理解 Docker 容器的数据管理与持久化是保证数据安全和高效使用 Docker 的关键。以下是关于容器数据管理与持久化的更多基础知识,帮助你更好地理解和应用这些概念。
-
卷(Volumes)的高级管理:
- 可以在 Docker 主机上全局管理卷,包括创建、列出、删除未使用的卷等。这有助于更好地组织和清理数据。
- 卷可以在容器之间或者在 Dockerfile 中使用,为应用提供灵活性和可重用性。
-
绑定挂载的路径和权限:
- 绑定挂载时,可以指定路径和权限,例如只读挂载,以确保容器内的应用不会意外修改宿主机上的数据。
- 路径可以是相对的或绝对的,这在进行本地开发和测试时特别有用。
-
使用 Docker Compose 管理卷和挂载:
- Docker Compose 允许你在
docker-compose.yml
文件中定义和管理卷及挂载,这对于复杂应用的数据管理更加直观和方便。
- Docker Compose 允许你在
-
卷驱动的选择:
- Docker 提供了不同的卷驱动,支持各种存储需求,例如本地存储、网络存储等。根据应用的具体需求选择合适的卷驱动非常重要。
-
备份和迁移数据:
- 了解如何备份和迁移 Docker 卷中的数据是确保数据安全的关键。这包括将卷数据导出到文件系统,或者迁移到其他 Docker 主机上。
-
数据持久化的策略:
- 根据应用的特点和需求,制定合适的数据持久化策略。例如,对于数据库应用,可能需要频繁备份和高可用性的存储解决方案。
通过掌握这些高级知识,你将能够更有效地管理 Docker 容器中的数据,并确保数据的持久化和安全。这些技能对于任何需要在 Docker 环境中处理和存储重要数据的开发者或管理员来说都是非常宝贵的。
4.2.2 重点案例:使用卷存储 Python 应用数据
在这个案例中,我们将创建一个 Python Flask 应用,并使用 Docker 卷来持久化存储应用数据。这是一个常见的场景,特别是当你的应用需要保存状态或用户数据时。
步骤 1: 创建 Flask 应用
首先,我们需要准备 Flask 应用。在你的工作目录中,创建以下文件:
-
app.py
:# app.py from flask import Flask import osapp = Flask(__name__)@app.route('/') def home():with open('/data/count.txt', 'a+') as file:file.seek(0)count = file.read() or '0'count = int(count) + 1file.seek(0)file.write(str(count))file.truncate()return f'Hello, Dockerized Flask! This page has been visited {count} times.'if __name__ == '__main__':if not os.path.exists('/data'):os.makedirs('/data')app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
编写一个 Dockerfile 用于构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
步骤 3: 构建 Docker 镜像
在包含 Dockerfile 的目录中,运行以下命令来构建镜像:
docker build -t flask-app-with-volume .
步骤 4: 创建并启动容器,绑定卷
使用以下命令启动 Flask 应用的 Docker 容器,并绑定一个卷来持久化 count.txt
文件:
docker run -d -p 5000:5000 --name my-flask-app -v flask-data:/data flask-app-with-volume
这里,flask-data
是一个 Docker 卷,/data
是容器内的路径。
步骤 5: 访问和测试应用
访问 http://localhost:5000
并多次刷新页面,你将看到访问次数的增加。即使容器重启,计数也不会丢失,因为它被保存在 Docker 卷中。
通过这个案例,你学会了如何使用 Docker 卷为 Python Flask 应用提供持久化数据存储。这样即使容器被删除,卷中的数据仍然安全。这是管理涉及状态或需要持久化存储的容器化应用时的一个关键技巧。
4.2.3 拓展案例 1:使用绑定挂载进行数据持久化
在这个案例中,我们将展示如何通过绑定挂载(bind mounts)在 Docker 容器中实现数据持久化。绑定挂载是一种直接映射宿主机文件系统到容器的方式,非常适合开发环境中的快速数据共享和测试。
步骤 1: 创建 Flask 应用
首先,准备 Flask 应用。在你的工作目录中,创建 app.py
和 requirements.txt
:
-
app.py
:# app.py from flask import Flask import osapp = Flask(__name__)@app.route('/') def home():filepath = '/mnt/data/count.txt'if not os.path.exists(filepath):with open(filepath, 'w') as file:file.write('0')with open(filepath, 'r+') as file:count = int(file.read()) + 1file.seek(0)file.write(str(count))file.truncate()return f'This page has been visited {count} times.'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
创建一个 Dockerfile 用于构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
步骤 3: 构建 Docker 镜像
在包含 Dockerfile 的目录中,运行以下命令来构建镜像:
docker build -t flask-app-bind-mount .
步骤 4: 创建宿主机目录并启动容器
在宿主机上创建一个目录用于挂载:
mkdir /path/to/local/data
使用以下命令启动 Flask 应用的 Docker 容器,并通过绑定挂载连接到刚刚创建的宿主机目录:
docker run -d -p 5000:5000 --name my-flask-app -v /path/to/local/data:/mnt/data flask-app-bind-mount
步骤 5: 访问和测试应用
访问 http://localhost:5000
并多次刷新页面。检查 /path/to/local/data/count.txt
文件,你会发现页面访问次数被正确记录。
通过这个案例,你学会了如何使用绑定挂载在 Docker 容器中实现数据的持久化。这种方法对于开发环境特别有用,因为它允许你直接在宿主机上访问和修改容器内的文件,从而实现快速的开发和测试。
4.2.4 拓展案例 2:使用临时存储管理敏感数据
在这个案例中,我们将通过使用 Docker 的临时存储(tmpfs 挂载)来处理和管理敏感数据。这种方法特别适用于处理需要在容器运行时保留但不应该持久化到硬盘的敏感信息。
步骤 1: 创建 Flask 应用
创建一个简单的 Flask 应用,它会生成并存储一些敏感数据。在你的工作目录中,创建以下文件:
-
app.py
:# app.py from flask import Flask import osapp = Flask(__name__)@app.route('/') def home():sensitive_path = '/tmp/sensitive_data.txt'with open(sensitive_path, 'a+') as file:file.write("Very sensitive information\n")return 'Sensitive data written to temporary storage.'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
编写 Dockerfile 来构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
步骤 3: 构建 Docker 镜像
运行以下命令来构建 Flask 应用的 Docker 镜像:
docker build -t flask-app-tmpfs .
步骤 4: 启动 Flask 应用容器,使用 tmpfs
启动 Flask 应用的 Docker 容器,并使用 tmpfs 挂载来创建临时存储区:
docker run -d -p 5000:5000 --name my-flask-app --tmpfs /tmp flask-app-tmpfs
这个命令会创建一个名为 /tmp
的 tmpfs 挂载点,所有写入该路径的数据都只会存储在内存中。
步骤 5: 访问应用并验证临时存储
访问 http://localhost:5000
,应用会写入敏感数据到临时存储中。尽管数据写入了 /tmp/sensitive_data.txt
,但由于使用了 tmpfs,这些数据仅在内存中存在,并不会持久化到硬盘。
通过这个案例,你学会了如何在 Docker 容器中使用临时存储来处理敏感数据。这种方法在处理需要高度保密性的数据时非常有用,确保了数据的安全性,同时便于在应用重启或容器销毁时自动清理这些数据。
通过这些案例,你将能够掌握 Docker 容器中数据的管理和持久化。无论是将数据永久保存还是仅在容器运行时保留,你都有了相应的工具和知识来处理这些情况。这在构建可靠且安全的 Docker 应用时非常重要。
4.3 容器网络配置
欢迎来到 Docker 容器网络的世界!在这一章中,我们将像网络专家一样探索 Docker 容器网络的奥秘。了解容器如何通信、如何配置网络,可以帮助你更好地管理和部署容器应用。
4.3.1 重点基础知识
掌握 Docker 容器网络配置是确保容器应用顺利运行的关键。了解不同网络类型、如何连接容器以及如何隔离容器是非常重要的。以下是容器网络配置的更多基础知识,帮助你深入理解 Docker 网络的工作原理。
-
网络类型详解:
bridge
:默认网络类型,适用于单机上的容器通信。host
:移除了网络隔离,容器直接使用宿主机的网络。overlay
:用于跨多个 Docker 主机的容器通信,常用于 Docker Swarm。none
:禁用所有网络。
-
网络隔离和安全:
- Docker 网络提供了隔离机制,增强了容器之间的安全性。
- 了解如何配置网络策略,可以更有效地控制容器间的通信权限。
-
服务发现与 DNS:
- 在自定义网络中,Docker 提供了内建的 DNS 服务,容器可以通过服务名称互相发现和通信。
- 这消除了容器间通信中硬编码 IP 地址的需要。
-
网络命令行工具:
- Docker 提供了一系列命令行工具来管理网络,如
docker network create
、docker network ls
、docker network inspect
等。 - 这些工具对于诊断网络问题、审查网络配置等非常有用。
- Docker 提供了一系列命令行工具来管理网络,如
-
端口映射与暴露:
- 除了使用
-p
参数进行端口映射,还可以使用EXPOSE
指令在 Dockerfile 中声明容器监听的端口,增加文档化和清晰度。
- 除了使用
-
容器连接的最佳实践:
- 使用自定义网络而非旧式的
--link
方法来连接容器。 - 在复杂应用中,考虑使用 Docker Compose 来管理容器和网络,简化部署和配置。
- 使用自定义网络而非旧式的
通过掌握这些高级知识,你将能够更加精确地控制你的 Docker 容器网络,提升应用的连通性和安全性。这对于构建可扩展和安全的容器化应用至关重要。
4.3.2 重点案例:配置 Python Flask 应用的网络
在这个案例中,我们将通过配置网络来部署一个 Python Flask 应用。这个过程不仅包括容器的创建和运行,还涉及到如何通过 Docker 网络让应用能够被外界访问。
步骤 1: 准备 Flask 应用
首先,创建 Flask 应用。在你的工作目录中,创建 app.py
和 requirements.txt
:
-
app.py
:# app.py from flask import Flaskapp = Flask(__name__)@app.route('/') def home():return 'Welcome to the Dockerized Flask App accessible from outside!'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
接下来,编写 Dockerfile 来构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
EXPOSE 5000
CMD ["python", "app.py"]
这里的 EXPOSE 5000
命令是用于文档化,表明容器会在 5000 端口上监听连接。
步骤 3: 构建 Docker 镜像
在包含 Dockerfile 的目录中,运行以下命令来构建镜像:
docker build -t flask-app-network .
步骤 4: 启动 Flask 应用容器,并映射端口
使用以下命令启动 Flask 应用的 Docker 容器,并映射端口以使应用可从外部访问:
docker run -d -p 8000:5000 --name my-flask-app flask-app-network
这里,我们将容器的 5000 端口映射到宿主机的 8000 端口。
步骤 5: 访问 Flask 应用
现在,你可以通过访问 http://localhost:8000
来查看 Flask 应用。你应该能看到欢迎消息。
通过这个案例,你学会了如何为 Flask 应用配置 Docker 网络,使得应用不仅在容器内运行,还能被外部网络访问。这是部署 Web 应用时的一个常见需求,了解如何配置和管理 Docker 网络对于确保应用的可访问性至关重要。
4.3.3 拓展案例 1:容器间通信
在这个案例中,我们将演示如何使两个 Docker 容器之间进行通信。我们将部署两个 Flask 应用,一个作为前端服务,另一个作为后端 API,演示它们如何在 Docker 中相互通信。
步骤 1: 创建前端 Flask 应用
首先,创建一个前端 Flask 应用。在你的工作目录中,创建 frontend.py
和 requirements.txt
:
-
frontend.py
:# frontend.py import requests from flask import Flaskapp = Flask(__name__)@app.route('/') def home():response = requests.get("http://backend:5000/api")return f'Frontend calling backend: {response.text}'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask requests
步骤 2: 创建后端 Flask API
创建一个后端 Flask 应用。在你的工作目录中,创建 backend.py
:
-
backend.py
:# backend.py from flask import Flaskapp = Flask(__name__)@app.route('/api') def api():return 'Hello from Backend!'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
步骤 3: 创建 Dockerfile
对于前端和后端,可以使用相同的 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "frontend.py"]
步骤 4: 构建 Docker 镜像
分别为前端和后端构建 Docker 镜像:
docker build -t flask-frontend-app -f Dockerfile .
docker build -t flask-backend-app -f Dockerfile .
步骤 5: 创建自定义网络
创建一个 Docker 自定义网络来实现容器间通信:
docker network create flask-network
步骤 6: 启动 Flask 容器
在创建的网络中启动两个 Flask 容器:
docker run -d --name frontend --network flask-network -p 8000:5000 flask-frontend-app
docker run -d --name backend --network flask-network flask-backend-app
步骤 7: 访问前端服务
现在,你可以通过访问 http://localhost:8000
来测试前端服务是否能成功调用后端 API。
通过这个案例,你学会了如何在 Docker 中创建自定义网络,并在此网络下运行多个容器以实现容器间的通信。这种方法对于部署由多个服务组成的应用非常有效,能够保证服务之间的高效通信。
4.3.4 拓展案例 2:使用 Docker Compose 管理网络
在这个案例中,我们将使用 Docker Compose 来管理一个包含 Flask 应用和数据库服务的网络。Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用。通过一个 YAML 文件,可以配置应用服务、网络和卷等资源。
步骤 1: 创建 Flask 应用
首先,创建一个 Flask 应用。在你的工作目录中,创建以下文件:
-
app.py
:# app.py from flask import Flask, jsonify import osapp = Flask(__name__)@app.route('/') def home():return jsonify({"message": "Hello from Flask App!"})if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
-
requirements.txt
:flask
步骤 2: 编写 Dockerfile
创建 Dockerfile 来构建 Flask 应用的镜像:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
步骤 3: 创建 Docker Compose 文件
编写 docker-compose.yml
文件来定义 Flask 应用和数据库服务:
version: '3'services:web:build: .ports:- "5000:5000"networks:- app-networkdb:image: postgresenvironment:POSTGRES_DB: exampledbPOSTGRES_USER: exampleuserPOSTGRES_PASSWORD: examplepassnetworks:- app-networknetworks:app-network:
这里,我们定义了两个服务:web
(Flask 应用)和 db
(Postgres 数据库)。它们都连接到一个名为 app-network
的自定义网络。
步骤 4: 使用 Docker Compose 启动服务
运行以下命令来构建镜像并启动服务:
docker-compose up
这个命令会根据 docker-compose.yml
文件的定义来启动 Flask 应用和数据库服务。
步骤 5: 访问 Flask 应用
现在,你可以通过访问 http://localhost:5000
来测试 Flask 应用。它应该能正常响应,尽管它目前还未与数据库交互。
通过这个案例,你学会了如何使用 Docker Compose 来管理包含多个服务的应用。Docker Compose 不仅简化了容器和网络的管理,还使得整个部署过程更加清晰和一致。这对于开发和测试复杂的多容器应用非常有用。
通过这些案例,你将了解 Docker 容器网络的配置和管理,掌握如何在容器化环境中有效地实现服务间的通信。无论是简单的单容器应用还是复杂的多容器部署,合理的网络配置都是保证容器正常工作的关键。
相关文章:
《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)
文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例:启动并管理 Python Flask 应用容器4.1.3 拓展案例 1:调试运行中的容器4.1.4 拓展案例 2:优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…...
【人脸朝向识别与分类预测】基于PNN神经网络
课题名称:基于PNN神经网络的人脸朝向识别分类 版本日期:2024-02-20 运行方式:直接运行PNN0503.m文件 代码获取方式:私信博主或 QQ:491052175 模型描述: 采集到一组人脸朝向不同角度时的图像,图像来自不…...
【Python笔记-设计模式】组合模式
一、说明 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。 (一) 解决问题 处理树形结构:可以很好地处理树形结构的数据,使得用户可以统一对待单个对象和对象组合。统一接…...
51单片机学习(5)-----蜂鸣器的介绍与使用
前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 目录 一. 蜂鸣器的介绍 1.蜂鸣器介绍 2.压电式蜂鸣器 (无源…...
-bash: /root/.ssh/authorized_keys: Read-only file system
问题背景 由于跳板机不支持 ssh-copy-id 命令,为了配置免密登录,考虑在服务器上手动使用 cat 命令写入跳板机公钥 cat <<EOL >> ~/.ssh/authorized_keys [Your public key] EOL但却出现了以下错误 -bash: /root/.ssh/authorized_keys: Re…...
3,设备无关位图显示
建立了一个类Dib Dib.h #pragma once #include “afx.h” class CDib :public CObject { public: CDib(); ~CDib(); char* GetFileName(); BOOL IsValid(); DWORD GetSize(); UINT GetWidth(); UINT GetHeight(); UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetDat…...
转前端了!!
大家好,我是冰河~~ 没错,为了更好的设计和开发分布式IM即时通讯系统,也为了让大家能够直观的体验到分布式IM即时通讯系统的功能,冰河开始转战前端了。也就是说,整个项目从需求立项到产品设计,从架构设计到…...
RESTful API如何使用它构建 web 应用程序。
链接:华为机考原题 RESTful API(Representational State Transfer)是一种基于网络的软件架构风格,用于设计和访问网络资源。它是一种轻量级、灵活、可扩展的架构,常用于构建Web应用程序和服务。 使用RESTful API构建Web应用程序的步骤如下&…...
现在学Oracle是49年入国军么?
今天周末,不聊技术,聊聊大家说的最多的一个话题 先说明一下,防止挨喷😆 本人并不是职业dba,对数据库就是爱好,偶尔兼职,以下仅个人观点分析,如有不同观点请轻喷,哈哈&…...
【回溯】组合问题||
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,…...
【c语言】字符函数和字符串函数(下)
前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,…...
基于Java的艺培管理解决方案
✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…...
Python算法题集_实现 Trie [前缀树]
Python算法题集_实现 Trie [前缀树] 题208:实现 Trie (前缀树)1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【定义数据类默认字典】2) 改进版一【初始化字典无额外类】3) 改进版二【字典保存结尾信息无额外类】 4. 最优算法5. 相关…...
pytorch简单新型模型测试参数
import torch from torch.nn import Conv2d,MaxPool2d,Sequential,Flatten,Linear import torchvision import torch.optim.optimizer from torch.utils.data import DataLoader,dataset from torch import nn import torch.optim.optimizer# 建模 model nn.Linear(2,1)#损失 …...
Unity中URP下实现水体(水面高光)
文章目录 前言一、实现高光反射原理1、原理:2、公式: 二、实现1、定义 _SpecularColor 作为高光反射的颜色2、定义 _SpecularIntensity 作为反射系数,控制高光反射的强度3、定义 _Smoothness 作为高光指数,用于模型高光范围4、模拟…...
26.HarmonyOS App(JAVA)列表对话框
列表对话框的单选模式: //单选模式 // listDialog.setSingleSelectItems(new String[]{"第1个选项","第2个选项"},1);//单选 // listDialog.setOnSingleSelectListener(new IDialog.ClickedListener() { // Override …...
五种主流数据库:常用字符函数
SQL 字符函数用于字符数据的处理,例如字符串的拼接、大小写转换、子串的查找和替换等。 本文比较五种主流数据库常用数值函数的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 字符函数函数功能MySQLOracleSQL ServerPostgreSQ…...
软考笔记--企业资源规划和实施
企业资源是指企业业务活动和战略运营的事物,包括人、财和物,也包括信息资源,同时也包括企业的内部和外部资源。企业资源可以归纳为物流,资金流和信息流。企业资源规划(ERP)是只建立在信息技术基础上&#x…...
React歌词滚动效果(跟随音乐播放时间滚动)
首先给audio绑定更新时间事件 const updateTime e > {console.log(e.target.currentTime)setCurrentTime(e.target.currentTime);};<audiosrc{currentSong.url}ref{audio}onCanPlay{ready}onEnded{end}onTimeUpdate{updateTime}></audio>当歌曲播放时间改变的时…...
java面试题之mybatis篇
什么是ORM? ORM(Object/Relational Mapping)即对象关系映射,是一种数据持久化技术。它在对象模型和关系型数据库直接建立起对应关系,并且提供一种机制,通过JavaBean对象去操作数据库表的数据。 MyBatis通过…...
Java的编程之旅19——使用idea对面相对象编程项目的创建
在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块,点击“”,再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写,再点击下面的Finish 点Apply或OK均可 右键src…...
docker build基本命令
背景 我们经常会构建属于我们应用自己的镜像,这种情况下编写dockerfile文件不可避免,本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令: env指令用于设置shell的环境变量&am…...
nginx高级配置详解
目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…...
小程序--分包加载
分包加载是优化小程序加载速度的一种手段。 一、为什么进行分包 小程序限制单个包体积不超过2M; 分包可以优化小程序页面的加载速度。 二、启用/使用分包语法subPackages subPackages:下载app.json文件中 root:分包所在的目录 pages&#x…...
R语言【base】——writeLines()
Package base version 4.2.0 Description 向连接写入文本行。 Usage writeLines(text, con stdout(), sep "\n", useBytes FALSE) Arguments 参数【text】:一个字符向量。 参数【con】:一个 connection 对象 或 一个字符串。 参数【se…...
微信小程序-人脸检测
微信小程序的人脸检测功能,配合蓝牙,配合ESP32 可以实现一些有趣的玩具 本文先只说微信小程序的人脸检测功能 1、人脸检测使用了摄像头,就必须在用户隐私权限里面声明。 修改用户隐私声明后,还需要等待审核,大概一天 …...
微信小程序自制动态导航栏
写在前面 关于微信小程序导航栏的问题以及解决办法我已经在先前的文章中有提到,点击下面的链接即可跳转~ 🤏微信小程序自定义的导航栏🤏 在这篇文章中我们需要做一个这样的导航栏!先上效果图 👇👇…...
金融知识分享系列之:五日线
金融知识分享系列之:五日线 一、股票均线二、五日线三、五日线加量能三、五日线案例四、五日线案例五、五日线案例六、五日线案例七、五日线案例八、五日线案例 一、股票均线 股票均线是一种用于平滑股票价格的指标。它是根据一段时间内的股票价格计算得出的平均值…...
回归测试详解
🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 什么是回归测试 回归测试(Regression testi…...
渲染效果图有哪几种分类?效果图为什么用云渲染更快
云渲染利用了集群化的云端服务器资源,通过并行计算充分发挥了高性能硬件的优势,显著提升了渲染的速度。这一技术特别适用于处理规模庞大或细节丰富的渲染任务,在缩短项目完成时间方面表现卓越。无论是用于为建筑提供精确的可视化效果图&#…...
网站体验步骤/seo优化价格
这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php使用curl抓取远程url的方法。分享给大家供大家参考。具体如下: cURL是一个非常有用的php库,可以用来连接不通类…...
专业做域名的网站/世界企业排名500强
1 Android手机(N5X 6.0.1)正在运行BLE服务器,另一个(N5X O)正在订阅.可以启用特征通知,但是在写描述符部分,我一直得到133.Server.javaprivate void createServer() {bluetoothGattServer bluetoothManager.openGattServer(this, serverCallback);BluetoothGattService servic…...
郑州门户网站建设哪家好/宁波最好的seo外包
如何让workBench识别到config下的BSP包 问题:在vxworks6.8(workBench3.2)或者vxworks6.9(workBench3.3)下建立vxworks Image Project时,如何让workBench识别BSP并自动添加。Example:如下图,建立vxworks Image Project工程时 如何在BSP:栏识别到petSbcP2010_AAAAAAAAA(…...
直播是网站怎么做/今天的重要新闻
getchar()的用法,部分内容参考百度百科 getchar()函数功能是从stdio中读字符 注:getchar有一个int型的返回值,当程序调用getcahr时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回…...
wordpress boombox/哪些网站可以发广告
一 操作 1.1 描述 一个项目中有多个java类,希望将不同类的输出日志,输入到不同的文件当中,能否实现? 答案是:ofcourse! come on! 1.2 配置如下: 1.logback配置日志输出格式 &l…...
起诉网站建设公司拖延交付/网推和地推的区别
MATLAB函数文件是指可以定义输入参数和返回输出变量的M文件。本文介绍通过建立函数文件(Function)来求解一元二次方程的方法。工具/材料MATLABFunction操作方法01第一,本文要求解的一元二次方程如下图,共三个。02第二,启动MATLAB,…...