docker的小细节

本质上docker是一层一层进行分层处理的,层与层之间都是dockfile的命令
镜像层只读层,容器层可读写
以前的docker 默认是100MB 现在默认是10G,最大可用达到100G-一个容器可容纳的大小
改这个的方法
1、启动的时候
docker 启动时候 加载参数 --storage-opt dm.basesize=100G
2、进入docker的配置文件 /etc/docker/deamon.json

image-20240704161324241.png

产线中的问题

在docker 1,13版本,1.13是一个分水岭,注意配置文件里面的东西。
不同版本的实际操作存在些许差异的
/etc/docker/deamon.json 是data-root
而老版本是graph

image-20240704162412160.png image-20240704162710656.png

默认目录是/var/lib
但是要是目录的大小不够了,我们需要去迁移,怎么迁移呢?
1、和客户商量,能不能停,确定能停,和开发讲清楚情况,怎么停,什么顺序,怎么要求,停下来
2、把/var/lib/docker 引入到一个大的空间下面去,比如/data92
3、把deamon.json下面的配置 graph 或者 data-root 改成新的目录

想达到持久化改动,就可以通过docker commit

1、阿里云镜像仓库

image-20240704154556337.png

$ docker login --username=jichaoitn1 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/gerencangku/jichaopersoncangku:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/gerencangku/jichaopersoncangku:[镜像版本号]
这样我们就可以把镜像上传到我们个人的阿里云仓库中
从docker history 和阿里云镜像仓库都可以看到,其实我们的上传都是通过一层一层来实现的
每一层似曾相识的地方就是像dockerfile
这些命令和dockerfile十分类似

image-20240704154753327.png

2、本地docker-registory

部署本地的registry
docker pull registry
docker run -d -p 5000:5000 --restart=always --name registry registry:latest

image-20240704170252330.png image-20240704165737178.png

上传一个镜像
docker tag http:latest localhost:5000/nginx:test
docker push localhost:5000/nginx:test

image-20240704170609141.png

验证一下
curl localhost:5000/v2/_catalog

image-20240704170749725.png

一些需要注意的小细节-补充

docker  属于是调用全局的
ctr -n ctr是有命名空间的 images pull docker.io/library/ubuntu:latest
ctr可以改为cri-ctl\nerdctl 他们三个都是调用的/var/run/containerd 都可以去启动容器
如果底层走cri-o 调镜像就是podman,不是docker 也不是containerd  命令 podman image ls
我们发现这个版本号看不到,我们去哪里看?
/var/lib/docker/volumes/镜像id/_data/docker/registry

image-20240704172924363.png

/var/lib/docker/volumes/db136c8930a992ff46792f2a0f801ab3e45c5f9a835e4ec4c3e8f264cdb8c564/_data/docker/registry/v2/repositories/nginx/_manifests/tags
这个可以看到具体的版本

为本地私有仓库设置证书

# 生成openssL证书
cd
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/jichao.test.key -addext "subjectAltName = DNS:reg.jichao.test" -x509 -days 365 -out certs/jichao.test.crt

image-20240704174124670.png

删除容器
docker stop
docker rm

image-20240704174628816.png

mkdir -p /opt/registry
docker run -d --restart=always --name registry -v /root/certs:/certs -v /opt/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jichao.test.crt -e REGISTRY_HTTP_TLS_KEY=/certs/jichao.test.key -p 443:443 registry

# 解释
docker run -d 
--restart=always --name registry  重启策略 容器名字
-v /root/certs:/certs -v /opt/registry:/var/lib/registry   挂载目录
-e REGISTRY_HTTP_ADDR=0.0.0.0:443    允许的端口
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jichao.test.crt  证书名称以及域名
-e REGISTRY_HTTP_TLS_KEY=/certs/jichao.test.key  证书名称以及域名
-p 443:443 registry 开放端口 

# 没有dns服务器 写入hosts文件
# 在daemon.json中也要添加

image-20240704175736308.png image-20240704203547537.png

#上图的代理也要删除掉
docker tag http:latest reg.jichao.test/http:test
docker push reg.jichao.test/http:test

image-20240704180806664.png

mkdir -p /etc/docker/certs.d/reg.jichao.test
cd certs/
cp jichao.test.crt /etc/docker/certs.d/reg.jichao.test/ca.crt
#就可以成功推送了
docker push reg.jichao.test/busybox:test

推送上去的镜像在 /opt/registry/docker/registry/v2/repositories/下 image-20240704204746687.png image-20240704205409048.png image-20240704205438761.png

创建本地私有仓库用户

docker rm -f regisrtry
mkdir auth 
yum install -y httpd-tools
yum install -y httpd
htpasswd -cB auth/htpasswd admin -admin admin
htpasswd -B auth/htpasswd doubao

image-20240704205759179.png

docker run -d \
--restart=always \
--name registry   \
-v /root/certs:/certs \
-v /opt/registry:/var/lib/registry  \
-v /root/auth:/auth  \
-e "REGISTRY_AUTH=htpasswd"   \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"  \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  \
-v /opt/registry:/var/lib/registry  \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jichao.test.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/jichao.test.key \
-p 443:443 \
registry

docker run -d  --restart=always --name registry -v /root/certs:/certs -v /opt/registry:/var/lib/registry -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /opt/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/jichao.test.crt  -e REGISTRY_HTTP_TLS_KEY=/certs/jichao.test.key  -p 443:443 registry

image-20240704210554270.png

curl -k https://reg.jichao.test/v2/_catalog -u admin:admin
curl -k https://reg.jichao.test/v2/_catalog -u doubao:doubao

这块要注意,我们要把/etc/docker/daemon.json下面的代理删除,如果不删除的话它就会报这个错误 image-20240705164238241.png image-20240705164303280.png

如果出现了上面的问题,首先把这块的代理删除掉,然后去docker logout https://reg.jichao.test 登出操作
接着 service docker restart 重启一下docker的服务,我们就可以正常访问到docker registry的仓库内容了

image-20240705172727719.png

跨主机通信

主机 192.168.0.12
跨节点访问11的registry的仓库

image-20240705173636440.png image-20240705173756978.png

cd /etc/docker/certs.d/reg.jichao.test
scp /etc/docker/certs.d/reg.jichao.test/ca.crt root@192.168.0.12:/etc/docker/certs.d/reg.jichao.test/

scp /etc/docker/daemon.json root@192.168.0.12:/etc/docker/daemon.json

image-20240705174043957.png image-20240705174052214.png image-20240705174503209.png 推送拉取测试 image-20240705174752273.png image-20240705175226792.png

拉取惊险成功 image-20240705175738589.png 在推送一个试试 image-20240705175532183.png