docker基础命令讲解

文章目录

  • 镜像仓库
  • 容器生命周期
  • 容器
  • 容器清理
  • 镜像类
  • 部分重要命令详解
    • [1. `docker run`:运行容器](#1. docker run:运行容器)
    • [2. `docker exec`:进入运行中的容器](#2. docker exec:进入运行中的容器)
    • [3. `docker build`:自定义镜像](#3. docker build:自定义镜像)
    • [4. `docker logs`:查看容器日志](#4. docker logs:查看容器日志)
    • [5. `docker diff`:查看指定容器对系统文件的更改情况](#5. docker diff:查看指定容器对系统文件的更改情况)
    • [6. `docker cp`:容器数据和宿主机的数据拷贝](#6. docker cp:容器数据和宿主机的数据拷贝)
    • [7. `docker export`和`docker import`:](#7. docker exportdocker import:)

wen♥的提示

在学习这些命令前,务必先了解docker的相关概念,不然可能云里雾里。

镜像仓库

命令 主要作用 常用示例
docker login 登录到一个 Docker 镜像仓库 docker login (登录 Docker Hub)
docker pull 从镜像仓库拉取(下载)一个镜像 docker pull nginx:latest
docker push 将一个本地镜像推送(上传)到镜像仓库 docker push myusername/my-app:v1
docker search 在 Docker Hub 中搜索镜像 docker search ubuntu (用的少,一般直接官网看)
docker logout 从一个 Docker 镜像仓库登出 docker logout

容器生命周期

命令 (Command) 描述 (Description) 使用示例 (Example)
docker create 创建容器 :创建容器但不立即启动,容器进入 created 状态。 docker create --name my-nginx nginx_image
docker run 创建并运行 :一步完成创建和启动,容器直接进入 running 状态。 docker run -d -p 80:80 --name web nginx_image
docker start 启动容器 :将一个已创建或已停止的容器转为 running 状态。 docker start my-nginx_contianer
docker stop 停止容器 :将一个运行中的容器优雅地 转入 stopped 状态。 docker stop web_container
docker kill 强制停止容器强制 让容器转入 stopped 状态。(退出速度很快,但是不推荐,因为可能引起数据丢失,除非你不要了) docker kill web
docker restart 重启容器 :将一个运行中的容器先停止再启动,最终进入 running 状态。 docker restart web_container
docker pause 暂停容器 :将容器内的所有进程挂起,容器进入 paused 状态。 docker pause web_container
docker unpause 恢复容器 :取消暂停状态,让容器恢复到 running 状态。 docker unpause web_container
docker rm 删除容器 :将一个处于 stoppedcreated 状态的容器永久删除 docker rm my-nginx_container

容器

命令 (Command) 功能 (Function) 使用示例 (Example)
docker create 创建一个新容器,但不立即启动。 docker create --name my-nginx nginx
docker run 创建并立即启动一个新容器。 docker run -it --name my-ubuntu ubuntu /bin/bash
docker attach 连接到一个正在运行的容器的终端。 docker attach my-ubuntu
docker commit 根据容器的当前状态创建一个新的镜像。(这个用的很少,一般通过Dockerfile创建镜像) docker commit my-ubuntu my-ubuntu-image:v1
docker cp 在容器和宿主机之间复制文件或文件夹。 docker cp /root/index.html my-nginx:/usr/share/nginx/html/docker cp docker_nginx:/docker_dir/html /root
docker diff 检查容器文件系统与镜像相比发生的变化。 docker diff my-nginx
docker exec 在一个正在运行的容器内部执行命令。 docker exec -it my-ubuntu ls -l /
docker export 将容器的文件系统导出为一个 .tar 压缩包。 docker export -o my-ubuntu.tar my-ubuntu
docker inspect 查看一个或多个容器的详细配置信息。 docker inspect my-nginx
docker kill 强制停止(杀死)一个或多个正在运行的容器。 docker kill my-nginx
docker logs 获取一个容器的日志输出。 docker logs -f my-nginx
docker ps 列出所有正在运行的容器。 docker ps -a (列出所有容器)
docker pause 暂停一个容器内的所有进程。 docker pause my-nginx
docker port 查看容器的端口映射情况。 docker port my-nginx
docker prune 清理所有已停止的容器。 docker container prune
docker rename 重命名一个已存在的容器。 docker rename my-nginx my-web-server
docker restart 重启一个或多个容器。 docker restart my-nginx
docker rm 删除一个或多个容器。 docker rm my-ubuntu
docker start 启动一个或多个已经停止的容器。 docker start my-nginx
docker stats 实时显示容器的资源使用情况(CPU, 内存等)。 docker stats
docker stop 优雅地停止一个或多个正在运行的容器。 docker stop my-nginx
docker top 显示一个运行中容器内部的进程。 docker top my-nginx
docker unpause 恢复一个被暂停的容器内的所有进程。 docker unpause my-nginx
docker update 更新一个或多个容器的配置。 docker update --cpus="2" my-nginx
docker wait 阻塞并等待一个或多个容器停止 容器停止后,返回状态码,一般CI/CD的脚本用的多。 docker wait my-nginx1 my-nginx2

容器清理

关于悬空文件的概念解释:

悬空意思是不被任何镜像或者容器等别的程序所使用,类似于c++中的野指针,没有任何用处了,只会占用磁盘空间,因此自然应该被删除。

命令 清理对象 详细说明 常用场景/注意事项
docker container prune 已停止的容器 只删除所有已经停止的容器。对正在运行的容器没有影响。 最安全、最常用的清理命令,用于回收容器占用的少量资源。
docker image prune 悬空镜像 (默认) 默认只删除悬空镜像 (即没有标签,且不被任何容器引用的镜像)。使用 -a (--all) 标志可以删除所有未被任何容器使用的镜像。 释放由旧的、无用的镜像占用的磁盘空间。-a 选项非常有用但需确认镜像不再需要。
docker volume prune 悬空数据卷 删除所有当前未被任何容器(包括已停止的容器)使用的数据卷。 谨慎使用! 确认不再需要持久化数据时,用它来回收磁盘空间。docker volume rm <卷名1> <卷名2..>
docker network prune 未使用的网络 删除所有未被任何容器使用 的自定义网络。不会删除 Docker 默认的 bridge, host, none 网络。 清理因实验或容器被强制删除而遗留的网络配置。
docker system prune 多种资源 这是一个一键清理 命令,会执行 container prune, image prune (悬空), 和 network prune默认不清理数据卷 。使用 --volumes 标志会额外执行 volume prune 定期对开发环境进行全面清理。在生产环境中使用 --volumes 标志时要极度小心!

镜像类

命令 (Command) 描述 (Description) 使用示例 (Example)
docker images 列出本地存储的所有镜像。 docker images
docker build 使用 Dockerfile 构建一个新的镜像。 docker build -t my-app:1.0 .
docker pull 从远程仓库(如 Docker Hub)拉取(下载)一个镜像。 docker pull nginx:latest
docker push 将一个本地镜像推送(上传)到远程仓库。 docker push myusername/my-app:v1
docker rmi 删除一个或多个本地的镜像。 docker rmi nginx:latest
docker tag 为一个已存在的镜像创建一个新的标签(别名)。 docker tag nginx:latest my-nginx:v1.0
docker save 将一个或多个镜像打包成一个 .tar 归档文件。 docker save -o nginx.tar nginx:latest
docker load 从一个 .tar 归档文件加载一个镜像。 docker load -i nginx.tar (-i是input的意思,把对应的压缩文件转成镜像)
docker inspect 查看一个镜像的详细配置信息。 docker image inspect nginx:latest
docker history 查看镜像的构建历史(分层) docker history ubuntu:latest

部分重要命令详解

1. docker run:运行容器

docker run 是 Docker 中功能最强大、选项最多的命令。它实际上是 docker createdocker start 两个命令的组合。

  • 幕后机制 :当你执行 docker run 时,Docker 在后台执行了以下操作:

    1. 检查本地是否存在指定的镜像,如果不存在,则从远程仓库 pull 下来。
    2. 使用该镜像创建一个新的容器(等同于 docker create)。
    3. 分配文件系统,并挂载一个可读写的层。
    4. 分配网络接口,并从宿主机桥接一个 IP 地址。
    5. 启动容器(等同于 docker start)。
    6. 执行你在命令中指定的应用程序或命令。
  • 常用选项

选项 (Option) 作用 示例
-d, --detach 后台运行:让容器在后台运行,并返回容器 ID。这是运行服务的标准姿势。 docker run -d nginx
-it 交互式终端-i (interactive) 保持标准输入打开,-t (tty) 分配一个伪终端。通常组合使用,用于进入容器内部进行交互。 docker run -it ubuntu /bin/bash
-p 端口映射 :将宿主机的端口映射到容器的端口。格式为 宿主机端口:容器端口 docker run -d -p 8080:80 nginx (访问宿主机的 8080 端口即访问容器的 80 端口)
-v, --volume 数据卷挂载 :将宿主机的目录挂载到容器内,实现数据持久化。格式为 宿主机绝对路径:容器内路径 docker run -d -v /my/html:/usr/share/nginx/html nginx (将宿主机的 /my/html 目录内容同步到容器的 Nginx 网站根目录)
--name 指定容器名称:为容器指定一个易于记忆的名称,方便后续操作。 docker run -d --name my-web-server nginx
--rm 自动删除:当容器退出时,自动删除该容器。常用于测试或一次性任务。 docker run --rm ubuntu echo "Hello World"
-e, --env 设置环境变量:在容器内设置环境变量,常用于传递配置信息。 docker run -d -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
--link 与其他容器进行网络连接【已废弃】: 原理是在/etc/hosts路径下生成 对应的域名,这样输入对应名称就可以解析到指定ip。不过这种链接方式是单向的! docker run -it --name 'app2' --link app1:网络名称 新容器名称:tag /bin/bash

2. docker exec:进入运行中的容器

当容器在后台运行时(使用 -d 选项),我们如何与它交互?docker exec 就是答案。

  • 幕后机制docker exec 会在一个已经运行的容器内部 启动一个新的进程

  • 常用选项与示例

    最常见的用法是结合 -it 获取一个交互式的 Shell:

    bash 复制代码
    # 在名为 my-web-server 的容器中启动一个 bash 终端,指定/bin/bash作为shell解释器
    docker exec -it my-web-server /bin/bash 

    你也可以用它来执行单个命令,而无需进入容器:

    bash 复制代码
    # 查看 my-web-server 容器内 /etc 目录的文件列表
    docker exec my-web-server ls /etc

3. docker build:自定义镜像

docker build 命令通过读取 Dockerfile 文件的指令来自动构建镜像。

  • 幕后机制

    1. Docker 客户端将 Dockerfile 所在目录(称为"构建上下文")的所有文件打包发送给 Docker守护进程。
    2. 守护进程逐行解析 Dockerfile 的指令。
    3. 每执行一条指令,就在上一层的基础上创建一个新的镜像层。
    4. Docker 会利用缓存机制,如果某条指令及其依赖文件没有变化,会直接使用之前构建的缓存层,从而大大加快构建速度。
  • 常用选项

选项 (Option) 作用 示例
-t, --tag 命名和打标签 :为构建好的镜像指定一个 名称:标签。这是最重要的选项。 docker build -t my-app:1.0 .
. (末尾的点) 构建上下文路径 :指定 Dockerfile 所在的目录。. 表示当前目录。 docker build -t my-app:1.0 .
-f, --file 指定 Dockerfile 文件 :如果你的 Dockerfile 文件名不是 Dockerfile,或者不在当前目录,用此选项指定。 docker build -f /path/to/MyDockerfile -t my-app .
--no-cache 禁用缓存:强制 Docker 在构建时不使用任何缓存,确保所有指令都重新执行。 docker build --no-cache -t my-app:1.0 .

4. docker logs:查看容器日志

对于后台运行的服务,查看日志是定位问题的唯一途径。

  • 幕后机制docker logs 命令会获取并显示容器主进程的标准输出 (stdout) 和标准错误 (stderr)。

  • 常用选项

选项 (Option) 作用 示例
-f, --follow 实时跟踪 :持续输出日志,类似于 tail -f 命令,方便实时监控。 docker logs -f my-web-server
--tail 查看末尾日志:只显示日志的最后 N 行。 docker logs --tail 100 my-web-server
--since 显示最近某段时间的日志(m是分钟) docker logs --since 15m <容器名称或ID>

5. docker diff:查看指定容器对系统文件的更改情况

bash 复制代码
docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
c1f43583dbef   nginx:latest   "/docker-entrypoint...."   15 minutes ago   Up 15 minutes   80/tcp    oom_st
docker diff $(docker ps -q)
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

如上,查看了nginx容器对linux文件的修改情况:

  • A(Added):表示这个文件原始镜像不存在,是启动容器后新增的
  • C(Changed):原始镜像含有这个文件,但是运行期间修改了该文件
  • D(Deleted):删除了原始镜像的指定文件

6. docker cp:容器数据和宿主机的数据拷贝

1、容器->宿主机

以nginx为例,我们把nginx的/usr/share/nginx/html/index.html从容器中拷贝出来:

bash 复制代码
docker ps #查看nginx容器
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
c1f43583dbef   nginx:latest   "/docker-entrypoint...."   29 minutes ago   Up 29 minutes   80/tcp    oom_st
docker exec -it $(docker ps -aq) /bin/bash #进入nginx容器,查看是否含有index文件
cd /usr/share/nginx/html          
ls -lh 
total 8.0K
-rw-r--r-- 1 root root 497 Oct 28 12:05 50x.html
-rw-r--r-- 1 root root 615 Oct 28 12:05 index.html #有index文件
pwd
/usr/share/nginx/html # 获取地址
exit #从容器交互界面退出
docker cp $(docker ps -aq):/usr/share/nginx/html/index.html ./ #执行拷贝命令
Successfully copied 2.56kB to /root/./ 
ls -lh | grep index
-rw-r--r-- 1 root root  615 Oct 28 20:05 index.html # 拷贝成功

2、宿主机->容器

加入我们想把nginx容器的默认页面替换成这样:

操作步骤:

bash 复制代码
ls -lh | grep index
-rw-r--r-- 1 root root  615 Oct 28 20:05 index.html #我们要替换的宿主机上的index.html
docker cp ./index.html $(docker ps -aq):/usr/share/nginx/html  #执行拷贝
Successfully copied 2.56kB to c1f43583dbef:/usr/share/nginx/html

curl localhost # 查看是否生效

<!DOCTYPE html>
<html>
<head>
<title>Welcome to hyy blog</title> # <<<<---生效了
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to hyy blog</h1>

7. docker exportdocker import:

这一组命令实际用的很少,了解即可

这两个命令是针对容器使用的。docker export把正在运行或者停止的容器,打包成tar文件;docker import可以把对应的tar文件转为新的容器。

这里转化的容器有一下特点:

  • 比原有容器内存要小一些(结构扁平化),因为它不会存储构建历史
  • 丢失CMD启动命令以及环境变量等元数据
  • docker save/docker loadtar文件不可混用

操作方式:

bash 复制代码
docker export -o oom_st.tar oom_st #镜像转tar文件
ls -lh
total 649M
-rw------- 1 root root 147M Feb  1 16:33 oom_st.tar
docker import oom_st.tar my_oom_nginx:v1 #导出为镜像
sha256:59ae3d65ef77e97f215482f35b58d73bf729ac35590506c7cc0ad85dfebc371e
docker images #查看是否导出
REPOSITORY                                                                  TAG                   IMAGE ID       CREATED              SIZE
my_oom_nginx                                                                v1                    59ae3d65ef77   About a minute ago   150MB
相关推荐
white-persist2 小时前
【Js逆向 python】Web JS 逆向全体系详细解释
运维·服务器·前端·javascript·网络·python·sql
委婉待续2 小时前
关于ubuntu开机进入recovering journal的解决方法
linux·运维·ubuntu
m0_612591972 小时前
江苏智算中心排名与格局分析:尚航科技无锡智算中心的标杆地位
运维·服务器·科技·php·idc
yiwenrong2 小时前
CentOS 6与CentOS 7的区别
linux·运维·centos
切糕师学AI2 小时前
K8s 中,为什么同一主机上的两个 Pod 可以监听相同端口而不冲突?
云原生·容器·kubernetes
sxgzzn2 小时前
分布式光伏管理系统:实现多场景电站的集中监控与智能运维
运维·分布式
晨非辰2 小时前
Makefile构建哲学:从依赖推导到自动化编译,掌握大型项目的构建逻辑,告别手动编译焦虑
linux·运维·服务器·c++·人工智能·后端·自动化
写代码的小阿帆2 小时前
SpringBoot项目部署——命令行、Nginx代理与docker容器
spring boot·nginx·docker
J超会运2 小时前
Nginx安全配置实战:8大核心功能详解
运维·nginx·安全