赞
踩
镜像仓库 (Docker Registry)
负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。
镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。
整体视图如下:
hub.docker.com
。一个 Registry 中可以存在多个Repository,Repository 可分为“顶层仓库”和“用户仓库”;·用户仓库名称格式为“用户名/仓库名”
,每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像。nginx:latest
一个容器镜像包含了两个部分,一个是 元数据
,其实就是由dockerfile
构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum
这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的blob
里面,真正占有空间的就是这些 blob。
按是否对外开放划分,也是研发人员常说的
按供应商和面向群体划分
镜像仓库使用流程
• 通过 docker login
登录仓库
• docker pull
拉取需要的镜像
• 通过 dockerfile
或者 commit
等方式制作完镜像通过 docker push
上传到仓库
实际研发中镜像仓库如何使用
Docker Registry
中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境:
开发环境:
开发人员使用的一套环境测试环境:
需求开发完成后,发布到供测试人员进行测试的环境预发布环境:
版本测试完成后,发布到和生产类似的环境,提前模拟生产发布生产环境:
真正面向客户的环境镜像仓库的拉取机制
启动容器时, docker daemon 会试图从本地获取相关的镜像、本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地。
可以在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件)
Shell
{
# 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
后确保 json 的格式正确
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
添加完成后需要重新加载配置,重启 Docker:
Shell
# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
#查看 docker 状态
sudo systemctl status docker
命令清单
docker login
: 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login [OPTIONS] [SERVER]
-u
登陆的用户名-p
登陆的密码#root用户下
docker login
当然我们也可以通过指定选项来登录:
docker login -u cjl1314520
docker pull
: 从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker image pull
关键参数
○ -a
拉取所有 tagged 镜像
○ --disable-content-trust
忽略镜像的校验,默认开启
样例一
docker pull nginx:1.23.4
样例二
DIGEST
,如下:docker pull nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25
docker push
: 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]
docker image push
关键参数
-a
推送所有 tagged 镜像--disable-content-trust
忽略镜像的校验,默认开启样例
这里我们不能直接往nginx站点里推送镜像
我们需要先在站点上创建仓库:
这里我们需要穿插一条命令:
docker tag
: 给镜像取名字
docker tag nginx:1.23.4 cjl1314520/mybitnginx:v1.23.4
使用命令推送镜像到我们的仓库:
docker push cjl1314520/mybitnginx:v1.23.4
这里我们可以看到,镜像已经被推送到我们在dockerhub上创建的仓库里了。
下面我们拉取一下我们自己仓库中的镜像:
docker pull cjl1314520/mybitnginx:v1.23.4
当然我们也可以使用 docker push cjl1314520/mybitnginx -a
把所有的镜像都推送到docker hub仓库中。
docker search
: 从 Docker Hub 查找镜像
docker search [OPTIONS] TERM
关键参数
--no-trunc
显示完整的镜像描述-f <过滤条件>
列出收藏数不小于指定值的镜像样例
docker search nginx
#查找所有stars=10的nginx
docker search -f stars=10 nginx
#查看nginx完整的镜像描述
docker search --no-trunc nginx
docker logout
: 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout [SERVER]
docker logout
docker images
: 列出本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker image ls, docker image list
关键参数
-a
列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)--digests
显示镜像的摘要信息;-f
显示满足条件的镜像;--format
指定返回值的模板文件;--no-trunc
显示完整的镜像信息;-q
只显示镜像 ID。样例
docker images
#查找nginx
docker images nginx
#查找具体的nginx版本
docker images nginx:1.23.4
当然,docker命令是可以和Linux下的命令结合使用的。
docker image inspect
: 查看镜像详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]
#查看镜像详细信息
docker image inspect nginx:1.23.4
#通过ID来查看镜像的详细信息
docker image inspect IMAGE ID
docker tag
: 标记本地镜像,将其归入某一仓库
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker image tag
docker tag ac232364af84 cjl1314520/mybitnginx:vv
docker run
: 创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run
关键参数
-d
: 后台运行容器,并返回容器 ID。-i
: 以交互模式运行容器,通常与 -t 同时使用。-P
: 随机端口映射,容器内部端口随机映射到主机的端口。-p
: 指定端口映射,格式为: 主机(宿主)端口:容器端口。-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。--name="nginx-lb"
: 为容器指定一个名称。-h "mars"
: 指定容器的 hostname。-e username="ritchie"
: 设置环境变量。--cpuset-cpus="0-2"
or --cpuset-cpus="0,1,2"
: 绑定容器到指定 CPU 运行。-m
:设置容器使用内存最大值。--network="bridge"
: 指定容器的网络连接类型。--link=[]
: 添加链接到另一个容器。--rm
:shell 退出的时候自动删除容器。样例一
首先查看我们所在的操作系统的版本:
去docker hub
上找一个Ubuntu 20.04
的镜像
拉取该镜像
#不带任何参数--没有任何效果
docker run ubuntu:20.04
#带参数--可以看到,终端变成了Ubuntu操作系统
docker run -it ubuntu:20.04
-d参数
后台运行容器
docker run -d nginx:1.24.0
使用 docker ps
查看
-it参数
docker run -it ubuntu:20.04 bash
-P/-p参数
docker run -d -p 8081:80 nginx:1.24.0
docker run -d -P nginx:1.24.0
curl 127.0.0.1:32769
--name、-h、-e参数
#--name选项
docker run -d --name mynginx1 nginx:1.24.0
#-h选项
docker run -it -h myubuntu ubuntu:20.04 bash
#-e选项
docker run -it -h myubuntu -e myenv=test ubuntu:20.04 bash
--cpuset-cpus、-m选项
当我们不指定内存时,可以看一下:
docker run -d --name mynginx1 --cpuset-cpus="1" nginx:1.24.0
docker run -d --name mynginx2 -m 500m nginx:1.24.0
--link=[]、--rm选项
#在一个终端启动一个容器
docker run -it --name myubuntu1 ubuntu:20.04 bash
#另一个终端启动另一个容器
docker run -it --name myubuntu2 --link myubuntu1:mywebsite1 ubuntu:20.04 bash
docker run -it --name myubuntu1 --rm ubuntu:20.04 bash
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
:显示总的文件大小样例
docker ps
docker ps -a
docker ps -f name =mynginx1
docker ps -f name=mynginx1
docker ps --format json
docker ps -l
docker ps -n 2
docker ps -q
docker ps -s
查找并拉取nginx镜像
docker run -p 8099:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.24.0
修改nginx首页
Busybox
简介
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。 BusyBox 包含了一些简单的工具,例如 ls、 cat 和 echo 等等,还包含了一些更大、更复杂的工具,例如:grep、 find、 mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。 busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小.因海外带宽较小,我们拉取该镜像推送到自己的仓库。
宿主机CentOS上安装BusyBox
#创建目录
mkdir -p /data/mybusybox
#进入该目录
cd /data/mybusybox/
wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate
chmod +x busybox
Docker hub上创建自己的私有仓库
创建账号
进入 阿里云,点击右上角完成注册,可以使用支付宝快速注册
创建仓库
登录并推送镜像
因为仓库创建时是私有的,所以当我们退出账号时,是不能拉取镜像并推送镜像的。
我入职了一个公司,开发一个镜像,我怎么选择用哪个作为基础镜像啊?
一般大型公司有自己专门的镜像制作组织,他们会选取对应的系统版本作为基础镜
像,例如华为某部门选取欧拉来制作基础镜像,腾讯选择自己的 TLinux 制作基础镜像,
不会因为出现 CentOS 不维护了无法使用的情况,而且这些镜像一般都会经过严格的
安全扫描,然后作为基础组件提供给各个部门。一般的公司往往也会同意镜像的基础
版本,所以这个选择个人一般不用太多纠结。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。