Docker核心概念与镜像仓库操作指南
文章目录
- 一、名词概念
- Docker镜像
- Docker镜像仓库
- 二、Docker镜像仓库常用命令
- 三、容器启动相关指令
- Nginx
- docker run
- docker ps
- 四、综合实例
- 1.搭建Nginx服务
- 2.Docker hub上创建私有仓库
一、名词概念
Docker镜像
Docker 镜像:是一个只读的模板,它包含了创建并运行一个 Docker 容器所需的所有指令、文件系统和参数。
可以把它想象成一个软件的安装包或模具。这个安装包不仅包含了程序本身,还包含了它运行所需的所有依赖项(如库、环境变量、配置文件等)。
一个生动的比喻:做蛋糕
- Dockerfile(食谱):这是一个文本文件,里面写满了做蛋糕的指令,比如“准备面粉”、“加入鸡蛋”、“在 180°C 下烘烤 30 分钟”。
- Docker 镜像(蛋糕模具):你根据“食谱”(Dockerfile)的指令,准备好所有原材料(代码、依赖库),并烤好了一个完整的、但还没切的蛋糕。这个蛋糕被做成了一个标准的“模具”(镜像)。这个模具是只读的,保证了每次用它做出来的蛋糕都是一模一样的。
- Docker 容器(切下来的蛋糕):当你从“模具”(镜像)里切下一块蛋糕来吃时,这块蛋糕就是一个容器。它是镜像的一个运行实例,是可读可写的。你可以在这块蛋糕上加上草莓(对容器进行修改),但这不会影响原来的模具(镜像)。
Docker镜像仓库
Docker 镜像仓库:是一个集中存储和分发 Docker 镜像的服务,就像一个专门的应用商店(如 iOS 的 App Store)或代码仓库(如 GitHub),但它只管理 Docker 镜像。
你可以把它想象成一个图书馆:
-
书 = Docker 镜像
-
图书馆 = Docker 镜像仓库
-
借书/还书 = 拉取镜像/推送镜像
docker官方架构图:
docker镜像仓库架构图:
docker官网:https://www.docker.com/
实际工作镜像仓库的使用
- 开发环境:开发人员使用的一套环境
- 测试环境:需求开发完成后,发布到供测试人员进行测试的环境
- 预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布
- 生产环境:真正面向客户的环境
二、Docker镜像仓库常用命令
docker命令学习
命令行:docker --help
官网学习:www.docker.com -> Developers -> Documentation -> Reference ->Docker CLI
docker login
功能:登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
语法:
docker login [OPTIONS] [SERVER]
关键参数
-u
: 登陆的用户名-p
: 登陆的密码
示例:
docker login
docker login https://index.docker.io/vi/
docker login -u zhangsan
docker pull
功能:从镜像仓库中拉取或者更新指定镜像到本地
语法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
关键参数:
-a
:拉取所有 tagged 镜像--disable-content-trust
:忽略镜像的校验,默认开启
示例:
docker pull nginx:1.23.3
docker push
功能:将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
语法:
docker push [OPTIONS] NAME[:TAG]
别名:docker image push
关键参数:
-a
:推送所有 tagged 镜像--disable-content-trust
:忽略镜像的校验,默认开启
在推送push前需要在官网创建自己的仓库。push推送时需要用这个格式的标签名:用户名/仓库名:标签
使用tag命令将要推送的镜像起一个标签名:
比如:docker tag nginx:1.23.4 zhangsan/mybitnginx:v1.23.4
推送:
docker push zhangsan/mybitnginx:v1.23.4
docker search
功能:从 Docker Hub 查找镜像
语法:
docker search [OPTIONS] TERM
关键参数:
--no-trunc
:显示完整的镜像描述-f <过滤条件>
:列出收藏数不小于指定值的镜像
示例:
docker search -f stars=10 nginx
docker logout
功能:登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
语法:
docker logout [SERVER]
docker images
功能:列出本地镜像
语法:
docker images [OPTIONS] [REPOSITORY[:TAG]]
别名:docker image ls
, docker image list
关键参数:
-a
:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);--digests
:显示镜像的摘要信息;-f
:显示满足条件的镜像;--format
:指定返回值的模板文件;--no-trunc
:显示完整的镜像信息;-q
:只显示镜像 ID。
docker image
功能:查看镜像详细信息
语法:
docker image inspect [OPTIONS] IMAGE [IMAGE...]
示例:
docker image list
docker image inspect 0f8498f13f3a
docker image inspect nginx:1.22.1
docker tag
功能:标记本地镜像,将其归入某一仓库
语法:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
别名:docker image tag
示例:
docker tag ubuntu:22.04 zhangsan/myubuntu:v1.22.1
三、容器启动相关指令
Nginx
Nginx是一款高性能的开源软件,最初被设计为“网页服务器”,但现在更广泛地被用作“反向代理”、“负载均衡器”和“HTTP 缓存”。
可以把它想象成一个高效的“交通枢纽”或“万能前台”,它负责接收所有进入网站的流量(请求),然后智能地将这些流量引导到正确的服务器(或服务)上,同时还能处理安全、加速等多项任务。
- 正向代理:代理客户端(如 VPN),替客户端去访问网站,隐藏客户的身份。
- 反向代理:代理服务器端,替服务器接收客户端的请求。客户端并不知道真正处理它请求的是后端的哪台服务器。
反向代理:
- 隐藏后端架构:保护内部服务器(如 Node.js, Java, Python 应用服务器)的安全,不直接暴露在公网上。
- 负载均衡:当你的网站访问量很大时,一台服务器会扛不住。你会拥有多台完全一样的服务器(形成一个服务器集群)。Nginx 作为反向代理,可以像一个大管家一样,把收到的用户请求“均匀地”分发给后端的多台服务器。
- 扩展性:通过添加更多服务器来轻松应对高流量。
- 高可用性:如果其中一台服务器宕机了,Nginx会自动停止将请求发往那台坏掉的机器,保证服务不中断。
- 减轻单台服务器压力:每台服务器都不会过载。
HTTP 缓存
Nginx 可以把后端服务器的响应(如网页、图片)临时存储(缓存)在自己这里。
工作流程:当第一个用户请求某个页面时,Nginx 会去后端服务器获取数据,然后返回给用户,同时自己保存一份。当第二个用户请求同一个页面时,Nginx直接把自己缓存的内容返回给用户,而不用再去麻烦后端服务器。
好处:
- 极大加快响应速度:用户感觉网站变得飞快。
- 极大减轻后端服务器压力:后端服务器只需要处理动态请求,静态内容由 Nginx 缓存提供。
Nginx安装
检查是否已经安装:ps -ef | grep nginx
,如果有了就不用装
下载安装:
- Ubuntu:
sudo apt install nginx -y
- CentOS:
sudo yum install nginx -y
- 启动:
systemctl restart nginx
查看效果:
打开浏览器输入云服务器公网ip,会出现这样的网页:
docker run
功能: 创建一个新的容器并运行一个命令
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
别名:docker container run
关键参数:
-d
:后台运行容器,并返回容器 ID-i
:以交互模式运行容器,通常与 -t 同时使用-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用-P
:随机端口映射,容器内部端口随机映射到主机的端口-p
:指定端口映射,格式为:主机(宿主)端口:容器端口--name="nginx-lb"
:为容器指定一个名称-h "mars"
:指定容器的 hostname-e username="ritchie"
:设置环境变量--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2"
:绑定容器到指定 CPU 运行-m
:设置容器使用内存最大值--network="bridge"
:指定容器的网络连接类型--link=[]
:添加链接到另一个容器--volume, -v
:绑定一个卷-rm
:shell 退出的时候自动删除容器
示例:
到官网找到centos7
查看宿主机版本:cat /etc/*release*
将centos:7拉取到本地:docker pull centos:7
运行centos:7:docker run centos:7
这里执行docker run 不带任何选项看上去没有任何效果,其实这个容器已经被打开了但因为没交互所以退出了。
使用docker ps -a
可以看到历史执行过的容器
添加-it选项以交互形式运行容器,如下:
注意:通常不会单独使用-i或-t选项,需要两个一起使用,即-it(常用于交互式容器)
接下来我们运行一个nginx:1.24.0
容器,如果本地没有会自动从服务器拉取。
使用docker ps
查看运行状态
当我们在浏览器中直接访问服务器(宿主机)时,访问的是宿主机本身的服务(如果有的话)。Docker容器拥有独立的网络命名空间,外网无法直接访问容器内的Nginx服务。需要通过端口映射将宿主机的端口与容器的端口进行绑定。例如,将宿主机的7070端口映射到容器Nginx的80端口后,当访问宿主机IP的7070端口时,流量会被自动转发到容器内部的80端口,从而访问到容器中的Nginx服务。
如下-p选项的使用:
-P是绑定随机端口,后面不用带任何信息,该选项很少使用,如:docker run -P -d nginx:1.24.0
--name
选项改变容器名字,使用新起的容器名与其交互会变得很方便。
-h
:改变容器主机名
-e
:添加容器的环境变量
-m
:设置容器使用内存最大值,如下给限定容器内存使用500MB
docker run -d -m 500m --name mynginx3 nginx:1.24.0
docker stats mynginx3
-rm
选项:shell 退出的时候自动删除容器,使用docker ps -a是查不到的。
如:docker run -it --name=mycentos4 -rm centos:7
docker ps
功能: 列出容器信息
语法:
docker ps [OPTIONS]
别名:docker container ls
, docker container list
, docker container ps
关键参数:
-a
:显示所有的容器,包括未运行的。-f
:根据条件过滤显示的内容。--format
:指定返回值的模板文件。如 json 或者 table-l
:显示 latest 的容器。-n
:列出最近创建的 n 个容器。--no-trunc
:不截断输出。-q
:静默模式,只显示容器编号。-s
:显示总的文件大小。
四、综合实例
1.搭建Nginx服务
查找nginx镜像版本:
方法一:shell中执行docker search nginx
如下:(不推荐)
方法二:登陆官网查找:
- 拉取镜像:
docker pull nginx:1.24.0
- 查看有没有到本地:
docker images nginx
- 看详细信息:
docker image inspect nginx:1.24.0
- 启动Nginx容器:
- 绑定宿主机7077端口
- 将容器重命名为myweb
- 将主机名命名为myweb.com
- 添加环境变量myenv=test
- 后端运行
即:
docker run -p 7077:80 --name=myweb -h myweb.com -e myenv=test -d nginx:1.24.0
假设我们要调整首页:
添加选项-it,以前台交互的形式启动
docker run -p 7078:80 --name=myweb -h myweb.com -e myenv=test -it nginx:1.24.0 bash
此时nginx并没有启动,需要再命令行输入nginx
启动nginx。
修改首页:
- 进入目录:
cd /usr/share/nginx/html/
- 修改index.html中的内容如:
效果如下:
2.Docker hub上创建私有仓库
BusyBox介绍
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。例如 ls、cat 和 echo 、grep、find、mount 以及 telnet等。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。而所有这一切功能却只有区区 1M 左右的大小。因海外带宽较小,我们拉取该镜像推送到自己的仓库。
CentOS安装:
- 创建一个目录:
mkdir -p /data/myhou
- 进入目录:
cd /data/myhou
- 下载在该目录下:
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 ls
Ubuntu安装:
apt install busybox -y
到Docker官网创建仓库:
- 拉取一个busybox:
docker pull busybox:1.35.0
- 根据推送规则给busybox设置标签:
docker tag busybox:1.35.0 saal0/qsy_box:v1.0
- 登陆docker(如果没有登陆):
docker login
- 推送到仓库:
docker push saal0/qsy_box:v1.0
除此之外还可以推送到腾讯云,阿里云等。登陆腾讯云/阿里云官网,搜索容器镜像服务,就可以搭建自己的仓库,注意推送和拉取规则。这里就不演示。