当前位置: 首页 > article >正文

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 --versiondocker -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 服务在宿主机启动时自动运行,需要将其设置为开机自启。以下是具体操作步骤:

  1. 检查 Docker 服务状态

    systemctl status docker
    
  2. 启用 Docker 服务开机自启
    如果未启用开机自启,执行以下命令:

    sudo systemctl enable docker
    
  3. 验证设置是否生效
    重启宿主机后,检查 Docker 服务是否已自动启动:

    systemctl is-enabled docker
    

    输出示例:

    enabled
    

📊 Docker 常用命令

命令描述
docker --versiondocker -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总是重启容器,除非容器被手动停止。
设置容器的重启策略
  1. 创建容器时设置重启策略
    在运行容器时,可以通过 --restart 参数设置重启策略。例如:

    docker run -d --name my_container --restart always my_image
    

    上述命令将容器的重启策略设置为 always,即无论容器因何种原因停止,都会自动重启。

  2. 修改现有容器的重启策略
    如果容器已经创建,可以通过 docker update 命令修改其重启策略。例如:

    docker update --restart always my_container
    
  3. 验证容器的重启策略
    使用以下命令查看容器的重启策略:

    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-downloads10最大并发下载数,控制同时下载的层数量。
max-concurrent-uploads5最大并发上传数,控制同时上传的层数量。
default-shm-size"1G"容器默认共享内存大小,建议设置为较大的值以避免内存不足问题。
debugtrue是否启用调试模式,启用后会输出更详细的日志信息。
experimentalfalse是否启用实验性功能,建议保持禁用状态以确保稳定性。
Docker 镜像源列表
镜像源地址说明
https://<阿里云加速器ID>.mirror.aliyuncs.com阿里云官方镜像,稳定且速度快
https://dockerhub.icu第三方镜像,适合国内用户
https://docker.chenby.cn社区维护镜像,更新频率较高
https://docker.1panel.live开源项目提供的镜像服务
https://docker.awsl9527.cnAWS 相关镜像,适合 AWS 用户
https://docker.anyhub.us.kg多地区镜像,支持全球访问
https://dhub.kubesre.xyzKubernetes 社区推荐镜像

重启 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:注销并重新登录

为了使组更改生效,需要注销并重新登录系统。在注销之前,请确保保存并关闭所有打开的应用程序,然后执行以下命令:

logoutexit

重新登录后,组成员身份将更新。


步骤 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_PROXYHTTPS_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设置进度输出的格式。支持的值包括 autottyplainjsonquietdocker 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 入门与实战:从安装到容器管理的完整指南

&#x1f680; Docker 入门与实战&#xff1a;从安装到容器管理的完整指南 &#x1f31f; &#x1f4d6; 简介 在现代软件开发中&#xff0c;容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊&#xff0c;以其轻量级、高效和跨平台的特性&#xff0c;深…...

4.【线性代数】——矩阵的LU分解

四 矩阵的LU分解 1. AB的逆矩阵2. 转置矩阵3. ALU3.1 2x2矩阵3.2 3x3矩阵3.3 nxn的矩阵分解的次数&#xff1f; 1. AB的逆矩阵 { ( A B ) ( B − 1 A − 1 ) I ( B − 1 A − 1 ) ( A B ) I ⇒ ( A B ) − 1 B − 1 A − 1 \begin{cases} (AB)(B^{-1}A^{-1}) I\\ (B^{-1}A^…...

ELK8.17部署(Ubantu24x64)

检查java环境 ELK8.x不支持java8 若无环境可执行 sudo apt install openjdk-17-jre-headless 准备安装包 官网下载地址: ELK products 搜Elasticsearch、Kibana、Logstash、Filebeat versions需一致&#xff0c;这里使用8.17.0 Elasticsearch Kibana Logstash Filebeat e…...

什么是算法的空间复杂度和时间复杂度,分别怎么衡量。

1. 时间复杂度 时间复杂度衡量的是算法运行时间与输入规模之间的关系。它通常用大O记号&#xff08;Big O Notation&#xff09;表示&#xff0c;例如 O(1)、O(n)、O(n2) 等。 衡量方法&#xff1a; 常数时间复杂度 O(1)&#xff1a;无论输入规模如何&#xff0c;算法的执行时…...

HCIA项目实践---ACL访问控制列表相关知识和配置过程

十 ACL访问控制列表 1 策略的概念 在网络连通之后&#xff0c; 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上&#xff0c;匹配流量&#xff0c;执行相应的动作。&#xff08;流量流入或者流出的接口并不是一个固定的概念而是一个相对的…...

细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法

目录 一、入侵检测的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6、KEYLED 2、RTC &#xff08;1&#xff09;设置RTC的模式。 &#xff08;2&#xff09;General、Time、Date\Wake Up分组 &#xff08;3&#xff09;Tamper分组 1&#xff…...

STM32 CAN过滤器配置和应用方法介绍

目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤&#xff08;以标准ID为例&#xff09; 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中&#xff0c;CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…...

搜狗浏览器卸载教程

需求背景 今天发现geek居然无法卸载搜狗浏览器&#xff0c;作为一个老司机&#xff0c;这是不允许的。如果你使用geek或者windows的卸载&#xff0c;或者直接在它的安装包的Uninstall.exe中卸载&#xff0c;他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…...

Go 模块管理工具 `go mod tidy` 和 `go.sum` 文件详解

Go 模块管理工具 go mod tidy 和 go.sum 文件详解 引言 Go 语言自引入模块&#xff08;module&#xff09;系统以来&#xff0c;极大地简化了依赖管理和版本控制。go mod tidy 和 go.sum 文件是 Go 模块系统中的两个重要组成部分&#xff0c;它们共同确保项目的依赖项是最新的…...

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》可以知道&#xff0c;推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…...

STM32 串口转 虚拟串口---实现USB转串口功能

一&#xff0c;USART与UART 区别 USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步串行接收/发送器 相较于UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;多了…...

【进程与线程】Linux 线程、同步以及互斥

每个用户进程有自己的地址空间。 线程是操作系统与多线程编程的基础知识。 系统为每个用户进程创建一个 task_struct 来描述该进程&#xff1a;该结构体中包含了一个指针指向该进程的虚拟地址空间映射表&#xff1a; 实际上 task_struct 和地址空间映射表一起用来表示一个进程…...

胶囊网络动态路由算法:突破CNN空间局限性的数学原理与工程实践

一、CNN的空间局限性痛点解析 传统CNN的瓶颈&#xff1a; 池化操作导致空间信息丢失&#xff08;最大池化丢弃85%激活值&#xff09;无法建模层次空间关系&#xff08;旋转/平移等变换不敏感&#xff09;局部感受野限制全局特征整合 示例对比&#xff1a; # CNN最大池化示例…...

当pcie设备变化时centos是否会修改网络设备的名称(AI回答)

当pcie设备变化时centos是否会修改网络设备的名称 在CentOS&#xff08;以及其他基于Linux的操作系统&#xff09;中&#xff0c;网络接口的命名通常遵循特定的规则&#xff0c;尤其是在使用PCIe设备&#xff08;如网络适配器&#xff09;时。网络接口的命名通常基于设备的物理…...

【人工智能】释放数据潜能:使用Featuretools进行自动化特征工程

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 特征工程是机器学习流程中至关重要的一步,它直接影响模型的性能。然而,手动特征工程既耗时又需要领域专业知识。Featuretools是一个强大的…...

docker批量pull/save/load/tag/push镜像shell脚本

目录 注意&#xff1a; 脚本内容 执行效果 注意&#xff1a; 以下脚本为shell脚本通过docker/nerdctl进行镜像独立打包镜像的相关操作脚本内仓库信息和镜像存取路径需自行更改需自行创建images.txt并填写值&#xff0c;并且与脚本位于同级目录下 [rootmaster01 sulibao]# l…...

对正则表达式说不!!!

可能大家都会和我一样&#xff0c;时常会遇到正则表达式&#xff0c;有时候会忘记某些字符而苦恼。今天就帮助大家克服它&#xff0c;虽然不多&#xff0c;但我认为掌握这些足够了&#xff0c;万变不离其宗&#xff0c;以不变应万变。 一、正则表达式内容分类 1. 字符类 [abc…...

Redis日志分析

主从同步尝试&#xff1a; 日志中多次出现“Master is currently unable to PSYNC but should be in the future: -NOMASTERLINK Can’t SYNC while not connected with my master”。这表明从服务器尝试与主服务器进行部分重同步&#xff08;PSYNC&#xff09;&#xff0c;但由…...

【做一个微信小程序】校园地图页面实现

前言 上一个教程我们实现了小程序的一些的功能&#xff0c;有背景渐变色&#xff0c;发布功能有的呢&#xff0c;已支持图片上传功能&#xff0c;表情和投票功能开发中&#xff08;请期待&#xff09;。下面是一个更高级的微信小程序实现&#xff0c;包含以下功能&#xff1a;…...

Web后端 - Maven管理工具

一 Maven简单介绍 Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 Maven的作用 二 Maven 安装配置 依赖配置 依赖传递 依赖范围 生命周期 注意事项&#xff1a;在同一套生命周期中&#xff0c;当运行后面的阶段时&#xff0c;前面的阶段都…...

20250217-POMO笔记

文章目录 前言一、伪代码一&#xff1a;POMO Training二、伪代码二&#xff1a;POMO Inference三、POMO注意力模型3.1、自注意力机制3.2、AM模型 前言 以下主要讲解两个算法的伪代码以及注意力模型。 一、伪代码一&#xff1a;POMO Training POMO Training是POMO模型训练的伪…...

JavaEE-SpringBoot快速入门

文章目录 本节目标Maven什么是Maven创建一个Maven项目maven项目功能maven的依赖管理全球仓库, 私服, 本地服务器, 配置国内镜像 第一个SpringBoot项目创建项目运行SpringBoot程序 SpringBoot原理初步Web服务器 总结 本节目标 了解什么是maven, 配置国内源使用Springboot创建项…...

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…...

Sprinig源码解析

前言 Spring 框架是 Java 企业级开发的基石&#xff0c;其源码设计体现了模块化、扩展性和灵活性。以下从 IoC 容器、AOP 实现、核心模块和关键设计模式四个角度对 Spring 源码进行深度解析&#xff0c;帮助理解其底层机制。即使Spring会使用的人见得就能使用。 一、IoC 容器源…...

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...

使用右侧值现象来处理一个word导入登记表的需求

需求也简单&#xff0c;导word文件用户登记表&#xff0c;有各部门的十几个版本&#xff08;为什么这么多&#xff1f;不知道&#xff09;。这里说下谈下我的一些代码做法&#xff1a; 需求分析&#xff1a; 如果能解决java字段和各项填的值怎么配对的问题&#xff0c;那么就…...

《open3d pyqt》Alpha重建

《open3d pyqt》Alpha重建 一、效果展示二、qt设置2.1 主界面添加动作2.2 dialog 界面、布局如下:三、核心代码一、效果展示 二、qt设置 2.1 主界面添加动作 2.2 dialog 界面、布局如下: 并生成py文件,参考前述章节 三、核心代码 main.py文件增加 from Su...

深度解析HTTP/HTTPS协议:从原理到实践

深入浅出HTTP/HTTPS协议&#xff1a;从原理到实践 前言 在当今互联网世界中&#xff0c;HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者&#xff0c;理解这些基础协议至关重要。本文将用六大板块&#xff0c;配合原理示意图和实操案例&#xff0…...

数据结构:顺序表(Sequence List)及其实现

什么是顺序表&#xff1f; 顺序表是一种最简单的数据结构&#xff0c;它就像一排连续的小房子&#xff0c;每个房子里都住着一个数据元素。这些房子是按顺序排列的&#xff0c;每个房子都有一个门牌号&#xff08;下标&#xff09;&#xff0c;我们可以通过门牌号快速找到对应…...

小程序canvas2d实现横版全屏和竖版逐字的签名组件(字帖式米字格签名组件)

文章标题 01 功能说明02 效果预览2.1 横版2.2 竖版 03 使用方式04 横向签名组件源码4.1 html 代码4.2 业务 Js4.3 样式 Css 05 竖向签名组件源码5.1 布局 Html5.2 业务 Js5.3 样式 Css 01 功能说明 技术栈&#xff1a;uniapp、vue、canvas 2d 需求&#xff1a; 实现横版的全…...