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 选项比如[hxhVM-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 的官网查找URLdocker | Docker Docs3.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 nginxsha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba253.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.03.5 docker search 指令作用用于在 Docker Hub 上按关键词搜索公开镜像但是我们一般使用浏览器直接在 hub.docker.com 上找不会使用命令行找。基本语法docker search [OPTIONS] TERM执行后会返回一个表格包含这几列NAME镜像名。不带/的是官方镜像带/的是用户/组织镜像如username/image。DESCRIPTION镜像描述默认截断。STARS收藏数大致反映受欢迎程度。OFFICIAL显示[OK]表示是 Docker 官方镜像。AUTOMATED是否自动构建此功能已标记弃用。常用选项选项说明-f, --filter按条件过滤支持starsN星数≥N、is-officialtrue仅官方--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按条件过滤例如danglingtrue只看悬空镜像before镜像名 只看早于 镜像名 的镜像使用示例# 查看本地所有镜像 docker images # 只看镜像 ID常用于批量删除等脚本 docker images -q # 查看悬空镜像没有标签、不被任何容器引用的镜像 docker images --filter danglingtrue # 查看 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镜像的内容寻址 IDSHA256RepoTags指向该镜像的本地标签列表RepoDigests从仓库拉取时记录的 manifest digestArchitecture/Os镜像的目标平台Config.Env/Config.Cmd默认环境变量与启动命令RootFS.Layers组成镜像的每一层 digestSize镜像总大小字节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.comdocker.ioDocker HubNAMESPACE用户或组织名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 Hubdocker tag my-app yourusername/my-app:v1.0将本地my-app标记为yourusername/my-app:v1.0之后即可docker push yourusername/my-app:v1.03.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_PASSWORDsecret--rm容器退出后自动删除适合一次性任务-v/--mount挂载数据卷或绑定宿主机目录实现数据持久化--network将容器接入指定网络同一自定义网络内的容器可用名字互相访问--cpuset-cpus绑定容器到指定 CPU运行如--cpuset-cpus0-2 or --cpuset-cpus0,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_PASSWORDsecret --memory512m --cpus0.5 -p 5432:5432 postgres启动一个限制为 512MB 内存、0.5 核 CPU 的 PostgreSQL 容器。3.11 docker ps 指令作用用于列出本地容器及其状态基本语法docker ps [OPTIONS]常见选项选项作用-a, --all显示所有容器包括已停止的-q, --quiet只输出容器 ID适合脚本处理-f, --filter按条件过滤如statusexited、nameweb--format自定义输出如--format {{.Names}}\t{{.Status}}-s, --size显示容器磁盘占用-n, --last显示最近创建的 n 个容器含停止的使用示例# 查看运行中的容器 docker ps # 查看所有容器含已停止 docker ps -a # 只看已退出的容器 docker ps -a --filter statusexited # 只输出所有容器 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、CDN4.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启动 nginxsystemctl start nginx #或者 nginx启动 nginx 后使用浏览器输入云服务器的IP地址直接访问关闭 nginxsystemctl stop nginx #或者 kill -9 nginx的master进程的PIDnginx 的配置文件是 /etc/nginx/nginx.confcat /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 Apaches document root # concurs with nginxs 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 myenvtest -d nginx:1.24.0 #查看镜像信息 docker ps #上面的镜像是后台运行的我们没有办法与它交互也就无法修改首页使用 -it 选项并执行容器 bash 指令 docker run -p 8082:80 --name myweb3 -h myweb1.com -e myenvtest -it nginx:1.24.0 bash rootmyweb1:/# #首页的html存储在/usr/share/nginx/html/index.html rootmyweb1:/# cd /usr/share/nginx/html/ rootmyweb1:/usr/share/nginx/html/# echo Hello World index.html #手动启动 nginx rootmyweb1:/usr/share/nginx/html/# nginx5、综合运用在 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
阅读完成 · 觉得有帮助?