【Docker】基本指令

1、什么是 Docker Registry

镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力。 镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag) 来区分。

一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,镜像的最终内容存储 blob 里面,真正占有空间的就是这些 blob。

2、镜像仓库的分类

按开放程度划分

这是最直观的分类,主要区分谁能访问仓库里的镜像。

  • 公有仓库 :面向公网开放,任何人通常都可以拉取镜像。最典型的是 Docker Hub,它托管了大量官方镜像和用户公开的镜像。国内云厂商(如阿里云、腾讯云)提供的公共镜像服务也属于此类,但往往需要注册账号才能使用。
  • 私有仓库 :部署在私有网络或企业内部,不对外网开放,仅供组织内部使用。它用于存储内部应用镜像,是 CI/CD 流程中衔接构建与部署的关键环节。常见的搭建工具包括 Harbor、Nexus 以及 Docker 官方的 Registry 等。

按角色与用途划分

如果从仓库在镜像分发链路中扮演的角色来看,可以分得更细:

  • 赞助/公共仓库:由第三方运营,同时服务于普通用户和社区,例如 Docker Hub 本身。
  • 镜像/加速仓库:由第三方(通常是云厂商)提供,仅对其客户开放,主要用于加速公网镜像的拉取。例如阿里云的容器镜像服务(ACR)的加速器功能。
  • 供应商仓库 :由发布镜像的软件供应商自己维护,用于分发其官方产品镜像,例如 Google 的 gcr.io 或 Red Hat 的仓库。
  • 私有仓库:企业或组织在内部搭建,完全用于自身业务的镜像存储与分发。

3、Docker 基本指令

3.1 学习建议

不必死记硬背,熟悉即可,如果忘记就在指令后跟 --help 选项,比如

bash 复制代码
[hxh@VM-16-12-centos ~]$ docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

或者在 Docker 的官网查找,URL:docker | Docker Docs

3.2 docker login 指令

作用:用于向镜像仓库(Registry)进行身份认证,以便后续拉取或推送私有镜像。认证成功后,凭证会保存在本地(Linux 下通常是 ~/.docker/config.json),后续的 docker pull 或 docker push 会自动复用,无需重复登录

基本语法

bash 复制代码
docker login [OPTIONS] [SERVER]

如果不指定 SERVER,默认登录的是 Docker 官方公共仓库 https://registry-1.docker.io/

常用选项

选项 说明
-u, --username 指定用户名
-p, --password 指定密码或访问令牌(不推荐在命令行明文使用)
--password-stdin 从标准输入读取密码,适合脚本或 CI/CD 环境

3.3 docker pull 指令

作用:用于从镜像仓库拉取镜像到本地

基本语法

bash 复制代码
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

不指定 TAG 时默认拉取 latest 标签;也可以用 @DIGEST 精确拉取某个内容哈希对应的镜像版本。

常用选项

选项 说明
-a, --all-tags 拉取该仓库下所有标签的镜像
--platform 指定平台架构,如 linux/amd64、linux/arm64,多架构镜像时有用
-q, --quiet 精简输出,只显示镜像 ID

使用示例

bash 复制代码
# 拉取最新版
docker pull nginx

# 拉取指定标签
docker pull nginx:1.27-alpine

# 拉取指定架构(在 arm 机器上拉 amd64 镜像等场景)
docker pull --platform linux/amd64 nginx:latest

# 拉取某仓库所有标签(慎用,可能非常大)
docker pull -a myrepo/myimage

#用 @DIGEST 精确拉取
docker pull nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25

3.4 docker push 指令

作用:用于将本地镜像上传到镜像仓库

基本语法

bash 复制代码
docker push [OPTIONS] NAME[:TAG]

#或者
docker image push [OPTIONS] NAME[:TAG]
选项 说明
-a, --all-tags 推送该仓库下所有标签的镜像
-q, --quiet 精简输出,只显示镜像 ID
--platform 推送指定平台(如 linux/amd64)的单一清单,多架构镜像慎用

推送前必须先将本地镜像"标记"为目标仓库的完整地址,否则 docker push 不知道往哪推。

bash 复制代码
# 格式:docker tag 本地镜像名 仓库地址/命名空间/仓库名:标签
docker tag my-app:latest yourusername/my-app:v1.0

作用:用于在 Docker Hub 上按关键词搜索公开镜像,但是我们一般使用浏览器直接在 hub.docker.com 上找,不会使用命令行找。

基本语法

bash 复制代码
docker search [OPTIONS] TERM

执行后会返回一个表格,包含这几列:

  • NAME :镜像名。不带 / 的是官方镜像,带 / 的是用户/组织镜像(如 username/image)。

  • DESCRIPTION:镜像描述(默认截断)。

  • STARS:收藏数,大致反映受欢迎程度。

  • OFFICIAL :显示 [OK] 表示是 Docker 官方镜像。

  • AUTOMATED:是否自动构建(此功能已标记弃用)。

常用选项

选项 说明
-f, --filter 按条件过滤,支持 stars=N(星数≥N)、is-official=true(仅官方)
--limit 限制返回结果数量(默认通常为 25,最大 100)
--no-trunc 不截断描述信息,显示完整内容
--format 使用 Go 模板自定义输出,如 --format "{``{.Name}}: {``{.StarCount}}"

3.6 docker logout 指令

作用:用于退出已登录的镜像仓库,并清除本地保存的对应凭证。如果不指定仓库地址,默认退出 Docker 官方公共仓库。

基本语法

bash 复制代码
docker logout [SERVER]

SERVER 参数是可选的,可以填仓库的 URL 或主机名。

使用示例

bash 复制代码
# 退出 Docker Hub(默认行为)
docker logout

# 退出本地或私有仓库(例如 localhost:8080)
docker logout localhost:8080

执行成功后,通常会看到类似 Removing login credentials for https://index.docker.io/v1/ 的提示,表示凭证已从本地配置中移除。

3.7 docker images 指令

作用:用于列出本地存储的 Docker 镜像

基本语法

bash 复制代码
docker images [OPTIONS] [REPOSITORY[:TAG]]

可以按仓库名和标签进行精确过滤。例如 docker images java 列出 java 仓库的所有镜像,docker images java:8 只列出标签为 8 的镜像。注意匹配必须是精确的,docker images jav 不会匹配到 java。

常用选项

选项 作用
-a, --all 显示所有镜像,包括中间层镜像(默认会隐藏)
-q, --quiet 只显示镜像 ID,适合脚本处理
--no-trunc 显示完整的镜像 ID,不截断
--digests 额外显示镜像的摘要(digest)
-f, --filter 按条件过滤,例如 dangling=true 只看悬空镜像, before=镜像名 只看早于 镜像名 的镜像

使用示例

bash 复制代码
# 查看本地所有镜像
docker images

# 只看镜像 ID(常用于批量删除等脚本)
docker images -q

# 查看悬空镜像(没有标签、不被任何容器引用的镜像)
docker images --filter "dangling=true"

# 查看 nginx 仓库的所有本地镜像
docker images nginx

默认输出包含 REPOSITORY(仓库名)、TAG(标签)、IMAGE ID(镜像 ID)、CREATED(创建时间)、SIZE(大小)。其中 IMAGE ID 默认截断显示,但通常前几位字符就足以在其他 Docker 命令中引用该镜像。

3.8 docker image inspect 指令

作用:用于查看一个或多个本地镜像的详细元数据,输出为 JSON 格式。

基本语法

bash 复制代码
docker image inspect [OPTIONS] IMAGE [IMAGE...]

常用选项

选项 作用
-f, --format 用 Go 模板自定义输出,提取特定字段,避免阅读大段 JSON
--platform 查看多平台镜像中指定平台(如 linux/amd64)的详细配置(需 API 1.49+)

使用示例

bash 复制代码
docker image inspect nginx:latest

输出中的关键字段

字段 含义
Id 镜像的内容寻址 ID(SHA256)
RepoTags 指向该镜像的本地标签列表
RepoDigests 从仓库拉取时记录的 manifest digest
Architecture / Os 镜像的目标平台
Config.Env / Config.Cmd 默认环境变量与启动命令
RootFS.Layers 组成镜像的每一层 digest
Size 镜像总大小(字节)

3.9 docker tag 指令

作用:用于为本地镜像创建一个新的标签(别名)。它不会复制镜像数据,只是让同一个镜像 ID 多了一个可引用的名称,常用于在推送前将镜像"标记"为目标仓库的完整地址。

基本语法

bash 复制代码
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

理解 TARGET_IMAGE 的组成很重要,因为它决定了镜像会被推送到哪里:

bash 复制代码
[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]
组成部分 说明 默认值
HOST 仓库地址(如 registry.cn-hangzhou.aliyuncs.com) docker.io(Docker Hub)
NAMESPACE 用户或组织名 library(官方镜像命名空间)
REPOSITORY 镜像仓库名 必填
TAG 版本标识 latest

常用示例

1. 为镜像 ID 打标签

bash 复制代码
docker tag 0e5574283393 fedora/httpd:version1.0

将短 ID 为 0e5574283393 的本地镜像标记为 fedora/httpd:version1.0。

2. 为已有名称的镜像打新标签

bash 复制代码
docker tag httpd:test fedora/httpd:version1.0.test

源镜像指定了 httpd:test,目标标签为 fedora/httpd:version1.0.test。

3. 为推送到私有仓库做准备

bash 复制代码
docker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0

目标名称包含了仓库主机名和端口,这样后续 docker push 才会推送到私有仓库而非 Docker Hub。

4. 准备推送到 Docker Hub

bash 复制代码
docker tag my-app yourusername/my-app:v1.0

将本地 my-app 标记为 yourusername/my-app:v1.0,之后即可 docker push yourusername/my-app:v1.0

3.10 docker run 指令

作用:是 Docker 最核心的命令,它将"创建容器"和"启动容器"两步合二为一:先从指定镜像创建一个可运行实例,然后立即启动它。

基本语法

bash 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

IMAGE 是必需的,指定用哪个镜像来创建容器。如果本地没有该镜像,Docker 会先自动拉取

常用选项

选项 作用
-d, --detach 后台运行容器并打印容器 ID
-it -i(保持标准输入打开)+ -t(分配伪终端),用于交互式操作
--name 给容器指定一个名字,便于后续引用,如果不指定,随机生成
-h 指定容器的 hostname
-p, --publish 端口映射,格式 宿主机端口A:容器端口B,访问 A 端口自动转入 B 端口
-P 随机端口映射
-e, --env 设置环境变量,如 -e POSTGRES_PASSWORD=secret
--rm 容器退出后自动删除,适合一次性任务
-v / --mount 挂载数据卷或绑定宿主机目录,实现数据持久化
--network 将容器接入指定网络,同一自定义网络内的容器可用名字互相访问
--cpuset-cpus 绑定容器到指定 CPU运行,如:--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2"
-m 设置容器使用内存最大值

使用示例:

在 CentOS 宿主机上运行一个 ubuntu 操作系统

bash 复制代码
docker pull ubuntu:latest
docker run -it ubuntu:latest
cat /etc/*release* 

// 输入 exit 回到宿主机

后台运行 Web 服务并映射端口

bash 复制代码
docker run -d --name my-nginx -p 8080:80 nginx

在浏览器访问 http://localhost:8080 即可看到 Nginx 默认页。

交互式运行一次性容器

bash 复制代码
docker run --rm -it ubuntu /bin/bash

进入一个临时的 Ubuntu shell,退出后容器自动删除。

带环境变量和资源限制运行数据库

bash 复制代码
docker run -d --name pg -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" -p 5432:5432 postgres

启动一个限制为 512MB 内存、0.5 核 CPU 的 PostgreSQL 容器。

3.11 docker ps 指令

作用:用于列出本地容器及其状态

基本语法

bash 复制代码
docker ps [OPTIONS]

常见选项

选项 作用
-a, --all 显示所有容器,包括已停止的
-q, --quiet 只输出容器 ID,适合脚本处理
-f, --filter 按条件过滤,如 status=exited、name=web
--format 自定义输出,如 --format "{``{.Names}}\t{``{.Status}}"
-s, --size 显示容器磁盘占用
-n, --last 显示最近创建的 n 个容器(含停止的)

使用示例

bash 复制代码
# 查看运行中的容器
docker ps

# 查看所有容器(含已停止)
docker ps -a

# 只看已退出的容器
docker ps -a --filter "status=exited"

# 只输出所有容器 ID(常用于批量操作)
docker ps -aq

# 自定义输出列
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

4、综合运用:搭建一个 Nginx 服务

4.1 正向代理与反向代理

正向代理和反向代理的核心区别在于代理服务器站在哪一方:正向代理站在客户端一边,代替客户端去访问外部;反向代理站在服务端一边,代替后端服务器接收外部请求。

正向代理

正向代理部署在客户端与目标服务器之间 ,客户端主动配置代理地址(VPN),请求先发给代理,再由代理转发给目标服务器。对目标服务器而言,它只知道请求来自代理,不知道真正的客户端是谁。

  • 典型用途:突破网络访问限制、企业内网统一出口、缓存常用资源、隐藏客户端身份。
  • 关键特征 :代理对象是客户端,客户端需要显式配置才能使用。

反向代理

反向代理部署在服务器端前面,客户端直接访问代理地址,代理再将请求分发给后端的真实服务器。对客户端而言,它以为自己在直接访问目标服务,不知道背后有多台服务器。

  • 典型用途:负载均衡(把请求分发到多台后端)、SSL/TLS 终止(HTTPS 在代理层解密)、缓存静态内容、隐藏后端服务器拓扑、统一入口与安全防护。
  • 关键特征 :代理对象是服务器,客户端无需任何配置,甚至感知不到代理的存在。

对比总结

维度 正向代理 反向代理
代理谁 代理客户端 代理服务器
部署位置 靠近客户端 靠近服务器端
客户端配置 需要显式配置代理地址 无需配置,直接访问代理地址
目标服务器感知 不知道真实客户端 不知道真实客户端(只知道代理)
主要目的 访问控制、突破限制、隐藏客户端 负载均衡、安全防护、缓存、统一入口
典型例子 浏览器代理、VPN、企业上网代理 Nginx 反向代理、Harbor 前置 Nginx、CDN

4.2 nginx 介绍

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,同时也能作为邮件代理和通用的 TCP/UDP 代理使用。它以占用内存少、并发处理能力强而闻名,是目前互联网上最主流的 Web 服务器之一。

核心角色与功能

结合之前了解的反向代理概念,Nginx 最常扮演的角色正是站在服务器端的那个代理。它的主要用途包括:

  • Web 服务器:直接处理并返回静态文件(如 HTML、图片、CSS),在这方面性能表现突出。

  • 反向代理与负载均衡:作为统一入口接收客户端请求,再按照策略(如轮询)分发给后端的多台应用服务器,从而隐藏后端拓扑、分摊压力。

  • 缓存:缓存后端响应,减少对应用服务器的重复请求,加快响应速度。

为什么性能好

Nginx 的高性能主要源于其架构设计。它采用事件驱动的异步非阻塞模型,而不是像传统服务器那样为每个连接创建一个线程或进程。这种设计让它能用很少的资源同时处理数万个并发连接。在运行方式上,它通常由一个 master 进程管理多个 worker 进程,worker 进程负责实际处理请求,master 进程负责读取配置和管理 worker。

4.3 宿主机安装和启动 nginx

安装 nginx

bash 复制代码
# ubuntu 安装nginx 
apt install nginx -y 

# centos 
# centos 配置nginx 源 
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 构建缓存,加速下载
yum makecache
#开始下载
yum install -y nginx

启动 nginx

bash 复制代码
systemctl start nginx

#或者
nginx

启动 nginx 后,使用浏览器输入云服务器的IP地址直接访问:

关闭 nginx

bash 复制代码
systemctl stop nginx

#或者
kill -9 nginx的master进程的PID

nginx 的配置文件是 /etc/nginx/nginx.conf

bash 复制代码
cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

我们关注 include /etc/nginx/conf.d/*.conf; 查看 include /etc/nginx/conf.d/ 目录,发现有一个 default.conf 文件,查看文件内容:

bash 复制代码
cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

/etc/nginx/conf.d/default.conf 是 Nginx 安装后自动生成的一个默认站点配置文件,它的核心作用是为 Nginx 提供一个开箱即用的基础配置,让你安装完成后就能通过服务器 IP 访问到一个默认页面。

它的具体作用与内容

这个文件本质上是一个被 nginx.conf 主配置自动加载的"配置片段"。Nginx 的主配置文件 /etc/nginx/nginx.conf 中通常有一行 include /etc/nginx/conf.d/*.conf;,这意味着 conf.d 目录下所有以 .conf 结尾的文件都会被自动纳入配置。

default.conf 里通常定义了一个默认的 server 块(虚拟主机),包含以下基础设置:

  • 监听端口:默认监听 80 端口。

  • 服务器名称 :通常设置为 _ 或 localhost,用于匹配未指定域名或直接通过 IP 访问的请求。

  • 网站根目录 :指定默认的网页文件存放路径(如 /usr/share/nginx/html)。

  • 默认首页 :指定 index.html 等作为默认加载的文件。

使用时的注意事项

可以修改,但要注意更新覆盖 :你可以直接编辑这个文件来调整默认站点的行为(比如换根目录、加反向代理规则)。不过,部分安装方式生成的该文件可能带有注释,提示它由系统自动生成,手动修改的内容在软件包更新时可能会被覆盖。对于生产环境,更稳妥的做法是为你的具体站点新建独立的 .conf 文件 放在 conf.d 目录下,而不是直接改动 default.conf。

它只是默认入口 :当你配置了其他带有具体 server_name 的站点后,default.conf 通常只负责承接那些没有匹配到任何具体域名的"兜底"请求,或者直接访问 IP 的请求。如果你不需要这个默认页面,可以将其删除或禁用(例如重命名为 .conf.bak),但前提是你要确保有其他配置能处理发往本机 80 端口的请求。

4.4 Docker 搭建 Nginx 服务

bash 复制代码
#获取 Nginx 镜像
docker pull nginx:1.24.0

#查看 nginx 镜像是否获取成功
docker images nginx

#查看镜像的详细信息
docker image inspect nginx:1.24.0

#启动镜像
docker run -p 8080:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.24.0

#查看镜像信息
docker ps

#上面的镜像是后台运行的,我们没有办法与它交互,也就无法修改首页,使用 -it 选项,并执行容器 bash 指令
docker run -p 8082:80 --name myweb3 -h myweb1.com -e myenv=test -it nginx:1.24.0 bash
root@myweb1:/#

#首页的html存储在/usr/share/nginx/html/index.html
root@myweb1:/# cd /usr/share/nginx/html/
root@myweb1:/usr/share/nginx/html/# echo "Hello World" > index.html

#手动启动 nginx
root@myweb1:/usr/share/nginx/html/# nginx

5、综合运用:在 Docker Hub 创建私有仓库

5.1 Busybox 介绍

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一 些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。 简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。busybox 是一个集成了一百多个最常用 linux 命令和 工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区1M左右的大小,拉取的速度快。

5.2 宿主机安装和使用 Busybox

bash 复制代码
#Ubuntu 安装 
apt install -y busybox 

#CentOS 安装 
wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate 

mv busybox-x86_64 busybox 
chmod +x busybox

#使用Busybox
./busybox ll
./busybox ping www.baidu.com
相关推荐
mengge.cloud1 小时前
10-28-Kubernetes健康检查认证授权与Dashboard
云原生·容器·kubernetes
日常筹谋记1 小时前
数据中心逆变设备运维|通讯对接、动环接入与多系统联动方案科普
运维·网络
强哥聊算力1 小时前
《算力江湖·Intel帝国往事》第三集:安迪·格鲁夫的铁血时代:Intel为什么能把对手逼到墙角?
运维·人工智能·科技·算法·ai·gpu算力
正在走向自律1 小时前
Linux 服务器部署 DeepSeek 大模型完全指南(2026 版)
linux·运维·服务器·deepseek·部署deepseek·安装ollama·配置api服务
mosaicwang2 小时前
使用XSHELL的ssh隧道/代理连接服务器
运维·xshell·ssh隧道
JoyCong19982 小时前
ToDesk鸿蒙PC端又焕新!远控更稳、操作更准,跨端办公如本地
运维·华为·智能手机·harmonyos·远程工作
KeyAction66662 小时前
从西班牙高铁追尾看安全系统设计:当违规指令成为输入,防护逻辑如何兜底
运维·服务器·安全
夜雪一千2 小时前
Linux 管道、重定向命令介绍
linux·运维·chrome
江华森2 小时前
数据中心网络技术基础 —— 从原理到实操
linux·运维