Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟
📖 简介
在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深受开发者们的喜爱。本文将带你从零开始,逐步掌握 Docker 的安装、配置以及日常使用技巧,并结合实际案例为你提供一份详实的 Docker 使用指南。无论你是初学者还是有一定经验的开发者,都能从中受益!🚀
🔧 目录
- 🚀 **Docker 入门与实战:从安装到容器管理的完整指南** 🌟
- 📖 **简介**
- 🛠 **安装 Docker**
- **1. 更新系统并安装依赖**
- **2. 添加 Docker 官方 GPG 密钥**
- **3. 设置 Docker 存储库**
- **4. 安装 Docker 引擎**
- **5. 查看 Docker 和 Docker Compose 版本**
- **6. 启动 Docker 服务**
- **方法 1:使用 `service` 命令**
- **方法 2:使用 `systemctl` 命令**
- **7. 验证安装**
- **8. 设置 Docker 服务开机自启**
- 📊 **Docker 常用命令**
- **启动容器**
- **基础设置**
- **网络设置**
- **容器的重启策略**
- **重启策略对比表**
- **设置容器的重启策略**
- 💾 **镜像与容器管理**
- **1. 查询镜像**
- **2. 拉取镜像**
- **3. 删除镜像**
- **4. 启动容器**
- **5. 进入容器**
- **6. 复制文件**
- **7. 加载镜像**
- **8. 创建新镜像**
- **9. 保存镜像**
- **10. 挂载目录**
- **11. 重命名镜像**
- **12. 退出容器**
- ⚙️ **解决常见问题**
- 1. 网络超时问题
- **配置 DNS**
- **修改 Docker 配置**
- **Docker 配置文件解释**
- **Docker 镜像源列表**
- 2. 解决 GPG 公钥缺失问题
- **适用场景**
- **如果问题仍未解决**
- 3. 解决 Docker 权限问题
- **步骤 1:创建 `docker` 组**
- **步骤 2:将当前用户添加到 `docker` 组**
- **步骤 3:注销并重新登录**
- **步骤 4(可选):立即激活组更改**
- **步骤 5:验证权限配置**
- **注意事项**
- 4. 配置 Docker 代理以登录 Docker Hub
- **1. 创建 Docker 服务目录和代理配置文件**
- **2. 配置代理环境变量**
- **3. 重新加载配置并重启 Docker 服务**
- **4. 验证代理配置是否生效**
- **测试 1:登录 Docker Hub**
- **测试 2:拉取镜像**
- **5. (可选):排除特定地址的代理**
- **注意事项**
- 5. 解决 Docker 容器无法启动时的调试与修复方法
- **1. 查看容器日志**
- **2. 检查容器配置**
- **3. 使用临时容器挂载故障容器的卷**
- **4. 直接编辑容器文件系统**
- 方法 1:挂载容器的文件系统
- 方法 2:直接修改宿主机上的文件
- **5. 提交容器为镜像并重新启动**
- **6. 删除并重新创建容器**
- **避免类似问题的建议**
- (1) **挂载代码目录**
- (2) **分离启动逻辑**
- (3) **定期提交更改**
- 📋 **Docker Compose 命令详解**
- **Docker Compose 常用选项**
- 🌟 **实战案例:运行 Flask 应用**
- **1. 启动容器**
- **重启策略**
- **2. 进入容器**
- **3. 制作启动脚本**
- **4. 保存和加载镜像**
- **保存镜像**
- **加载镜像**
- **从容器创建新镜像**
- **5. 挂载目录**
- **6. 退出容器**
- 📚 **参考链接**
- 🎉 **总结**
🛠 安装 Docker
1. 更新系统并安装依赖
在安装 Docker 之前,确保你的系统是最新的,并安装必要的依赖包。
sudo apt-get update
sudo apt-get install ca-certificates curl
2. 添加 Docker 官方 GPG 密钥
为了确保下载的软件包安全,我们需要添加 Docker 的官方 GPG 密钥并设置权限
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
如果遇到网络问题、防火墙限制或 SSL 配置问题,可以使用国内镜像源:
curl: (35) OpenSSL SSL_connect: 连接被对方重设 in connection to download.docker.com:443使用国内镜像源下载 GPG 密钥。例如,清华大学开源镜像站:
sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
3. 设置 Docker 存储库
接下来,我们将 Docker 的存储库添加到系统的 APT 源列表中。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. 安装 Docker 引擎
更新包索引后,安装 Docker Engine 和相关工具。
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5. 查看 Docker 和 Docker Compose 版本
在安装完成后,可以通过以下命令验证 Docker 和 Docker Compose 是否正确安装并查看其版本信息:
docker --version 或 docker -v
输出示例:
Docker version 27.5.1, build 9f9e405
如果你使用的是新版 Docker Compose(从 Docker Desktop 3.4.0 和 Docker Engine 20.10.13 开始,Docker Compose 已被集成到 Docker CLI 中),可以使用以下命令查看版本:
docker compose version
输出示例:
Docker Compose version v2.32.4
注意:旧版独立安装的 Docker Compose 使用
docker-compose --version
查看版本。
6. 启动 Docker 服务
安装完成后,Docker 服务通常会默认自启。如果未启动,可以通过以下命令手动启动 Docker 服务。
方法 1:使用 service
命令
sudo service docker start # 启动 Docker 服务
sudo service docker status # 查询 Docker 服务状态
方法 2:使用 systemctl
命令
sudo systemctl start docker.service # 启动 Docker 服务
sudo systemctl status docker.service # 查询 Docker 服务状态
两种方法的区别:
service
命令:这是一个较老的服务管理工具,兼容性较好,适用于 SysVinit 系统(如较旧的 Ubuntu 版本)。systemctl
命令:这是 systemd 系统的服务管理工具,适用于现代 Linux 发行版(如 Ubuntu 16.04 及更高版本)。推荐在支持 systemd 的系统中使用systemctl
,因为它功能更强大且更灵活。
7. 验证安装
通过运行一个简单的测试镜像来验证 Docker 是否安装成功。
sudo docker run hello-world
如果一切顺利,你将看到类似以下的输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
8. 设置 Docker 服务开机自启
为了确保 Docker 服务在宿主机启动时自动运行,需要将其设置为开机自启。以下是具体操作步骤:
-
检查 Docker 服务状态
systemctl status docker
-
启用 Docker 服务开机自启
如果未启用开机自启,执行以下命令:sudo systemctl enable docker
-
验证设置是否生效
重启宿主机后,检查 Docker 服务是否已自动启动:systemctl is-enabled docker
输出示例:
enabled
📊 Docker 常用命令
命令 | 描述 |
---|---|
docker --version 或 docker -v | 查看 Docker 的版本信息 |
docker images | 查看本地所有镜像 |
docker pull <image_name> | 从 Docker Hub 拉取镜像 |
docker rmi <image_id> | 删除本地镜像 |
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有容器(包括已停止的) |
docker run -it <image_id> | 启动一个新的容器并进入交互模式 |
docker start <container_id> | 启动已停止的容器 |
docker stop <container_id> | 停止正在运行的容器 |
docker rm <container_id> | 删除容器 |
docker restart <container_id> | 重启容器 |
docker exec -it <container_id> /bin/bash [-c '执行的命令'] | 进入正在运行的容器内部并执行命令 |
启动容器
启动一个新的容器时,可以使用以下命令,并根据需要设置容器名称、运行模式、伪终端分配和端口映射等选项:
docker run [OPTIONS] <image_id>
基础设置
-
指定容器名称:
--name="name"
为容器指定一个名称。例如:docker run --name=my_container <image_id>
-
后台运行:
-d
后台运行容器,并返回容器 ID。例如:docker run -d <image_id>
-
前台运行:
-i
和-t
前台:-i
: 以交互模式运行容器,通常与-t
一起使用。是否分配伪终端:
-t
: 为容器重新分配一个伪输入终端,通常与-i
同时使用例如:
docker run -it <image_id> /bin/bash
网络设置
-
端口映射:
-p
指定主机和容器之间的端口映射关系。例如:docker run -p 8000:8000 <image_id>
容器的重启策略
容器的重启策略(RestartPolicy
)是一个非常重要的配置项,它决定了容器在退出或宿主机重启时的行为。以下是对不同重启策略的详细说明:
重启策略对比表
策略名称 | 行为描述 |
---|---|
no | 默认值,容器不会自动重启。 |
on-failure | 仅在容器以非零退出码退出时重启。可指定最大重试次数(如 on-failure:5 )。 |
always | 无论容器因何种原因停止,都会自动重启。 |
unless-stopped | 总是重启容器,除非容器被手动停止。 |
设置容器的重启策略
-
创建容器时设置重启策略
在运行容器时,可以通过--restart
参数设置重启策略。例如:docker run -d --name my_container --restart always my_image
上述命令将容器的重启策略设置为
always
,即无论容器因何种原因停止,都会自动重启。 -
修改现有容器的重启策略
如果容器已经创建,可以通过docker update
命令修改其重启策略。例如:docker update --restart always my_container
-
验证容器的重启策略
使用以下命令查看容器的重启策略:docker inspect my_container | grep -A 5 RestartPolicy
输出示例:
"RestartPolicy": {"Name": "always","MaximumRetryCount": 0 },
💾 镜像与容器管理
1. 查询镜像
查看本地所有镜像:
docker images
2. 拉取镜像
从 Docker Hub 拉取指定镜像,例如 hello-world
:
docker pull hello-world
3. 删除镜像
删除本地镜像(需要先停止并删除相关容器):
docker rmi <image_id>
4. 启动容器
启动一个新的容器,并指定名称和端口映射:
docker run -it -p 8000:8000 --name my_container <image_id> /bin/bash
5. 进入容器
进入正在运行的容器并执行命令:
docker exec -it <container_id> /bin/bash
6. 复制文件
在容器和主机之间复制文件或目录:
# 将容器内的文件复制到主机
docker cp <container_id>:/path/to/file /host/path/
# 将主机上的文件复制到容器内
docker cp /host/path/file <container_id>:/path/to/
7. 加载镜像
在目标计算机上加载镜像:
docker load -i <镜像文件>.tar
8. 创建新镜像
将现有容器保存为一个新的镜像:
docker commit -m "<提交信息>" -a "<作者>" <容器ID> <新镜像名称>
9. 保存镜像
将镜像保存为 .tar
文件:
docker save -o <输出文件名>.tar <镜像名称>
10. 挂载目录
通过 -v
参数挂载本地目录到容器中:
docker run [OPTIONS] -v [本地目录]:[容器目录] IMAGE[:TAG] /bin/bash
例如:
docker run -v /home/user/data:/app/data my_image:latest /bin/bash
11. 重命名镜像
将镜像重新命名:
docker tag IMAGE[:TAG] TARGET[:TAG]
例如:
docker tag my_image:latest my_image:v1.0
12. 退出容器
退出容器时,可以使用以下命令:
exit
⚙️ 解决常见问题
1. 网络超时问题
如果你在拉取镜像时遇到网络超时问题(如下所示),可以尝试配置 DNS 或使用国内镜像源。
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
配置 DNS
编辑 /etc/resolv.conf
文件,添加以下内容以使用公共 DNS 服务器:
nameserver 114.114.114.114 # 国内常用 DNS
nameserver 8.8.8.8 # Google 公共 DNS
注意:某些系统可能会自动覆盖
/etc/resolv.conf
文件的更改。如果发现配置被重置,请检查网络管理工具或相关服务配置。
修改 Docker 配置
编辑 /etc/docker/daemon.json
文件,添加国内镜像源以加速镜像拉取:
{"registry-mirrors": ["https://x9r52uz5.mirror.aliyuncs.com", "https://dockerhub.icu", "https://docker.chenby.cn", "https://docker.1panel.live", "https://docker.awsl9527.cn", "https://docker.anyhub.us.kg", "https://dhub.kubesre.xyz" ],"max-concurrent-downloads": 10, "max-concurrent-uploads": 5, "default-shm-size": "1G", "debug": true, "experimental": false
}
注释问题 :
JSON 文件本身不支持注释(如 // 或 /* */)。虽然某些工具可能允许注释,但 Docker 不会解析带有注释的 daemon.json 文件。
并且在 JSON 中,最后一个键值对后面不能有逗号。
Docker 配置文件解释
配置项 | 值 | 说明 |
---|---|---|
registry-mirrors | ["https://vy2wneyx.mirror.aliyuncs.com", "https://dockerhub.icu", ...] | 镜像加速地址列表,用于加速 Docker Hub 的镜像拉取。 |
max-concurrent-downloads | 10 | 最大并发下载数,控制同时下载的层数量。 |
max-concurrent-uploads | 5 | 最大并发上传数,控制同时上传的层数量。 |
default-shm-size | "1G" | 容器默认共享内存大小,建议设置为较大的值以避免内存不足问题。 |
debug | true | 是否启用调试模式,启用后会输出更详细的日志信息。 |
experimental | false | 是否启用实验性功能,建议保持禁用状态以确保稳定性。 |
Docker 镜像源列表
镜像源地址 | 说明 |
---|---|
https://<阿里云加速器ID>.mirror.aliyuncs.com | 阿里云官方镜像,稳定且速度快 |
https://dockerhub.icu | 第三方镜像,适合国内用户 |
https://docker.chenby.cn | 社区维护镜像,更新频率较高 |
https://docker.1panel.live | 开源项目提供的镜像服务 |
https://docker.awsl9527.cn | AWS 相关镜像,适合 AWS 用户 |
https://docker.anyhub.us.kg | 多地区镜像,支持全球访问 |
https://dhub.kubesre.xyz | Kubernetes 社区推荐镜像 |
重启 Docker 服务以应用更改:
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 解决 GPG 公钥缺失问题
即使更换了国内镜像源,仍可能遇到以下错误:
由于没有公钥,无法验证下列签名
这种问题通常是由于系统缺少用于验证软件包签名的 GPG 公钥导致的。此时可以尝试手动导入缺失的 GPG 公钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7EA0A9C3F273FCD8
说明:
hkp://keyserver.ubuntu.com:80
:指定密钥服务器地址。7EA0A9C3F273FCD8
:需要导入的 GPG 公钥 ID(根据实际错误信息替换为对应的公钥 ID)。
适用场景
该命令通常用于解决因缺少公钥导致的软件包验证失败问题。例如,在安装 Docker 或其他软件时,可能会因为公钥缺失而无法完成安装。
如果问题仍未解决
- 确保网络连接正常,并能够访问密钥服务器。
- 如果仍然无法解决问题,可以尝试跳过此步骤或参考其他解决方案(如手动下载并安装相关软件包)。
3. 解决 Docker 权限问题
默认情况下,Docker 命令需要 root
权限才能运行。为了避免每次使用 Docker 命令时都需要加 sudo
,可以将当前用户添加到 docker
用户组中。以下是具体步骤:
步骤 1:创建 docker
组
如果系统中尚未创建 docker
组,可以通过以下命令创建:
sudo groupadd docker
注意:大多数情况下,安装 Docker 时会自动创建
docker
组。如果已经存在,此命令不会产生任何影响。
步骤 2:将当前用户添加到 docker
组
将当前用户添加到 docker
组中,以便无需 sudo
即可运行 Docker 命令:
sudo usermod -aG docker $USER
$USER
是当前登录用户的环境变量。如果你希望为其他用户添加权限,请将$USER
替换为实际的用户名。
步骤 3:注销并重新登录
为了使组更改生效,需要注销并重新登录系统。在注销之前,请确保保存并关闭所有打开的应用程序,然后执行以下命令:
logout 或 exit
重新登录后,组成员身份将更新。
步骤 4(可选):立即激活组更改
如果你不想注销并重新登录,可以通过以下命令在当前会话中立即激活组更改:
newgrp docker
步骤 5:验证权限配置
运行以下命令验证是否成功将用户添加到 docker
组,并确认无需 sudo
即可运行 Docker 命令:
docker run hello-world
如果一切正常,你将看到类似以下的输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
注意事项
- 虚拟机环境:如果你在虚拟机中运行 Linux,可能需要重启虚拟机以使组更改完全生效。
- 安全性:将用户添加到
docker
组相当于赋予了该用户root
权限,因为 Docker 容器可以访问主机的资源。请谨慎操作,尤其是在多用户环境中。
4. 配置 Docker 代理以登录 Docker Hub
在某些情况下,Docker 的网络连接可能会受到防火墙或代理限制的影响,尤其是在需要登录 Docker Hub 时(如下所示)。
docker login
USING WEB-BASED LOGIN
To sign in with credentials on the command line, use 'docker login -u <username>'
Your one-time device confirmation code is: VGDP-KMZS
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate
Waiting for authentication in the browser…Error response from daemon: Get "https://registry-1.docker.io/v2/ ": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
为了解决这些问题,可以通过配置 Docker 的代理设置来确保网络请求能够正常通过。以下是具体操作步骤:
1. 创建 Docker 服务目录和代理配置文件
首先,我们需要创建一个专门用于存放 Docker 服务配置的目录,并在其中添加代理配置文件。
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
2. 配置代理环境变量
在打开的 http-proxy.conf
文件中,添加以下内容(请根据实际代理地址和端口进行修改):
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
说明:
HTTP_PROXY
和HTTPS_PROXY
分别用于指定 HTTP 和 HTTPS 请求的代理地址。- 如果你的代理需要身份验证,可以在地址中包含用户名和密码,例如:
http://username:password@proxy-server:port
。
3. 重新加载配置并重启 Docker 服务
完成代理配置后,需要重新加载 systemd 配置并重启 Docker 服务以使更改生效。
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 验证代理配置是否生效
为了确保代理配置已正确应用,可以尝试登录 Docker Hub 或拉取镜像进行测试。
测试 1:登录 Docker Hub
docker login -u your_username
如果代理配置正确,您应该能够成功登录,而不会遇到网络超时或连接失败的问题。
测试 2:拉取镜像
docker pull hello-world
如果镜像能够顺利下载,则说明代理配置已生效。
5. (可选):排除特定地址的代理
如果您希望某些地址(如本地镜像仓库或内网服务)不通过代理访问,可以在配置文件中添加 NO_PROXY
环境变量。例如:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
说明:
NO_PROXY
用于指定不需要通过代理访问的地址列表。- 地址可以是域名、IP 地址或通配符(如
.example.com
)。
注意事项
- 代理地址的有效性:确保代理地址和端口正确无误,并且代理服务正在运行。
- 安全性:如果代理需要身份验证,请确保用户名和密码的安全性,避免泄露敏感信息。
- 多用户环境:在多用户环境中使用代理时,请确保所有用户都能正确访问代理服务。
5. 解决 Docker 容器无法启动时的调试与修复方法
在使用 Docker 的过程中,可能会遇到容器因某些错误而无法启动的情况。这种问题可能由配置文件错误、端口冲突、依赖缺失等原因引起 [[1]]。当 docker start
命令失败时,您可能无法直接使用 docker exec
进入容器进行调试。不过,以下几种方法可以帮助您快速定位并解决问题。
1. 查看容器日志
首先,查看容器的日志是定位问题的关键步骤。通过日志,您可以了解容器启动失败的具体原因,例如配置文件错误、依赖服务未启动等。
docker logs <container_name_or_id>
示例输出:
Error: Port 8080 is already in use.
如果日志显示端口被占用,可以通过修改端口映射或清理占用端口的进程来解决问题 [[4]]。
2. 检查容器配置
使用 docker inspect
命令可以查看容器的详细配置信息,包括启动命令、挂载的卷、环境变量等。这些信息有助于排查潜在问题。
docker inspect <container_name_or_id>
查看启动命令:
docker inspect <container_id> | grep Cmd
如果发现启动命令有问题,可以重新创建容器并指定正确的命令。
3. 使用临时容器挂载故障容器的卷
如果您的容器使用了数据卷来存储持久数据,可以通过创建一个新的临时容器来挂载故障容器的数据卷,并在其中进行调试。
docker run -it --volumes-from <faulty_container> --entrypoint /bin/bash <image_name>
示例:
docker run -it --volumes-from LuyeChat --entrypoint /bin/bash ubuntu
--volumes-from
参数允许新容器挂载故障容器的数据卷。<image_name>
是与原容器相同或兼容的镜像(例如ubuntu
)。/bin/bash
是指定的入口点,用于启动交互式终端。
在新容器中,您可以访问和修改故障容器的文件系统。
4. 直接编辑容器文件系统
对于普通存储,可以直接找到容器存储的文件系统(通常位于 /var/lib/docker/overlay2/<container_id>/diff
),手动更改相关配置。
方法 1:挂载容器的文件系统
通过挂载容器的文件系统路径到一个临时容器中,您可以直接修改文件。
docker run -it --rm -v /var/lib/docker/overlay2/<container_id>/diff:/mnt ubuntu bash
/var/lib/docker/overlay2/<container_id>/diff
是原容器的文件系统路径。/mnt
是新容器中挂载的目录。ubuntu
是一个基础镜像,用于提供操作环境。
进入后,您可以直接修改挂载的文件。
方法 2:直接修改宿主机上的文件
如果您知道容器的文件存储位置,可以直接在宿主机上修改文件。但请注意,这种方法可能会导致不稳定性或数据丢失,务必在备份的情况下进行操作 [[5]]。
5. 提交容器为镜像并重新启动
如果容器可以短暂启动(即使很快退出),可以将其保存为镜像,然后基于该镜像启动一个新的容器进行调试。
docker commit <container_id> temp_image
docker run -it temp_image bash
在新容器中,您可以修改代码或配置文件。
6. 删除并重新创建容器
如果以上方法都无法解决问题,可以考虑删除容器并重新创建。
docker rm <container_id>
docker run [options] <image_name>
注意:删除容器会导致容器内的数据丢失,因此在删除前确保重要数据已备份。
避免类似问题的建议
为了避免未来再次出现类似问题,可以采取以下措施:
(1) 挂载代码目录
将代码目录挂载到宿主机上,而不是直接打包到镜像中。这样可以在宿主机上修改代码,而无需重新构建镜像或重启容器。
docker run -v /host/path/to/code:/container/path/to/code <image_name>
(2) 分离启动逻辑
在容器的启动脚本中添加检查逻辑,确保即使代码有问题,容器也能进入调试模式。
#!/bin/bash
if [ ! -f "/path/to/config" ]; thenecho "Config file not found, starting shell for debugging..."exec /bin/bash
fi
exec your_service_command
(3) 定期提交更改
如果您在容器内进行了大量修改,定期使用 docker commit
将容器保存为镜像,避免意外丢失数据。
docker commit <container_id> backup_image
📋 Docker Compose 命令详解
命令 | 描述 |
---|---|
docker compose version | 查看 Docker Compose 的版本信息(适用于新版集成到 Docker CLI 的 Compose) |
docker compose up | 创建并启动所有服务 |
docker compose down | 停止并移除所有容器、网络和卷 |
docker compose ps | 列出所有容器的状态 |
docker compose logs | 查看容器的日志输出 |
docker compose exec <service_name> <command> | 在运行中的容器内执行命令 |
docker compose build | 构建或重新构建服务镜像 如果你想强制重新构建,可以使用 --no-cache 参数:docker compose build --no-cache |
docker compose pull | 拉取服务所需的镜像 |
docker compose push | 推送服务镜像到镜像仓库 |
docker compose restart | 重启服务容器 |
docker compose stop | 停止服务容器 |
docker compose start | 启动服务容器 |
docker compose rm | 移除已停止的服务容器 |
Docker Compose 常用选项
选项 | 描述 | 示例 |
---|---|---|
--file 或 -f | 指定 Compose 文件的路径。默认情况下,Docker Compose 会在当前目录下寻找名为 docker-compose.yml 的文件。 | docker compose -f my-compose-file.yml up |
--project-name 或 -p | 指定项目的名称。默认情况下,项目名称是基于当前目录的名称。 | docker compose -p my_project up |
--env-file | 指定环境变量文件。默认情况下,Docker Compose 会读取 .env 文件中的环境变量。 | docker compose --env-file .myenv up |
--profile | 启用特定的配置文件(profiles)。Compose 文件中可以通过 profiles 定义不同的服务组。 | docker compose --profile dev up |
--progress | 设置进度输出的格式。支持的值包括 auto 、tty 、plain 、json 和 quiet 。 | docker compose --progress plain up |
🌟 实战案例:运行 Flask 应用
1. 启动容器
假设我们有一个 Flask 应用的镜像 edu/web_flask_server:V2
,我们可以使用以下命令启动容器:
sudo docker run -it -p 8080:8080 --name web_flask edu/web_flask_server:V2 /bin/bash
说明:
-p 8080:8080
:将主机的 8080 端口映射到容器的 8080 端口。--name web_flask
:为容器指定名称。/bin/bash
:启动一个交互式终端。
重启策略
容器设置 always
策略,确保应用在意外退出后能够自动恢复:
sudo docker run -d -p 8080:8080 --name web_flask --restart always edu/web_flask_server:V2
说明:
--restart always
:确保容器在任何情况下都会自动重启。-d
:后台运行容器。
2. 进入容器
进入容器内部并启动 Flask 应用:
docker exec -it web_flask /bin/bash -c 'python /work/web_flask/app.py'
说明:
docker exec -it
:在运行中的容器内执行命令。/bin/bash -c 'python /work/web_flask/app.py'
:启动 Flask 应用。
3. 制作启动脚本
为了方便操作,可以创建脚本 start_webflask.sh
:
# start_webflask.sh
docker restart web_flask
docker exec -it web_flask /bin/bash -c 'python /work/web_flask/app.py'
4. 保存和加载镜像
在实际开发中,可能需要将容器的状态保存为镜像,或者将镜像导出为 .tar
文件进行备份或传输。
保存镜像
将镜像保存为 .tar
文件:
docker save -o web_flask_server_V3.tar edu/web_flask_server:V2
说明:
-o
:指定输出文件名。edu/web_flask_server:V2
:要保存的镜像名称。
执行此命令后,Docker 将会在当前工作目录下生成一个名为 web_flask_server_V3.tar
的文件。这个文件可以用于备份、传输或在其他计算机上加载为 Docker 镜像。
加载镜像
在目标计算机上加载 .tar
文件中的镜像:
docker load -i web_flask_server_V3.tar
说明:
-i
:指定输入文件。- 加载完成后,该镜像将出现在本地的 Docker 镜像列表中。
从容器创建新镜像
如果需要将容器的当前状态保存为一个新的镜像,可以使用以下命令:
docker commit -m "提交信息" -a "作者" web_flask edu/web_flask_server:V2
说明:
-m
:添加提交信息。-a
:指定作者信息。web_flask
:容器 ID 或名称。edu/web_flask_server:V2
:新生成的镜像名称。
执行此命令后,Docker 会将容器的当前状态保存为一个新的镜像。这个镜像可以用于创建新的容器或分享给其他人使用。
5. 挂载目录
在运行容器时,可以通过 -v
参数挂载本地目录到容器中,以便实现数据持久化或共享文件:
docker run -it -p 8080:8080 -v /host/path:/container/path --name web_flask edu/web_flask_server:V2 /bin/bash
说明:
-v /host/path:/container/path
:将主机的/host/path
目录挂载到容器的/container/path
目录。
6. 退出容器
完成操作后,可以通过以下命令退出容器:
exit
📚 参考链接
本文的内容参考了以下优质资源,推荐读者进一步阅读以深入了解 Docker 的使用技巧和高级功能:
-
Essential Docker Commands - Linux Handbook
提供了 Docker 常用命令的详细说明和示例。 -
Docker 安装指南 - Docker 官方文档
官方文档,包含在 Ubuntu 上安装 Docker 的完整步骤。 -
Linux 中国 - Docker 入门与实践
针对初学者的 Docker 实践教程,涵盖基础操作和常见问题解决。 -
More Essential Docker Commands - Linux Handbook
进一步扩展了 Docker 命令的使用场景和技巧。 -
2024年最新国内可用的Docker镜像加速器地址汇总
🎉 总结
通过本文的学习,你应该已经掌握了 Docker 的基本安装、配置和使用方法。无论是管理镜像、启动容器,还是解决常见问题,Docker 都提供了强大的工具集来帮助我们简化开发流程。希望这篇指南能够为你的 Docker 之旅提供帮助!🚀
如果你有任何问题或建议,欢迎在评论区留言交流!💬
相关文章:
Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟 📖 简介 在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深…...
计算机视觉:卷积神经网络(CNN)基本概念(二)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 接上一篇《计算机视觉&am…...
SQL SERVER的PARTITION BY应用场景
SQL SERVER的PARTITION BY关键字说明介绍 PARTITION BY关键字介绍具体使用场景排名计算累计求和分组求最值分组内百分比计算分组内移动平均计算分组内数据分布统计分组内数据偏移计算 总结 PARTITION BY关键字介绍 在SQL SERVER中,关键字PARTITION BY主要用于窗口函…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(TesterPresent_0x3E服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x3E服务、会话保持、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x3E服…...
gsoap实现webservice服务
gsoap实现webservice服务 在实现Web服务时,使用gSOAP是一个很好的选择,因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库,它支持SOAP协议的各种版本,包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…...
达梦:dmserver占用io高排查
目录标题 1. 使用达梦数据库的性能视图查询当前活动会话查询执行时间较长的 SQL 2. 使用 DM 性能监视工具3. 使用操作系统工具监控 I/Oiostat 工具dstat 工具 4. 优化查询和索引审查 SQL 执行计划优化索引 5. 调整数据库参数6. 分析数据库日志7. 硬件和存储检查总结 针对达梦数…...
MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?
技术原理(数学公式与核心逻辑) 核心公式 门控网络输出: G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg⋅xbg) 最终输出: y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...
用python写一个聊天室程序
下面是一个简单的基于Socket的Python聊天室程序示例,包括服务器端和客户端: 服务器端代码: import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…...
七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持
本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容,助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目,该版本修复了原版中的多个 系统漏洞&#…...
Vulhub靶机 ActiveMQ任意 文件写入(CVE-2016-3088)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:ActiveMQ在5.14.0之前的版本(不包括5.14.0) 二、访问靶机IP 8161端口 默认账户密码都是admin 1、利用bp抓包,修改为PUT方法并在fileserver…...
Cloud: aws:network: limit 含有pps这种限制
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...
28、深度学习-自学之路-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示
import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…...
观察者模式说明(C语言版本)
观察者模式主要是为了实现一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。下面使用C语言实现了一个具体的应用示例,有需要的可以参考…...
LC-搜索二维矩阵II、相交链表、反转链表、回文链表、环形链表、环形链表ll
搜索二维矩阵II 方法:从右上角开始搜索 我们可以从矩阵的右上角开始进行搜索。如果当前元素 matrix[i][j] 等于 target,我们直接返回 true。如果 matrix[i][j] 大于 target,说明 target 只能出现在左边的列,所以我们将列指针向左…...
如何查看 Linux 服务器的 MAC 地址:深入解析与实践指南
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
国产FPGA开发板选择
FPGA开发板是学习和开发FPGA的重要工具,选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展,淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售,本文将对国产FPGA和相关店铺做个简单梳理,帮助有需要使用…...
iOS 获取设备占用内存
获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...
用自己的数据训练yolov11目标检测
文章目录 概要理论知识整体架构流程架构优化多任务支持多参数体量 操作实操环境配置数据准备数据标注数据放置路径 训练预测 概要 官网:https://github.com/ultralytics/ultralytics?tabreadme-ov-file 提示:以 停车场空位检测 公开数据集示例&#x…...
golang如何将结构体和函数进行绑定?
在Go语言中,结构体和函数的绑定通常通过方法(method)来实现。方法是一种特殊的函数,它与某个类型关联,特别是结构体类型。下面是如何将结构体和函数进行绑定的具体步骤: 定义结构体:首先需要定义…...
【苍穹外卖】学习
软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色…...
架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
LVS(Linux Virtual Server)是一款高性能的开源负载均衡软件,支持多种负载均衡模式。以下是其主要模式及其原理、服务水平、优缺点: 1. NAT 模式(Network Address Translation) 原理: 请求流程…...
DFS算法篇:理解递归,熟悉递归,成为递归
1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索,那么听起来很高大尚的一个名字,但是实际上dfs的本质就是一个递归,而且是一个带路径的递归,那么递归大家一定很熟悉了,大学c语言课程里面就介绍过递归,我…...
让编程变成一种享受-明基RD320U显示器
引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...
C语言简单练习题
文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …...
基于Python的深度学习音乐推荐系统(有配套论文)
音乐推荐系统 提供实时音乐推荐功能,根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库:MySQL 系统包含角色:管理员、用户 管理员功能:用户管理、系统设置、音乐管理、音乐推荐管理、系…...
Java:单例模式(Singleton Pattern)及实现方式
一、单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景,例如日志记录器、配置管理、线程池、数据库…...
解锁养生秘籍,拥抱健康生活
在这个快节奏的时代,人们行色匆匆,常常在忙碌中忽略了健康。其实,养生并非遥不可及,它就藏在生活的细微之处,等待我们去发现和实践。 规律作息是健康的基础。日出而作,日落而息,顺应自然规律&am…...
数据结构之堆(Heap)
数据结构之堆(Heap) 数据结构之堆(Heap)一、堆的核心概念1. 定义与性质2. 存储方式 二、核心操作与算法1. 操作复杂度概览2. 关键操作详解(1) 向上调整(Sift Up)(2) 向下调整(Sift Down…...
人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论
机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…...
github上文件过大无法推送问题
GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中。 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS: 1. 安装 Git LFS 首先,你需要安装 Git LFS。可以按照以…...
Elasticsearch:将 Ollama 与推理 API 结合使用
作者:来自 Elastic Jeffrey Rengifo Ollama API 与 OpenAI API 兼容,因此将 Ollama 与 Elasticsearch 集成非常容易。 在本文中,我们将学习如何使用 Ollama 将本地模型连接到 Elasticsearch 推理模型,然后使用 Playground 向文档提…...
【Linux】详谈 进程控制
目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…...
构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面: 等待页面: 完成页面: 前言 随着人工智能技术的飞速发展,大模型对话系统已成为…...
WordPress“更新失败,响应不是有效的JSON响应”问题的修复
在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…...
华为交换机trunk简介配置
目录 一、Trunk 口简介二、Trunk 口配置案例及命令(一)组网需求(二)配置步骤(三)验证配置 三、注意事项 一、Trunk 口简介 Trunk 口是交换机中一种重要的端口类型,主要用于连接交换机与交换机、…...
DeepSeek从入门到精通(清华大学)
DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手,具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统,它不仅支持文本交互,还可处理文件、图像、代码等多种格式输入,其知识库更新至2…...
【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤 1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut) 1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知…...
容器运行常见数据库
一.涉及镜像压缩包 均为amd架构版本:mysql:5.7.42、postgres:13.16、dm8:20250206_rev257733_x86_rh6_64、oceanbase-ce:v4.0、opengauss:5.0.2 通过网盘分享的文件:db.tgz 链接: https://pan.baidu.com/s/1EBbFPZj1FxCA4_GxjVunWg?pwd563s 提取码: 5…...
OpenGL ES学习大纲
如果您想从头学习 OpenGL ES,以下是一个详细的学习大纲,涵盖了从基础到高级的知识点,循序渐进地帮助您掌握 OpenGL ES 的核心概念、API 使用、渲染管线、着色器编程、性能优化等内容。 1. 学习前的准备 1.1 基础知识 在学习 OpenGL ES 之前,您需要掌握以下基础知识: 数学…...
Kotlin 优雅的接口实现
1. 日常遇到的冗余的接口方法实现 日常开发中,经常会要实现接口,但是很多场景中,只需要用到其中一两个方法,例如 ActivityLifecycleCallbacks,它有很多个接口需要实现,但是很多时候我们只需要用到其中的一…...
数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除
头文件:head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…...
qt实现文字跑马灯效果
实现跑马灯的方式多种多少样,可以通过定时器,或者animation等来实现。 本文通过定时器,将第一个文字,移动到最后一个这种方式来实现,还有其他方式哈。 直接上源码 h文件 #ifndef TEXTTICKER_H #define TEXTTICKER_…...
PyTorch Tensor 形状变化操作详解
PyTorch Tensor 形状变化操作详解 在深度学习中,Tensor 的形状变换是非常常见的操作。PyTorch 提供了丰富的 API 来帮助我们调整 Tensor 的形状,以满足模型输入、计算或数据处理的需求。本文将详细介绍 PyTorch 中常见的 Tensor 形状变换操作࿰…...
关于Node.js前端面试的试题概念、工作原理及实际应用
文章目录 1. 什么是Node.js?2. Node.js是如何工作的?3. Node.js与其他流行的框架相比有何优势?4. Node.js如何克服I/O操作阻塞的问题?5. 为什么Node.js是单线程的?6. 如果Node.js是单线程的,那么它是如何处…...
OpenCV机器学习(3)期望最大化(Expectation-Maximization, EM)算法cv::ml::EM
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::EM 是 OpenCV 机器学习模块中的一部分,用于实现期望最大化(Expectation-Maximization, EM)算法。EM …...
Spring Boot 集成 Kettle
Kettle 简介 Kettle 最初由 Matt Casters 开发,是 Pentaho 数据集成平台的一部分。它提供了一个用户友好的界面和丰富的功能集,使用户能够轻松地设计、执行和监控 ETL 任务。Kettle 通过其强大的功能和灵活性,帮助企业高效地处理大规模数据集…...
Debezium同步之如何同步GIS数据
Debezium 可以用于同步数据库中的变更数据(CDC),包括GIS(地理信息系统)数据。GIS 数据通常存储在具有地理空间数据类型的表中,例如 PostGIS(PostgreSQL 的扩展)中的 geometry 或 geography 类型。通过 Debezium,可以实时捕获和同步这类数据的变更。本文章简单介绍Post…...
Java与C语言中取模运算符%的区别对比
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 💯前言💯C语言中的取模运算符 %基本行为示例 注意事项示例:负数取模 💯Java中的取模运算符 %基本行为示例 对浮点数的支持示例:浮点数取模 符…...
如何commit后更新.gitignore实现push
目录 步骤 1: 更新 .gitignore 文件 步骤 2: 移除已追踪的大文件 步骤 3: 提交更改 步骤 4: 尝试推送 注意事项 如果已经执行了git commit,但后来意识到需要更新.gitignore文件以排除某些不应该被追踪的大文件或目录,并希望在不丢失现有提交记录的情…...
从MySQL迁移到PostgreSQL的完整指南
1.引言 在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面: 1.1 性能和扩展性 PostgreSQL以其高性能…...