存档启动

Warning
  • 仅适合用于定制化容器;
  • 还是建议使用目录挂载容器数据,这样直接通过原命令重新启动就好,麻烦了一点但也麻烦不了太多可以保证数据安全

docker commit 命令用于将容器的当前状态保存为一个新的镜像。这样做可以将容器的当前设置和状态保存下来,以便稍后使用。以下是更改容器端口映射的例子:

docker commit <容器名称或ID> <新镜像名称> 
docker run -p <新主机端口>:<容器端口> --name <容器名称> <新镜像名称>
Note

docker commit 的主要好处是将容器的当前状态保存为一个新的镜像。这对于以下情况非常有用:

  1. 保存容器状态:您可以将容器的当前状态保存为镜像,以便稍后重新创建具有相同状态的容器。这样可以方便地备份和恢复容器的状态,或者在需要时快速复制容器。

  2. 定制化容器:您可以在容器中进行各种配置更改、安装软件包或者进行其他操作,然后使用 docker commit 将这些更改保存为新的镜像。这样,您就可以将这些定制化的容器分享给团队成员或在其他环境中使用。

  3. 版本控制:通过将容器状态保存为镜像,您可以实现对容器状态的版本控制。这样,您可以轻松地回滚到以前的状态或跟踪容器状态的演变。

更新容器启动策略

大聪明

不幸的是,docker update 命令不能用来动态更新容器的端口映射。该命令主要用于更新容器的配置,例如 CPU 和内存限制,但不支持修改容器的端口映射。

禁用容器的自动重启: 如果容器的启动策略是 always,表示容器会在 Docker 守护进程启动时自动启动。你可以使用以下命令将其更改为 no,以阻止容器自动启动。

docker update --restart=no <container_name_or_id>

同样,将 <container_name_or_id> 替换为你要停止的容器的名称或 ID。

以下是 Docker 中容器启动策略参数及其含义的列表:

  1. no:容器不会自动重启。如果容器退出,则它将保持停止状态,直到手动重新启动。

    docker update --restart=no <container_name_or_id>
    
  2. always:容器将始终自动重启。无论容器以何种方式退出,Docker 守护进程都会尝试重新启动它。

    docker update --restart=always <container_name_or_id>
    
  3. on-failure[:max-retries]:容器将在非零退出代码时自动重启。可选的 max-retries 参数指定重试次数,默认为最大整数值。

    docker update --restart=on-failure[:max-retries] <container_name_or_id>
    
  4. unless-stopped:容器将在显式停止它之前自动重启。如果容器以正常方式退出,则 Docker 守护进程将尝试重新启动它。但是,如果你手动停止容器,它将保持停止状态。

    docker update --restart=unless-stopped <container_name_or_id>
    

    这些是 Docker 中容器启动策略的常见参数及其含义。通过指定适当的启动策略,你可以控制容器的行为,以满足你的特定需求。

数据保护

如果你在启动MySQL容器时没有显式创建卷,那么Docker会在内部自动创建一个匿名卷,并将MySQL容器的数据目录挂载到该匿名卷上。这种情况下,你也可以通过Docker命令查看到挂载点的信息:要查看MySQL容器的挂载点信息,你可以使用以下命令:

docker inspect <容器ID或容器名称>

这将会返回有关容器的详细信息,其中包括挂载点的信息。如果你只想查看挂载点的信息,你可以通过过滤器来提取所需的部分,例如:

docker inspect --format='{{json .Mounts}}' <容器ID或容器名称>

这将只返回挂载点相关的信息,以 JSON 格式呈现。例如MySQL容器的挂载点信息如下所示:

[
    {
        "Type": "volume",
        "Name": "54e46decb7c569a977c2c0951e837ef8c54bb9e99e29f39559bc243badd849c6",
        "Source": "/var/lib/docker/volumes/54e46decb7c569a977c2c0951e837ef8c54bb9e99e29f39559bc243badd849c6/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

这表明MySQL容器的数据目录 /var/lib/mysql 被挂载到了一个Docker卷上,卷的信息为 54e46decb7c569a977c2c0951e837ef8c54bb9e99e29f39559bc243badd849c6,并且其源路径为 /var/lib/docker/volumes/54e46decb7c569a977c2c0951e837ef8c54bb9e99e29f39559bc243badd849c6/_data

当你知道挂载卷的目录,可以直接拷贝挂载卷到你自定义目录
之后删除容器,重新启动时添加本地目录挂载即可,数据不会丢失

Note

当你删除一个容器时,Docker默认情况下并不会删除与该容器关联的卷。这意味着,即使你删除了MySQL容器,与其关联的卷仍然存在,数据也不会丢失。这就是为什么我之前提到可以复制旧数据目录到新目录的原因。
如果你想要删除与容器关联的卷,你需要显式使用 docker rm -v 命令。这个命令会删除容器及其关联的卷。例如:

docker rm -v mysql8

这将删除MySQL容器,并且删除与其关联的卷,确保你的数据被彻底清除。
如果你忘记删除了与容器关联的卷,你可以使用以下步骤找到并删除这些未使用的卷:

  1. 查找未使用的卷:
docker volume ls -qf dangling=true

这将列出所有未使用的卷的ID。

  1. 删除未使用的卷:
docker volume rm $(docker volume ls -qf dangling=true)

这将删除所有未使用的卷。

使用这些命令,你可以清理掉不再使用的卷,从而释放磁盘空间并确保系统干净整洁。

重启Docker守护进程

什么时候重启

举个例子:如果通过 kill 命令直接终止了 Docker 启动的 MySQL 服务器进程 mysqld,那么 Docker 可能会检测到 MySQL 服务器已经停止,但由于 Docker 服务本身并没有受到影响,所以 Docker 容器并不会自动重启。但这时候命令启动容器很可能会出问题,所以建议重新启动Docker

要重启 Docker 守护进程,你可以按照以下步骤进行:

  1. 停止 Docker 服务:首先,停止正在运行的 Docker 服务。你可以使用以下命令停止 Docker 服务:

    sudo systemctl stop docker
    

    或者使用以下命令在非 systemd 系统上停止 Docker 服务:

    sudo service docker stop
    
  2. 启动 Docker 服务:然后,启动 Docker 服务。你可以使用以下命令启动 Docker 服务:

    sudo systemctl start docker
    

    或者使用以下命令在非 systemd 系统上启动 Docker 服务:

    sudo service docker start
    
  3. 确认 Docker 服务状态:最后,你可以使用以下命令来确认 Docker 服务是否已经成功启动:

    sudo systemctl status docker
    

    或者在非 systemd 系统上使用以下命令:

    sudo service docker status
    

    如果服务状态显示为 active(running),则表示 Docker 服务已成功启动。

通过以上步骤,你就可以重启 Docker 守护进程了。