Docker 教程

loskyertt Unknown

一、基本指令

1.1 查看镜像版本

1
docker inspect <镜像ID> | grep -i version

1.2 查看镜像或容器详细信息

1
2
3
4
5
# 镜像
docker inspect <镜像名或ID>

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

可以同过这种方式查看镜像里的主要workdir在哪里,这样可以知道应该挂载镜像里的哪个目录。

1.3 查看容器映射到本地的端口

如过在创建容器时用的是-P(随机映射本地端口)而不是-p xxxx:xxxx(指定映射本地端口)

1
docker port <容器名或ID>

1.4 在本地对容器内的文件进行操作

可以使用 docker cp 命令将容器内的自己需要文件(文件或者文件夹都可以)导出到宿主机(反之亦然)。

从容器复制文件到宿主机:

1
docker cp my_container:/path/in/container /path/on/host

从宿主机复制文件到容器:

1
docker cp /path/on/host my_container:/path/in/container

1.5 删除镜像或容器

要一次性删除所有Docker镜像,可以通过以下步骤:

1.5.1 停止并删除所有容器

首先,确保所有容器已经停止并删除。你不能删除正在使用的镜像。

  1. 停止所有容器:

    1
    docker stop $(docker ps -aq)
  2. 删除所有容器:

    1
    docker rm $(docker ps -aq)

1.5.2 删除所有镜像

在确保所有容器都已停止并删除后,可以删除所有镜像:

1
docker rmi $(docker images -q)

1.5.3 详细说明

  • docker ps -aq

    • docker ps:列出所有运行中的容器。
    • -a:列出所有容器,包括运行中的和已停止的。
    • -q:只显示容器的 ID。
  • docker images -q

    • docker images:列出所有镜像。
    • -q:只显示镜像的 ID。

1.5.4 删除所有未使用的镜像、容器、网络和卷

1
docker system prune -a
  • docker system prune -a
    • docker system prune:清理所有未使用的容器、网络、挂载的卷和镜像。
    • -a:删除所有未使用的镜像,不仅仅是悬空的镜像(dangling images)。

1.6 网络配置

1
docker create --name =<name>  --network host image:tag 

使用参数--network host可以让容器共享主机的网络栈,通常用于需要高性能网络连接或访问主机网络的应用,也就是说容器内的端口与主机的都对应。默认是桥接模式。

1.7 实时查看容器日志

1
docker logs -f  <--timestamps> <容器ID或容器名称>

参数--timestamps可以选加,可以显示时间戳。

1.8 指定端口的映射协议

在 Docker 中,-p 选项用于指定端口映射时,主要支持以下两种协议:

  • TCP :这是 Docker 默认的协议。大多数服务和应用程序使用 TCP 协议,因此 -p 选项通常用于映射 TCP 端口。例如:
1
docker run -p 8080:80</tcp> my_image

这个命令将容器的 80 端口映射到宿主机的 8080 端口,使用 TCP 协议。/tcp可以选加,因为 Docker 的默认端口映射协议就是 TCP。

  • UDP :如果你的应用程序使用 UDP 协议,你可以使用 -p 选项来映射 UDP 端口。例如:
1
docker run -p 8080:80/udp my_image

这个命令将容器的 80 端口映射到宿主机的 8080 端口,使用 UDP 协议。

1.9 重命名容器

1
docker rename <container_name1> <container_name2>

二、容器操作

这里以ubutnu镜像为例。

2.1 运行并创建容器

1
docker run -itd --name ubuntu-test ubuntu

注意: 这里必须加上-it。像ubuntu这种镜像在创建容器时需要分配一个伪终端让它在后台持续运行,否则会在启动容器后立马退出运行。

2.2 进入容器

1
docker exec -it ubuntu-test bash

要退出正在交互模式下的容器终端,可以执行以下操作:

  1. 按下 Ctrl + D 快捷键。
  2. 或者在容器终端中键入 exit 命令并按回车键。

三、容器挂载(volume)与绑定挂载(bind)的区别

3.1 位置

卷挂载的目录是在/var/lib/docker/volumes/下,绑定挂载的目录根据用户自定义。

3.2 卷挂载 (docker volume)

当使用 docker volume create temp 创建一个名为temp卷并将它挂载到容器时(例如 -v temp:/clashmeta),Docker 会自动管理这个卷。如果容器中指定的挂载目标目录(即 /clashmeta)已经有文件,而挂载的卷是空的,Docker 不会覆盖原有的文件。相反,Docker 会将这些文件复制到卷中,确保容器可以正常工作。这就是为什么当你使用 Docker 卷时,/clashmeta 的内容不会被覆盖。

3.3 绑定挂载 (bind mount)

当使用 mkdir -p ~/temp 创建一个本地目录,然后将这个目录绑定到容器时(例如 -v ~/temp:/clashmeta),情况会有所不同。bind mount 是一种直接将宿主机的文件系统目录挂载到容器的方式:

  • 如果宿主机的目录已经有内容,那么容器内的目标目录将显示宿主机目录中的内容。
  • 如果宿主机目录为空,那么它会 覆盖 容器内的目标目录,使得目标目录 /clashmeta 的原始内容不可见,宿主机的目录内容(即使为空)优先级更高。

这解释了为什么当使用 ~/temp 本地目录作为挂载点时,它会覆盖容器的 /clashmeta 目录的内容。

3.4 总结

  • 卷挂载 :Docker 卷默认是空的,挂载到容器时不会覆盖容器内已有的数据,Docker 会将容器内的文件复制到卷中。
  • 绑定挂载 :绑定挂载会直接使用宿主机的目录替换容器内的目标目录,导致目标目录的内容不可见。如果宿主机目录为空,容器中的内容也会被覆盖为空。

4.推送与备份镜像

4.1 推送镜像到 Docker Hub

  1. 登录 Docker Hub
1
docker login --username=<your_DockerHub_name>
  1. 标记镜像

将镜像标记为你的 Docker Hub 存储库。例如,将 hexo:latest 标记为 yourusername/hexo:latest

1
docker tag hexo:latest yourusername/hexo:latest

或者通过提交容器:

1
docker commit <container_name/id> yourusername/<image_name>:tag
  1. 推送镜像
1
docker push yourusername/<image_name>:tag

4.1 备份镜像到本地

  1. 保存镜像

使用 docker save 命令将镜像保存到一个 tar 文件。例如,将 hexo:latest 保存到 hexo_latest.tar

1
docker save -o hexo_latest.tar hexo:latest
  1. 加载镜像

以后可以使用 docker load 命令从 tar 文件加载镜像。例如,从 hexo_latest.tar 加载镜像:

1
docker load -i hexo_latest.tar
  • Title: Docker 教程
  • Author: loskyertt
  • Created at : 2024-07-24 10:55:53
  • Updated at : 2024-11-13 03:07:10
  • Link: https://redefine.ohevan.com/2024/07/24/Docker教程/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments