docker2
前言
cgroups
什么是cgroups
cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一
系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源
管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资
源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时
对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
就是一个资源控制的技术,控制能使用多少的内存
-
cgroups 可以控制的子系统
blkio
对块设备的 IO 进行限制。
cpu
限制 CPU 时间片的分配
cpuacct
生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同
一目录。
cpuset
给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节
点。
devices
限制设备文件的创建,和对设备文件的读写
freezer
暂停/恢复 cgroup 中的任务。
memory
对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用
报告。
perf_event
允许perf观测cgroup中的task
net_cls
cgroup 中的任务创建的数据报文的类别标识符,这让 Linux 流量
控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并
进行网络限制。
hugetlb
限制使用的内存页数量。
pids
限制任务的数量。
rdma
限制RDMA资源(Remote Direct Memory Access,远程直接数
据存取)
为什么使用cgroups
其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器
Docker 及k8s中的pod就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部
分的资源控制。
比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使
用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算
模块。
就是控制进程的各种各样的CPU和内存
了解就可以了
pidstat
pidstat
• 概述
pidstat 是 sysstat 的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备
IO 等系统资源的占用情况。Pidstat第一次采样显示自系统启动开始的各项统计信息,
后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间
来获得所需的统计信息。
• 语法
Shell
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
• 参数 -u:默认参数,显示各进程的CPU使用统计
-r:显示各进程的内存使用统计
-d:显示各进程的IO使用情况
-p:指定进程号,ALL表示所有进程
-C:指定命令
-l:显示进程命令名和所有参数
时间间隔就是多久进行统计一次,次数就是统计多少次
时间间隔:1,次数1000
这个的意思就是每秒进行统计,统计1000次之后停止
-C:比如mysql,这样的话我们就只会看到mysql的进程,其他进程就被过滤掉了
• 安装
Ubuntu 安装
#卸载
apt remove sysstat -y
#安装
apt install sysstat -y
默认是-u
MEM是内存占有比例
之前是cpu占有比例
usr是用户空间占有比例
system是内核空间占有比例
guest是虚拟机占有比例
这个我们看到了读写的信息
这个就是指定进程,默认是-u
这个就是看mysql的所有进程,默认是-u
-l就是显示完整的命令
这个就是时间间隔和次数
stress
就是申请内存和cpu
stress
• 概述
stress 是 Linux 的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测
试。
• 语法
stress [OPTION [ARG]]
OPTION 是参数
ARG是给OPTION 传递的参数
• 参数
-c, --cpu N:产生 N个进程,每个进程都循环调用sqrt函数产生CPU压力。—》cpu
-i, --io N:产生 N 个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘上,产
生IO压力。通过系统调用sync刷新内存缓冲区数据到磁盘中,以确保同步。如果缓
冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。在SSD磁盘环境中
尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用
率sys 升高。—》占有的是内核cpu
-m, --vm N:产生 N个进程,每个进程循环调用malloc/free函数分配和释放内存。
–vm-bytes B:指定分配内存的大小
–vm-keep:一直占用内存,区别于不断的释放和重新分配(默认是不断释放并 重新分配内存) --》内存
-d, --hdd N:产生 N个不断执行write和unlink函数的进程(创建文件,写入内容,删
除文件)
–hdd-bytes B:指定文件大小
-t, --timeout N:在 N 秒后结束程序
-q, --quiet:程序在运行的过程中不输出信息 —》写入的压力
• 安装
Ubuntu:
#卸载
apt remove stress -y
#安装
apt install stress -y
cat /etc/*release星
可以查看操作系统信息
我们再起一个shell,对cpu进行监控
pidstat -C stress -p ALL -u 2 10000
可以看出我们的cpu都满了
system慢慢就变多了
VSZ就是内存
这个就是不断地申请和释放
这个是疯狂的写入
stress -d 1 -t 3
这个是三秒后停掉
stress -d 1 -t 3 -q
就是不打印信息
就是没有打印info信息
cgroups信息查看
版本查看
cat /proc/filesystems |grep cg
表示我们这个ubuntu系统支持两个版本的cgroup系统
如果看到cgroup2,表示支持cgroup v2
子系统查看
就是看cgroup支持哪些资源的查看
cat /proc/cgroups
看的出来,cgroup能控制内存和cpu
挂载信息查看
mount |grep cgroup
查看一个进程上的cgroup限制
cat /proc/$$/cgroup
我们这个是查看当前进程shell,pid写成两个duoler
使用cgroups对内存进行控制
-
创建内存的cgroup,很简单我们进入到cgroup的内存控制目录
/sys/fs/cgroup/memory,我们创建目录test_memory -
可以看到内存限制文件已经自动在test_memory中创建完成了,cgroups 文件系
统会在创建文件目录的时候自动创建相应的配置文件 -
配置cgroup的策略为最大使用20M内存
-
启动1个消耗内存的进程,每个进程占用50M内存
-
打开一个新的shell窗口B窗口,使用pidstat查看状态,红色为进程id
-
打开一个新的shell C窗口,将进程id移动到我们的cgroup策略
-
可以看到进程无法申请到足够内存退出
以看到进程消失了
使用cgroups对cpu进行控制
.
1.创建内存的cgroup,很简单我们进入到cgroup的内存控制目录
/sys/fs/cgroup/cpu,我们创建目录 test_cpu,可以看到系统会自动为我们创建cgroup
的cpu策略
2. 打开新的shell 窗口B窗口,使用stress模拟一个任务,cpu使用率为100
3. 以看到cpu的使用率为100%
4. 打开新的shell窗口C窗口,我们设置cproup的cpu使用率为30%,cpu使用率
的计算公式cfs_quota_us/cfs_period_us
5. 我们可以看到进程的PID为62577,我们将该进程放到tasks文件进行控制
6. B窗口中可以看到我们监控的cpu的使用率由100%降低为30%
LXC容器
LXC是什么?
LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容
器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),
内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和
共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,
使得Linux用户可以容易的创建和管理系统或应用容器。
LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了
容器技术使用的一个方案
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,
其复杂程度其实并没有多大降低,因为我们必须要学会LXC的一组命令工具,且由于
内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性
也没有虚拟机那么强大。
后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版。
LXC用·namespace完成资源隔离,用cgroups完成资源控制
我们就不用用上面这两个指令创建容器了
可以直接调用API
但是LXC不可以跨平台,我们用的是docker了
LXC就是容器化技术的实现
这个了解就可以了
docker简介
是什么
Docker 本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容
器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早
期的版本其核心就是LXC的二次封装发行版。
Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。
Docker 是基于Go语言实现的一个开源项目,它的主要目标是“Build,Ship and
Run Any APP,Anywhere”,即通过对组件的封装、分发、部署、运行等生命周期的
管理,使得用户的应用及其运行环境能够做到“一次封装,到处运行”。
早期Docker利用LXC做容器管理引擎,但是在创建容器时,不再使用模板去安装生
成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,
并整体打包成一个文件,image文件),镜像文件集中放在一个仓库中。当需要创建容
器时,Docker调用LXC的工具lxc-create,但不再通过lxc的模板去安装,而是连接
到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker极大的
简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker-run,
docker-stop 就可以启动停止一个容器了。
我们这个发现打包一次不能到处运行
因为经常缺标准库和jdk那种
镜像打包就是把运行环境那些东西一次性打包好就可以用了
打包到仓库上
要运行的话
就apt下载就可以了
本质就是一次封装,到处运行
Docker 和虚拟机的区别
传统虚拟机
磁盘
占用 几个GB到几十个GB左右
Docker 容器
几十MB到几百MB左右 ----》因为是共享底层的
CPU内存占用
虚拟操作系统非常占用CPU和内存,需要通过虚拟层调用占用率高
Docker 引擎占用资源极低,直接作用于硬件资源占用少
启动速度
(从开机到运行项目)几分钟 —》启动电脑
(从开启容器到运行项目)几秒 —》启动进程
安装管理
需要专门的运维技术 —》卖电脑的
安装、管理方便—》卖软件的
应用部署
手动部署,速度慢
体系化部署,可以自动化,速度快
隔离性
系统级别
进程级别
封装程度
打包整个操作系统
打包项目代码和依赖信息–》打包更加精准
Docker 为什么比虚拟机资源利用率高,启动快
docker 有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运
行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利
用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核,而不需要
Guest OS,节省了Guest OS占用的资源。
docker 不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作
系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个
虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个
docker 容器只需要几秒钟。
Docker 和JVM虚拟化的区别?
docker发展版本
lxc–》libcontainer–》moby—》docker-ce:docker 的开源版本,docker-ee:docker 的收费版本,
Docker 官方网站
docker
点击第一个documentation
docs
mannuals
reference
技术架构
官方架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
• Docker 仓库(Registry)
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub供了庞
大的镜像集合供使用。
• Docker daemon
Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护
进程。
• Docker 客户端(Client)
Docker 客户端通过命令行或者其他工具使用Docker API 与 Docker 的守护进程通信。
• Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
• Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板。
• Docker 容器(Container)
容器是独立运行的一个或一组应用。
container:仓库
image:镜像
Registry:镜像仓库
Docker 生态
云时代需要我们针对这些诉求有一套针对的解决方案。
• 我们要处理海量的数据,如何处理呢?
购买大量的服务器,并研发对应软件
• 开发的需求需要频繁的变更上线,如何才能将修改的代码快速的分发到几百或者
几千台服务器呢?如何共享软件呢?
搞一个中心仓库,让各个服务器去下载软件包,安装,所以CentOS搞了yum仓库,
docker 设计了镜像仓库,docker hub是公共的托管仓库。
• 软件设计好以后,怎么快速安装启动,有问题回滚呢?
将 docker 需要的所有信息设计一套软件格式,把所有的依赖搞进去,并打上版本标签,
这样不会换一个服务器各种问题,所以Docker设计了镜像。
• 不同的开发环境怎么搭建呢,一会java,一会c++?
docker 设计了镜像来应对,镜像里面存放了需要运行的环境,就像我们的iPhone内
置ios,我们的华为mate 50内置鸿蒙一样,一条命令就可以完成某个环境的搭建。
docker安装
有两个版本
server版本,比如jdk—》命令行—》这个掌握
桌面版本:比如idea—》桌面
Ubuntu 安装
安装依赖
-
操作系统版本
Plain Text
Ubuntu Kinetic 22.10 --》建议这个
Ubuntu Jammy 22.04 (LTS)
Ubuntu Focal 20.04 (LTS)
Ubuntu Bionic 18.04 (LTS) -
CPU支持
ARM和X86_64 —》基本不用考虑
检查
- 确定CPU,可以看到我们的是X86_64,是支持的,如果是arm一般会显示
aarch64
cat /etc/release
这个查看的是linux版本
现在开始查CPU架构
uname -a
现在开始卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
检查是否删除了
docker version
如果还在说明我们的服务器上还有历史的新版本
卸载历史版本
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
但是我们的docker卸载完之后,不会删除数据
所以我们再去卸载数据
ll /var/lib/docker/
这个是docker默认的安装目录
里面还有数据
#删除目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
第二个是docker开源出去的组件
安装
配置docker下载源
#curl命令安装
sudo apt install curl -y
这个就是安装一个工具,这个就相当于浏览器的客户端
www.baidu.com
这个直接就把页面显示出来了
#创建gpg key目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
gpg key就相当于一个公钥,先建一个目录
#下载gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
现在开始配置docker源
cat /etc/apt/sources.list
这个是我们的系统源
ll /etc/apt/sources.list.d/
这个目录下面有docker源
安装过docker就会有一个文件docker.list
echo \ “deb [arch=$(dpkg --print-architecture) signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
cat /etc/apt/sources.list.d/docker.list
我们看一下文件内容
前面是公钥
后面是下载地址
apt update
小bug
root@hcss-ecs-6fa6:~# apt update
Hit:1 http://repo.huaweicloud.com/ubuntu jammy InRelease
Hit:2 http://repo.huaweicloud.com/ubuntu jammy-updates InRelease
Hit:3 http://repo.huaweicloud.com/ubuntu jammy-backports InRelease
Hit:4 http://repo.huaweicloud.com/ubuntu jammy-security InRelease
Ign:5 https://download.docker.com/linux/ubuntu \ InRelease
Err:6 https://download.docker.com/linux/ubuntu \ Release
404 Not Found [IP: 3.170.229.96 443]
Reading package lists… Done
E: The repository ‘https://download.docker.com/linux/ubuntu \ Release’ does not have a Release file.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
从你给出的错误信息可知,系统在尝试从 Docker 软件源获取 Release 文件时失败,出现了 404 Not Found 错误,这表明 Docker 软件源的配置可能存在问题。具体来说,错误信息里的 https://download.docker.com/linux/ubuntu \ Release 中的反斜杠 \ 是多余的,它影响了软件源地址的正确性。
解决步骤
- 编辑 Docker 软件源文件
你需要编辑 /etc/apt/sources.list.d/docker.list 文件,把多余的反斜杠 \ 去掉。可以使用以下命令打开该文件进行编辑:
bash
sudo nano /etc/apt/sources.list.d/docker.list - 修正软件源地址
在 nano 编辑器中,找到包含 Docker 软件源的行,将多余的反斜杠 \ 去掉。原本可能是类似这样的内容:
plaintext
deb [arch=amd64 signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ jammy stable
修改为:
plaintext
deb [arch=amd64 signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable
- 保存并退出编辑器
在 nano 编辑器中,按下 Ctrl + X,然后按 Y 确认保存,最后按 Enter 键退出编辑器。 - 更新软件包列表
再次运行以下命令来更新软件包列表:
bash
sudo apt update
继续
然后就是更新一下
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
现在可以安装了
root@hcss-ecs-6fa6:~# systemctl daemon-reload
root@hcss-ecs-6fa6:~# systemctl start docker
root@hcss-ecs-6fa6:~# systemctl status docker
反正就是一顿操作
最后显示了那个绿色的就是安装成功了
systemctl enable docker
这个是让docker开机自启
这样就安装完了
案例
docker version
docker info
可以看的更详细的docker信息
docker run hello-world
run可以看做main函数
hello-world就是原码
显示Hello from Docker!
表示dockeer正常安装完成
实战经验
镜像源修改
Docker 镜像源修改
对于使用 systemd 的系统(Ubuntu 16.04+、Debian 8+、CentOS 7), 如果是腾讯云
在配置文件 /etc/docker/daemon.json 中加入 —》要自己创建目录和文件
“registry-mirrors”: [
“https://docker.m.daocloud.io”,
“https://dockerhub.timeweb.cloud”,
“https://huecker.io”
],
如果是阿里云,因为只对企业开放海外代理,只能找私人的一些开放的源,目前可以
使用的源如下—》可以去网上搜docker 国内镜像源
systemctl daemon-reload
修改完之后还要加载
systemctl restart docker
然后就是重启服务
docker info
这样就有国内的镜像了
Java
{
]
“registry-mirrors”: [
“https://docker.m.daocloud.io”,
“https://dockerhub.timeweb.cloud”,
“https://huecker.io”
}
重新启动 dockerd:
sudo systemctl daemon-reload
sudo systemctl restart docker
docker目录修改
Docker目录修改
Docker 默认的安装目录为/var/lib/docker,这里面会存放很多很多镜像,所以我们在安
装的时候需要考虑这个目录的空间,有三种解决方案。
(1)将/var/lib/docker挂载到一个大的磁盘,这种一般我们能控制挂载目录,像腾讯
云这种云厂商在安装K8s的节点的时候提供了挂载选项,可以直接挂载这个目录过去
(2)安装之前挂载一个大的磁盘,然后创建一个软链接到/var/lib/docker,这样就自
动安装到我们空间比较大的磁盘了
(3)安装了docker,然后发现忘了配置这个目录,我们需要修改docker的配置文件
#假定我们磁盘的大的目录为 /data
mkdir -p /data/var/lib/docker
#编辑配置文件
vi /etc/docker/daemon.json
#输入下面的json
{
“data-root”: “/data/var/lib/docker”
}
#加载配置
sudo systemctl daemon-reload
#重启docker
sudo systemctl restart docker
#查看docker状态
sudo systemctl status docker
配置文件信息/etc/docker/daemon.json
docker info
可以看出docker root确实变了
ll /data/var/lib/docker
然后看一下
里面的东西都变多了
这样就可以防止目录被占满了
GUI 版本安装(以windows 11为例)
首先cpu这里虚拟化要启动
然后就自己去安装吧
这个不重要
Docker Registry(镜像仓库)
什么是Docker Registry
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,
建立了仓库的索引。
镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一
个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。
镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS或IP地址来确
定一个镜像仓库如 hub.docker.com;一个 Registry中可以存在多个
Repository·Repository 可分为“顶层仓库”和“用户仓库”;·用户仓库名称格式为“用户名/仓
库名”·每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
• Repository: ·由某特定的docker镜像的所有迭代版本组成的镜像仓库
• 镜像名称(name)+标签(tag):如nginx:latest
• 认证能力:提供用户注册,登录、登出能力
• 索引:提供镜像的索引信息,方便检索
一个容器镜像包含了两个部分,一个是元数据,其实就是由dockerfile构建出来的描
述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的
checksum这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,
就是在一个一个的blob里面,真正占有空间的就是这些blob。
docker镜像仓库
整个网站就是Registry
这个一进去就很很多类别的镜像小仓库—》Repository
一进去还要认证登录
比如ubuntu,centos,nginx
比如这个就是小仓库
这个就是源数据
就是blog占的空间,就是在网站占的空间
镜像仓库分类
镜像仓库分类
按是否对外开放划分,也是研发人员常说的
(1)公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,
供大家访问使用
(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。
按供应商和面向群体划分
(1)sponsor(赞助) registry:第三方的registry,供客户和docker社区版使用
(2)mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才
能使用
(3)vendor(供应商) registry:由发布 docker镜像的供应商提供的registry,例如像
Google 和Redhat提供了镜像仓库服务
(4)private registry:通过没有防火墙和额外的安全层的私有实体提供的registry,仅供
内部使用
镜像仓库工作机制
镜像仓库使用流程
• 通过docker login登录仓库
• Docker pull 拉取需要的镜像
• 通过dockerfile或者commit等方式制作完镜像通过docker push上传到仓库
2.
实际研发中镜像仓库如何使用
Docker Registry 中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上
保存,供其他人员使用,例如“部署”到生产环境;
名词解释
开发环境:开发人员使用的一套环境
测试环境:需求开发完成后,发布到供测试人员进行测试的环境
预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布
生产环境:真正面向客户的环境
3.
镜像仓库的拉取机制
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将
从Registry 中下载该镜像并保存到本地;
名词解释
开发环境:开发人员使用的一套环境
测试环境:需求开发完成后,发布到供测试人员进行测试的环境
预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布
生产环境:真正面向客户的环境
3.
镜像仓库的拉取机制
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将
从Registry 中下载该镜像并保存到本地;
常用的镜像仓库
DockerHub
• Docker Hub是什么 —》全球最大的镜像仓库
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。
具有以下功能:
(1)个人可以注册私有仓库,能够发布自己的镜像
(2)提供镜像检索能力
(3)提供海量官方和认证组织的镜像
(4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
(5)支持webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服
务器会自动将相关的有效负载发送到客户端的 webhook URL。 )
来我们来拉取一下nginx的镜像—.那个复制的按钮,就是拉取镜像的语句
docker pull nginx:1.19.0-alpine
alpine可以理解为鸿蒙三
nginx可以理解为微信
国内镜像源
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多
比特就业课
云服务商都提供了国内镜像加速器服务,例如:
阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址)
网易云加速器地址https://hub-mirror.c.163.com
百度云加速器地址"https://mirror.baidubce.com"
可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
我们原来已经写过了
3.
私有仓库
私有镜像仓库则是指部署在公司或组织内部,用于自身应用Docker镜像存储、分发的
镜像仓库。在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应
用的打包镜像一般情况下只会被存储在私有镜像仓库中,CI/CD流程的衔接点也是通
过向私有镜像仓库上传镜像和拉取镜像的操作来完成的。
常见的私有仓库工具:
• Harbor:Harbor是VMware公司最近开源的企业级Docker Registry项目, 其目标
是帮助用户迅速搭建一个企业级的Docker registry服务。它以Docker公司开源的
registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),
AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支
持中文。Harbor的每个组件都是以Docker容器的形式构建的,使用Docker
Compose来对它进行部署。
• Nexus:Nexus 是Sonatype 公司发布的一款仓库(Repository)管理软件,目前常
被用来作为Maven私服、Docker私服。
• Docker registry:由 docker官方提供的私服,类似于docker hub。用于保存公司内
部上传的Docker镜像。
镜像仓库命令
镜像仓库命令
- 命令清单
docker login
登录仓库
docker pull
docker image pull
拉取镜像
docker push
docker image push
推送镜像
docker search
查找镜像
docker logout
登出仓库
现在开始学习一下
docker login --help
这个参数使用都可以打印出来了
要么就去官网学习
在reference这里就可以查找了
这些命令都是属于docker的,与操作系统没有关系
在哪里跑都是一样的
docker login
- docker login
• 功能
登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker
Hub,因 docker 网站被封,该命令可以用阿里云或者腾讯云的练习,参考后面实战部分。
• 语法
docker login [OPTIONS] [SERVER]
• 关键参数
○ -u :登陆的用户名
○ -p :登陆的密码
• 样例
docker login -u 用户名 -p 密码
OPTIONS就是参数
SERVER就是最后的地址
登之后点docker info就会有一个registry,就是显示的登录地址
docker pull
• 功能
从镜像仓库中拉取或者更新指定镜像
• 语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
• 别名
Shell
docker image pull
• 关键参数
○ -a :拉取所有 tagged 镜像
○ --disable-content-trust :忽略镜像的校验,默认开启
• 样例
docker pull nginx:1.23.4
NAME是镜像仓库的名字
[:TAG是标签
@DIGEST是id,两者选一个就可以了
这个是从海外下载的
下载很慢
我们这个是用tag下载
我们还可以用id下载
我们一般用tag拉取
docker push
功能
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库 ,,要先登录
• 语法
docker push [OPTIONS] NAME[:TAG]
• 别名
docker image push
• 关键参数
○ -a :推送所有 tagged 镜像
○ --disable-content-trust :忽略镜像的校验,默认开启
• 样例
docker push myapache:v1
拒绝了是因为我们没有权限像nginx这个组织塞我们自己的镜像
我们登录doccker hub里面有一个创建仓库的按钮
push的话要这样push
这个是起名字,就是改个名字
当然任何人都可以拉取了
因为是公开的
这个-a就是pull所有了
docker search
功能
从Docker Hub查找镜像,因docker 网站被封,该命令暂时国内无法实操,需要
国外网络联系。
• 语法
Shell
docker search [OPTIONS] TERM
• 关键参数
○ --no-trunc :显示完整的镜像描述;
○ -f <过滤条件>:列出收藏数不小于指定值的镜像。
• 样例
#从 Docker Hub 查找所有镜像名包含 nginx,并且star数大于 10 的镜像
docker search -f stars=10 nginx
这样就是查找所有的nginx了
这个就是指定条件查询了
一般都在docker hub找对应的镜像
docker logout
功能
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker
Hub,因 docker 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后面
实战部分。
• 语法
Shell
docker logout [SERVER]
• 样例
Shell
docker logout
这样就可以登出了
这样就无法push了
镜像命令[部分]
docker images
功能
列出本地镜像。
• 语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
• 别名
docker image ls, docker image list
• 关键参数
○ -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
○ --digests :显示镜像的摘要信息; —》就是id
就是这个东西
○ -f :显示满足条件的镜像;
○ --format :指定返回值的模板文件; --》json还是表格
○ --no-trunc :显示完整的镜像信息;
○ -q :只显示镜像ID。
• 样例
#列出本地全部镜像
docker images
#列出本地镜像中REPOSITORY为ubuntu的镜像列表。
docker images ubuntu
[REPOSITORY[:TAG]] 是仓库名称
分别是名称,TAG,id,创造时间,占用磁盘大小
这个是精准的过滤
因为没有中间层,所以显示的还是一样的
多显示了id,我们这里没有id
docker images nginx -f before=nginx:1.23.4
这样写的意思就是·找比nginx:1.23.4早创建的nginx
这些就是过滤条件
docker images nginx --format json
这个就是以json的格式返回
docker images nginx --format table
这个就是表格的形式
这个就是让id不要截断
docker image list -q
这个就是只显示id
这个也可以与grep混合使用
docker image inspect
功能
查看镜像详细信息
• 语法
docker image inspect [OPTIONS] IMAGE [IMAGE…]
• 样例
#查看镜像详细信息
docker image inspect nginx:1.23.4
我们还可以通过id来查看
都是一样的
docker tag
功能
标记本地镜像,将其归入某一仓库。
• 语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
• 别名
docker image tag
• 样例
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04
就是重命名的操作
改名的话,可以把docker hub的地址加上去
ocker tag a7be6198544f maxhou/mybitnginx:v1.23.4
这样的话,就多了一个镜像了
改名的目的,是为了把它推送到镜像仓库去
综合实战一:搭建一个nginx服务
基础知识
Web服务器,一般是指“网站服务器”,是指驻留于互联网上某种类型计算机的程序。
Web服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界
浏览,更可以放置数据文件,让全世界下载。
Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万
维网或环球信息网 ),主要功能是“提供网上信息浏览服务”。 WWW 是Internet(互联
网)的多媒体信息查询工具,是Internet(互联网)上发展起来的服务,也是发展最快
和目前使用最广泛的服务。正是因为有了WWW工具,才使得近十几年来互联网迅速
繁荣发展,用户数量飞速飙升。据最新数据显示,目前全球人口数量达到 76.76 亿人,
其中全球“网民”(互联网用户)达到惊人的43.88亿。
例如百度就是一个web服务器,提供搜索服务
Nginx
Nginx 是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是
一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站
的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
可以理解Nginx是web服务器的一种实现。
正向代理
由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就
是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客
户端是知道目标的,而目标是不知道客户端是通过VPN访问的。—》加速能力,隐藏自己的能力
反向代理
当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的
反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。—》负载均衡
安装nginx
ubuntu 安装nginx
apt install nginx -y
先检查有没有nginx,并删除
ps -ef | grep nginx,用进程查看
说明我们没有下载
删除的话
要先kill 进程
dpkg -l nginx----->看是不是用apt源来安装的
apt remove nginx就可以删除了—》但是不会删除配置
apt --purge autoremove nginx —>干净的清除
开始安装
apt install nginx -y
ps -ef |grep nginx 看进程来看是否成功了
说明起来了
如果没有起来的话
systemctl start nginx
stop nginx就是停止
kill 进程就可以停掉了—》杀root
或者直接输入nginx也可以启动
我们再来看一下它的默认的配置
cd /etc/nginx/
ll
cat nginx.conf
我们看一下这里面有什么东西
看一下这个文件里面有什么
我们看到了80端口,我们还要修改一下root
这样就修改好了默认目录,也可以不改,都是一样的对于我的nginx来说
nginx -s reload
改了配置以后还要重新加载
我们进入这个nginx的默认页面去看一下
我们改掉这个html的内容
那么nginx对应的首页网站也会变了
容器命令[部分]
docker run
功能
创建一个新的容器并运行一个命令
• 语法
Shell
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
IMAGE 是镜像的名称或者id
COMMAND就是让我们的容器去跑哪一个命令
ARG…就是这个命令的参数
• 别名
docker container run
• 关键参数
○ -d: 后台运行容器,并返回容器ID; main就是直接在前台运行,线程就是后台,后台运行关闭shell不会影响到
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
-i就是不显示这个
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name=“nginx-lb”: 为容器指定一个名称;
○ -h “mars”: 指定容器的hostname; —》就是宿主机名称,默认给一个随机的hostname,我们可以取一个我们喜欢叫的hostname
○ -e username=“ritchie”: 设置环境变量;
○ --cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU运行;
○ -m :设置容器使用内存最大值;
○ --network=“bridge”: 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell退出的时候自动删除容器
• 样例
Shell
#使用docker 镜像nginx:latest 以后台模式启动一个容器,并将容器命名为
mynginx。
docker run --name mynginx -d nginx:latest
#使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主
比特就业课
机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
—》这样理解,镜像理解为一个类,容器就相当于一个一个对象,
标题
我们想在ubuntu虚拟机宿主机上创建一个centos7的容器
我们先用docker把centos拉下来
docker pull centos:7
然后就是docker run centos:7
我们发现这个直接就退出了
因为centos:7是默认的bin/bash—》没有长时间交互的话,直接就退出了
docker ps看的是运行的容器
可以看出什么都没有
docker ps -a
就是看所有的容器
状态是已退出
bin/bash—》相当于main函数,运行完就退出了
docker run -it ceentos:7 bash
执行完这个命令之后
我们发现我们的hostname都变了
cat /etc/release
这个时候我们查看的就是我们这个容器的信息了
就是centos了
再次执行docker ps的话就可以看到运行的centos的容器了
输入exit就可以退出这个容器了
-it相当于就是进入这个容器了吧,就是自己去run了,不然默认不带参数的run是无法长时间的
-d
要后台运行,又要长时间运行
我们用nginx让它长时间运行
我们直接docker run nginx:1.24.0
这个如果本地没有这个镜像的话,就会去拉取
这样就运行成功了,不像centos,只运行一下,这个就是长时间运行的
这个就是前台运行的
输入docker ps也是可以查到的—》另外打开一个shell,因为这个shell正在运行这个nginx容器
nginx容器中ctrl +c,就可以退出了—》意思就是nginx容器不在运行中了
docker -ps也查不到了
前台运行的话,ctrl+c或者网络断了,就无法运行了
docker run -d nginx:1.24.0
这个会返回一个id
这个就是后台运行
这个又和前台运行不一样了,这个运行的话,我们是看不到它在运行的那个场景的
再去docker ps也是可以查到的
而且我们再次输入ctrl+c也无法终止这个容器
status就是显示的运行了多少秒
-i与-t
-i:交互模式运行容器
-t分配一个伪终端
-it,就是给它一个终端,而且可以进行交互
docker run -it centos:7 bash
bash就是表明我们要用shell来进行交互
这样就出现了一个终端
外面是root宿主机
里面是root容器的hostname
表明我们现在的这个shell已经在容器里面了,可以正常的进行我们以前在shell进行的命令
ps -ef查看所有的进程
cat /etc/release 可以查看操作系统信息
在另一个shell中docker ps就可以查看这个容器是不是在运行了
输入exit就是退出
直接docker run -i centos:7 bash
的话
就没有root,就是不能输入命令操作了
就是没有出现终端
但是这个容器是运行了的,是可以交互的,还是可以正常命令的
但就是没有显示出来终端
看的出来是可以交互的
docker run -t centos:7 bash也是可以运行容器的
docker ps也是可以显示的
这个就是只显示终端
但是没有交互
不能执行命令
甚至输入exit也不能执行
这个就不能终止了
就不能退出了
后面的命令还可以退出的
这就是一个伪终端
-P与-p
端口映射的参数
-P映射随机端口
-p是固定的
我们来把宿主机的80端口指定到容器的80端口
我们要起作用的话,就用nginx
docker run -d -p 80:80 nginx:1.24.0
-d是后台运行
-p是指定端口
第一个80是宿主机的80端口—>就是我们原来Ubuntu安装的nginx服务,相当于tomcat,但是会有错的
第二个80是容器的80端口
一运行就报错了,说80端口已经被占用了
容器是隔离的,肯定没有被占用
那就是宿主机上的80端口被占用了
因为宿主机上已经启动了一个80端口了
netstat -nltp | grep 80
netstat -nltp这个就是显示所有的TCP端口并显示进程id
所以要调整端口
不能使用80端口了
docker run -d -p 8081:80 nginx:1.24.0
这样就完成了容器的创建
docker ps也可以查到
这里有两个是因为,我们原来也创建了一个容器,容器之间也是隔离的
这样我们输入8081端口就可以访问到容器里面的nginx服务的80端口了
-p我们就可以打通网络了,外部就可以访问容器里面的端口了
docker run -d -P nginx:1.24.0
这个就是随机的
我们可以看出,默认给了一个32772的端口,因为nginx的默认端口是80,所以右边是80
这个端口是随机的
要在浏览器访问的话
就要开这个端口的防火墙
但是我们在我们宿主机上访问,就不用了
直接用curl命令
这个命令就是相当于浏览器上的访问网址的功能
curl 127.0.0.1:32772
这样就可以访问里面的nginx了