ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【Docker】基本指令

【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 选项,比如

[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会自动复用,无需重复登录

基本语法

docker login [OPTIONS] [SERVER]

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

常用选项

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

3.3 docker pull 指令

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

基本语法

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

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

常用选项

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

使用示例

# 拉取最新版 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 指令

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

基本语法

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

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

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

3.5 docker search 指令

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

基本语法

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 官方公共仓库。

基本语法

docker logout [SERVER]

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

使用示例

# 退出 Docker Hub(默认行为) docker logout # 退出本地或私有仓库(例如 localhost:8080) docker logout localhost:8080

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

3.7 docker images 指令

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

基本语法

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=镜像名 只看早于 镜像名 的镜像

使用示例

# 查看本地所有镜像 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 格式。

基本语法

docker image inspect [OPTIONS] IMAGE [IMAGE...]

常用选项

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

使用示例

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 多了一个可引用的名称,常用于在推送前将镜像“标记”为目标仓库的完整地址。

基本语法

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

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

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

常用示例

1. 为镜像 ID 打标签

docker tag 0e5574283393 fedora/httpd:version1.0

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

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

docker tag httpd:test fedora/httpd:version1.0.test

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

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

docker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0

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

4. 准备推送到 Docker Hub

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 最核心的命令,它将“创建容器”和“启动容器”两步合二为一:先从指定镜像创建一个可运行实例,然后立即启动它。

基本语法

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 操作系统

docker pull ubuntu:latest docker run -it ubuntu:latest cat /etc/*release* // 输入 exit 回到宿主机

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

docker run -d --name my-nginx -p 8080:80 nginx

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

交互式运行一次性容器

docker run --rm -it ubuntu /bin/bash

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

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

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 指令

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

基本语法

docker ps [OPTIONS]

常见选项

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

使用示例

# 查看运行中的容器 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

# 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

systemctl start nginx #或者 nginx

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

关闭 nginx

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

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

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 文件,查看文件内容:

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 服务

#获取 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

#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
返回列表