本文将总结一些常见的重要的docker命令,以作备忘。后续如果有新的比较常用重要的也会更新进来。欢迎补充。
docker服务管理
首先我们要解释一下:systemctl
和docker
命令的不同
systemctl
:是许多 Linux 发行版中默认的初始化系统和服务管理器。使用systemctl
可以管理系统服务,包括启动、停止、重启和查看服务状态,通常需要超级用户权限。可使用他来管理 Docker 服务。
docker
:用于管理容器的生命周期,包括创建、启动、停止和删除容器。通常在 Docker 服务已启动的情况下使用
启动 Docker 服务
sudo systemctl start docker
停止 Docker 服务
sudo systemctl stop docker
重启 Docker 服务
sudo systemctl restart docker
查看 Docker 服务状态
sudo systemctl status docker
启用 Docker 服务开机自启
sudo systemctl enable docker
禁用 Docker 服务开机自启
sudo systemctl disable docker
容器管理
运行容器
bash docker run -it --name [container-name] [image-name]:[tag] docker run -d --name [container-name] [image-name]:[tag]
运行时有 许多参数,熟记这些参数很重要!
运行时的一些参数
-it
docker run -it [image-name]
结合
-i
和-t
参数,-i表示让容器保持标准输入(stdin)打开,-t将分配一个伪终端。说白了就是 :运行并进入容器-d
docker run -d [image-name]
-d代表 以后台模式运行容器。
--name
docker run --name [container-name] [image-name]
为容器指定一个名称。
-p
docker run -p [host-port]:[container-port] [image-name]
将主机端口映射到容器端口。可以多次使用
-p
映射多个端口。--expose
docker run --expose [container-port] [image-name]
暴露容器的指定端口,但不会映射到主机端口。主要用于容器间通信。(当使用Dockerfile时 在Dockerfile写就行了)-v
docker run -v [host-dir]:[container-dir] [image-name]
将主机目录挂载到容器目录。可以多次使用
-v
挂载多个目录。注意:挂载很重要,如果不挂载当容器删除后再次运行的话, 数据将会跟随容器被抹掉。这是大忌,尤其是一些需要留存的数据,比如redis mysql nacos rocketMQ等等。如果你使用docker来运行,那么切记一定要挂载。--mount
docker run --mount type=bind,source=[host-dir],target=[container-dir] [image-name]
绑定挂载,功能类似
-v
,但还是有区别,如下介绍:- v 和 --mount的区别
- -v: 出现比较早的挂载选项,功能强大且灵活,语法简洁,可支持匿名卷,即:可以不指定主机路径,只指定容器内路径,Docker 会在主机上创建一个匿名卷。 也可以支持命名卷就是使用者指定。-v 这种方式兼容性好,适用于 Docker 的各个版本。 > 支持匿名卷:可以不指定主机路径,只指定容器内路径,Docker 会在主机上创建一个匿名卷
docker run -v /container-dir [image-name]
> 支持命名卷:可以使用已有的命名卷或创建新的命名卷docker run -v my-volume:/container-dir [image-name]
- --mount: 是较新的挂载选项,语法更具可读性且更明确,他使用键值对形式,明确指出挂载类型、源路径和目标路径。支持多种挂载类型如: > 绑定挂载(bind mount) :将主机的特定路径挂载到容器内。
docker run --mount type=bind,source=/host-dir,target=/container-dir [image-name]
> 卷挂载(volume) :使用 Docker 卷,支持创建、管理和使用命名卷。docker run --mount type=volume,source=my-volume,target=/container-dir [image-name]
> 临时文件系统挂载(tmpfs) :在内存中创建一个临时文件系统。docker run --mount type=tmpfs,target=/container-dir [image-name]
- -v: 出现比较早的挂载选项,功能强大且灵活,语法简洁,可支持匿名卷,即:可以不指定主机路径,只指定容器内路径,Docker 会在主机上创建一个匿名卷。 也可以支持命名卷就是使用者指定。-v 这种方式兼容性好,适用于 Docker 的各个版本。 > 支持匿名卷:可以不指定主机路径,只指定容器内路径,Docker 会在主机上创建一个匿名卷
- v 和 --mount的区别
-e
docker run -e [env-var]=[value] [image-name]
为容器设置环境变量。可以多次使用-e
设置多个环境变量。--env-file
docker run --env-file [file-path] [image-name]
从文件中读取环境变量并设置到容器中。
--network
```
docker run --network [network-name] [image-name] ```
将容器连接到指定的网络。
--ip
docker run --network [network-name] --ip [container-ip] [image-name]
为容器分配指定的 IP 地址。-m
docker run -m [memory-limit] [image-name]
限制容器使用的内存量,例如-m 512m
或-m 1g
。--cpus
```
docker run --cpus=[number] [image-name] ```
限制容器可以使用的 CPU 数量。
--cpu-shares
```
docker run --cpu-shares [weight] [image-name] ``` 设置容器的 CPU 共享权重,默认值为 1024。
-u
docker run -u [user] [image-name]
指定以哪个用户运行容器。
--privileged
```
docker run --privileged [image-name] ```
以特权模式运行容器,给予容器更高的权限。但是权限越大,风险也就越大, 使用时需要慎重!
--rm
```
docker run --rm [image-name] ```
容器停止后自动删除容器。
--restart
```
docker run --restart [policy] [image-name] ```
容器的重启策略,可选值包括
no:
(不重启容器,默认设置)on-failure:
(仅当容器以非零退出状态(即出现错误)退出时重启容器可以在后边跟:号并指定最多重启几次)always:
(无论退出状态如何,总是重启容器。如果手动停止容器,则不会重启)unless-stopped:
(与 always 类似,但如果容器在 Docker 停止后没有手动重启,则不会在 Docker 启动后重新启动)。
--hostname
```
docker run --hostname [hostname] [image-name] ```
设置容器的主机名其实就是设置到了容器的 /etc/hosts 文件中去了。
--log-driver
```
docker run --log-driver [driver] [image-name] ```
指定容器的日志驱动,例如
json-file
、syslog
。--entrypoint
```
docker run --entrypoint [entrypoint] [image-name] ```
覆盖 Dockerfile 中指定的默认入口点。假设Dockerfile中设置这个容器的入口点是
/bin/bash
。你可以使用--entrypoint
参数将入口点覆盖为/bin/sh
--link
docker run --link [container-name-or-id]:[alias] [image-name]
链接到另一个容器,可以通过别名访问。
列出容器
bash docker ps -a # 列出所有 docker ps # 列出运行中的容器
停止容器
```
docker stop [container-id/container-name] ```
启动容器
```
docker start [container-id/container-name] ```
重启容器
```
docker restart [container-id/container-name] ```
重命名一个容器
docker rename [old-name] [new-name]
更新一个或多个容器的配置
docker update [container-id]
删除容器
一般删除前要先stop容器 ```
docker rm [container-id/container-name] ```
杀死容器
docker kill [container-id/container-name]
暂停容器
docker pause [container-id/container-name]
恢复容器
docker unpause [container-id/container-name]
停止并删除所有容器
docker rm -f $(sudo docker ps -a -q)
查看容器日志
docker logs [container-id/container-name] docker logs -f [container-id/container-name] # 实时显示最新日志 当然你也可以加其他参数在需要的时候
当然如果你的容器的日志挂载到了宿主机, 那么直接去挂载目录查看对应日志文件就行了。
查看容器详细信息
docker inspect [container-id/container-name]
此命令比较重要
,可以一览容器的详情(实际输出我就不粘了要不太占地),下边解释下输出都有哪些东西:
- Id
- 说明:容器或镜像的唯一标识符。
- 示例:
"Id": "e90e34656806"
- Name
- 说明:容器的名称。
- 示例:
"Name": "/my-container"
- State
- 说明:容器的当前状态。
- 子字段:
Status
:容器状态(如running
、exited
)。Running
:容器是否在运行。Paused
:容器是否暂停。Restarting
:容器是否正在重启。OOMKilled
:容器是否因内存不足而被杀死。Dead
:容器是否已死。Pid
:容器的进程 ID。ExitCode
:容器的退出代码。Error
:容器的错误信息。
- Image
- 说明:容器所使用的镜像的 ID。
- 示例:`"Image": "sha256:3b534f..."
- Config
- 说明:容器的配置。
- 子字段:
Hostname
:容器的主机名。Domainname
:容器的域名。User
:容器内运行的用户。Env
:环境变量列表。Cmd
:容器启动时运行的命令。Volumes
:容器使用的卷。WorkingDir
:容器的工作目录。Entrypoint
:容器的入口点。ExposedPorts
:容器暴露的端口。
- NetworkSettings
- 说明:容器的网络设置。(在排查网络问题时你很有用!)
- 子字段:
IPAddress
:容器的 IP 地址。MacAddress
:容器的 MAC 地址。Ports
:容器的端口映射信息。
- Mounts
- 说明:容器的挂载信息。
- 子字段:
Source
:主机上的源路径。Destination
:容器内的目标路径。Mode
:挂载模式。RW
:挂载是否为读写模式。Propagation
:挂载传播设置。
- HostConfig
- 说明:容器的主机配置。
- 子字段:
Binds
:绑定挂载列表。NetworkMode
:网络模式。PortBindings
:端口绑定信息。RestartPolicy
:重启策略。LogConfig
:日志配置。Cgroup
:cgroup 设置。
查看容器资源使用情况
这个比较常用 docker stats [container-id/container-name]
比如我执行:docker stats nacos
看下nacos容器的情况:
进入容器
``` docker exec -it [container-id/container-name] /bin/bash
当然你也可以指定其他shell类型 如:
docker exec -it [container-id/container-name] /bin/sh ```
导出容器
docker export [container-id/container-name] > [file-name].tar
导入容器
docker import [file-name].tar
- 导出和导入容器主要作用:
- 备份容器:保存容器当前状态,以便在需要时恢复。
- 迁移容器:将容器从一个主机转移到另一个主机上。
- 共享容器:将容器发送给其他用户或开发团队,以便他们可以在自己的环境中使用
显示容器中运行的进程
docker top [container-id]
镜像管理
搜索镜像从镜像仓库
docker search [image-name]
拉取镜像
bash docker pull [image-name]:[tag]
列出镜像
docker images
删除镜像
docker rmi [image-name]:[tag]
删除未使用到的image镜像
这个一般要慎重哦,否则还得重新拉或者重新build镜像 docker image prune -a
删除所有镜像
更是要慎重 ,凡是提到 删除所有 一定要慎重。 docker rmi $(docker images -q)
构建镜像
docker build -t [image-name]:[tag] [path-to-dockerfile]
保存镜像
docker save -o [file-name].tar [image-name]:[tag]
- 主要作用: - 备份镜像:将镜像保存为文件,以便在需要时恢复。 - 迁移镜像:将镜像从一个 Docker 主机转移到另一个主机。 - 共享镜像:将镜像保存为文件,并与其他用户或团队共享
加载镜像
docker load -i [file-name].tar
- 主要作用: - 从备份中恢复镜像:当你有一个通过 docker save
命令导出的镜像备份时,可以使用 docker load
命令将其恢复到 Docker 中。 - 迁移镜像:当你需要在不同的主机之间传输镜像时,可以先使用 docker save
命令导出镜像,然后在目标主机上使用 docker load
命令加载镜像。 - 共享镜像:你可以将镜像存档文件共享给其他用户,其他用户可以使用 docker load
命令加载这些镜像
标记镜像
即:将本地镜像标记为远程仓库中的镜像格式
docker tag my-image myusername/my-image:latest
推送镜像
docker push myusername/my-image:latest
推送到远程仓库,供其他需要使用的人 pull。
显示镜像构建历史
docker history [image-name]
网络管理
列出网络
docker network ls
创建自定义网络
docker network create [network-name]
删除网络
docker network rm [network-name]
删除未使用的网络
docker network prune
指定容器使用哪个网络
docker network connect [network-name] [container-name]
断开容器与网络的连接
docker network disconnect [network-name] [container-name]
数据卷管理
列出数据卷
docker volume ls
创建数据卷
```
docker volume create [volume-name] ```
删除数据卷
```
docker volume rm [volume-name] ```
查看数据卷详细信息
docker volume inspect [volume-name]
随便找一个数据卷,看看都有哪些信息: - CreatedAt:卷的创建时间。 - Driver:此卷使用本地驱动创建。 - Labels:代表是匿名卷,没有设置特定标签。 - Mountpoint:卷的数据存储在主机上的 /var/lib/docker/volumes/1cfbeeb7e8decf5b9758cddea04e882c71a63e2684056096153d26b5638693b5/_data
目录中。 - Name:卷的唯一标识符是 1cfbeeb7e8decf5b9758cddea04e882c71a63e2684056096153d26b5638693b5
。 - Options:卷没有设置特殊选项。 - Scope:卷的作用域是本地的,仅在创建它的 Docker 主机上可见。
查看容器的数据卷信息
你也可以查看某个容器中的卷信息,使用这个: docker inspect container-id | grep -A 30 '"Mounts"'
如下是nacos容器的挂载信息:
Docker Compose 常用命令
启动服务
docker-compose up docker-compose up -d # 后台形式 启动
停止服务
docker-compose down
删除容器和网络(但是不会删除卷和镜像)
docker-compose rm
重新启动服务
docker-compose restart
构建或从头(不使用缓存方式)构建镜像
```
根据 docker-compose.yml
文件中定义的构建配置构建服务镜像。它会读取 docker-compose.yml
文件
中的 build
指令,执行 Dockerfile 中定义的构建步骤,生成新的镜像 docker-compose build
也是构建镜像 但是不使用缓存
docker-compose build --no-cache ```
注意这个docker-compose build --no-cache
命令其实在一些场合也比较有用这里解释下:
- 此命令用于构建 Docker Compose 定义的服务镜像,并在构建过程中不使用任何缓存。这意味着每个步骤都会从头开始构建,而不会使用之前构建的中间层缓存。
- 主要作用:
- 强制全新构建:忽略之前构建过程中产生的所有缓存层,从头开始重新构建镜像的每个步骤。
- 确保最新代码:确保使用最新的代码和依赖项,而不会受到之前缓存的影响。
- 调试和测试:在调试和测试环境中,使用此命令可以确保每次构建都从头开始,不会受缓存的影响
拉取服务所需的镜像
docker-compose pull
注意:对于包含 build
指令的服务,通常不需要手动执行 docker-compose pull
因为build命令会自动根据docker-compose 的build模块构建 或者如果你没指定根据Dockerfile build那么将会自动pull
如下示例:
列出服务
和docker ps
一样的效果 docker-compose ps
查看服务日志
和 docker logs [container-id/container-name]
一样的效果 docker-compose logs docker-compose logs -f
查看服务的详细信息
docker-compose config
注意:此命令比较实用,解释下: docker-compose config
命令用于验证并查看 Docker Compose 文件的有效配置。它会输出合并后的配置,其中包含一些从环境变量、默认值等获取的附加信息。运行此命令后,输出通常会比原始的 docker-compose.yml
文件多一些自动生成或默认的字段。
其他常见的自动生成信息如下:
- build
- context:构建上下文目录,通常是包含 Dockerfile 的目录。
- dockerfile:使用的 Dockerfile 文件名,如果未指定,则默认为
Dockerfile
。 - 实际情况如下:
- ports
- mode:端口映射模式,
ingress
表示流量进入容器的方式。 - target:容器内部的目标端口。
- published:发布到主机的端口。
- protocol:使用的协议,通常是
tcp
。 - 实际情况如下:
- mode:端口映射模式,
- networks
- default:默认网络配置。自动添加的网络配置信息,表示容器将连接到默认网络。
- name:默认网络的名称。
docker-compose
会自动为项目创建一个默认网络。 - 实际情况如下:
- depends_on
- 如果服务之间存在依赖关系,
depends_on
字段会列出依赖的服务。该字段会显示服务启动的顺序。 - 实际情况:
- 如果服务之间存在依赖关系,
volumes
- 如果服务使用了卷挂载,
volumes
字段会显示卷的具体挂载点。 - 实际情况:
- 如果服务使用了卷挂载,
restart
- 如果未在
docker-compose.yml
文件中指定restart
策略,docker-compose
可能会显示默认的restart
策略 - 这个我一般都指定了 就是 always,不指定的话默认是no也即不重启。
- 如果未在
停止并删除服务容器、网络和卷
慎用! docker-compose down --volumes --remove-orphans
停止服务但保留网络和卷
docker-compose stop
docker系统的一些信息
查看docker系统能有效让我们了解docker整体的情况胸有成竹。下边列几个常用的:
列出系统中的docker 资源
docker system ls
解释下: - df - 命令:docker system df
- 说明:显示 Docker 磁盘使用情况,包含镜像、容器、卷和构建缓存的大小和可回收空间。 - events - 命令:docker system events
- 说明:获取 Docker 守护进程的实时事件流,如容器启动、停止等。 - info - 命令:docker system info
- 说明:显示系统范围的 Docker 信息,包括版本、存储驱动、网络插件等详细信息。 - prune - 命令:docker system prune
- 说明:删除未使用的数据,包括停止的容器、未使用的网络、悬空镜像和未使用的构建缓存,以释放磁盘空间。
下边我们就来用用这些
查看docker所占磁盘信息
- Images - TOTAL:共有 25 个镜像。 - ACTIVE:其中 17 个镜像正在使用中。 - SIZE:所有镜像总共占用 4.159GB 的磁盘空间。 - RECLAIMABLE:1.412GB(33%)的空间可以通过清理未使用的镜像回收。 - Containers - TOTAL:共有 18 个容器。 - ACTIVE:其中 18 个容器正在运行中。 - SIZE:所有容器总共占用 10.32MB 的磁盘空间。 - RECLAIMABLE:没有可回收的空间(0B),因为所有容器都在运行。 - Local Volumes - TOTAL:共有 521 个本地卷。 - ACTIVE:其中 7 个卷正在使用中。 - SIZE:所有卷总共占用 9.129MB 的磁盘空间。 - RECLAIMABLE:8.919MB(97%)的空间可以通过清理未使用的卷回收。 - Build Cache - TOTAL:共有 134 个构建缓存项。 - ACTIVE:没有活动的构建缓存项(0)。 - SIZE:构建缓存总共占用 8.082GB 的磁盘空间。 - RECLAIMABLE:8.082GB 的空间可以通过清理构建缓存回收
查看 Docker 守护进程的实时事件流,如容器启动、停止
docker system events
在我运行此命令之前,我执行了docker-compose restart
命令(注意如果restart执行完毕 docker system events是没有输出的就得蹭他正在启动或者正在停止等正在进行时
),运行此命令才会有输出,如下:
查看docker系统详情
docker info # 等价与 docker system info
此命令不错,可以一览docker的信息,输出如下: ``` Client: Docker Engine - Community Version: 26.1.4 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.14.1 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.27.1 Path: /usr/libexec/docker/cli-plugins/docker-compose
Server: Containers: 18 Running: 18 Paused: 0 Stopped: 0 Images: 25 Server Version: 26.1.4 Storage Driver: overlay2 Backing Filesystem: xfs Supports dtype: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957 runc version: v1.1.12-0-g51d5e94 init version: de40ad0 Security Options: seccomp Profile: builtin Kernel Version: 3.10.0-1160.102.1.el7.x8664 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x8664 CPUs: 4 Total Memory: 7.637GiB Name: localhost.localdomain ID: 6b8a6c0d-813a-4d11-90a2-f402d7829ada Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://iub4ix1a.mirror.aliyuncs.com/ Live Restore Enabled: false `` 解释: 1. **Containers**:容器数量统计: - **Running**:正在运行的容器数量,如上输出:
18。 - **Paused**:暂停的容器数量,如上输出:
0。 - **Stopped**:停止的容器数量,如上输出:
0。 1. **Images**:镜像数量,如上输出:
25。 1. **Server Version**:服务端版本号,如上输出:
26.1.4。 1. **Storage Driver**:存储驱动类型,如上输出:
overlay2。 - **Backing Filesystem**:底层文件系统,如上输出:
xfs。 - **Supports d_type**:是否支持
dtype,如上输出:
true。 - **Using metacopy**:是否使用 metacopy, 如上输出:
false。 - **Native Overlay Diff**:是否启用原生 overlay 差异, 如上输出:
true。 - **userxattr**:是否启用用户扩展属性, 如上输出:
false。 1. **Logging Driver**:日志驱动类型,如上输出:
json-file。 1. **Cgroup Driver**:Cgroup 驱动类型,如上输出:
cgroupfs。 1. **Cgroup Version**:Cgroup 版本,如上输出:
1。 1. **Plugins**:服务器插件信息: - **Volume**:卷插件,如上输出:
local。 - **Network**:网络插件,如上输出:
bridge、
host等。 - **Log**:日志插件,如上输出:
json-file、
syslog等。 1. **Swarm**:Swarm 模式状态,如上输出:
inactive。 1. **Runtimes**:支持的运行时,如上输出:
io.containerd.runc.v2和
runc。 1. **Default Runtime**:默认运行时,如上输出:
runc。 1. **Init Binary**:初始化二进制文件,如上输出:
docker-init。 1. **containerd version**:containerd 版本。 1. **runc version**:runc 版本。 1. **init version**:init 版本。 1. **Security Options**:安全选项,如上输出:
seccomp和其配置文件。 1. **Kernel Version**:内核版本,如上输出:
3.10.0-1160.102.1.el7.x8664。 1. **Operating System**:操作系统,如上输出:
CentOS Linux 7 (Core)。 1. **OSType**:操作系统类型,如上输出:
linux。 1. **Architecture**:CPU 架构,如上输出:
x8664。 1. **CPUs**:CPU 核心数,如上输出:
4。 1. **Total Memory**:总内存,如上输出:
7.637GiB。 1. **Name**:主机名,如上输出:
localhost.localdomain。 1. **ID**:主机唯一标识符。 1. **Docker Root Dir**:Docker 根目录,如上输出:
/var/lib/docker。 1. **Debug Mode**:调试模式状态,如上输出:
false。 1. **Experimental**:实验性功能状态,如上输出:
false。 1. **Insecure Registries**:不安全的注册表地址,如上输出:
127.0.0.0/8。 1. **Registry Mirrors**:镜像地址,如上输出:
https://iub4ix1a.mirror.aliyuncs.com/。 1. **Live Restore Enabled**:是否启用 Live Restore,如上输出:
false`。
清理docker系统中未使用到的数据
这命令其实也挺常用的,有些不用的数据该清理就清理 docker system prune
这个命令会清理的内容包括: - all stopped containers:删除所有停止的容器。 - all networks not used by at least one container:删除所有未被任何容器使用的网络。 - all dangling images:删除所有悬空镜像(没有标签的镜像)。 - unused build cache:删除所有未使用的构建缓存 好家伙我执行了下发现我去,竟然这些无用数据占了 8.621 GB ! 清理完,感觉一身轻哈哈。
显示容器的资源使用情况(cpu 内存等等 和linxu 的 top命令类似)
docker stats
ok,暂时到这里,后续遇到了比较常见的、有用的docker命令,随时补充进来!