Docker in Docker(dind )构建镜像

Docker in Docker 主要解决在docker容器中构建镜像并推送到仓库中

1.拉取docker镜像

注意,推荐使用与docker版本相同的docker-client镜像

查看主机的docker版本号

1
docker info 

image-20241021150151445

Sever Version:表示docker server的版本号

1
docker pull docker:{version}
1
2
# example
docker pull docker:20.10.9

2.启动docker in docker

启动docker in docker 容器时,需要注册,要将 /var/run/docker.sock映射到容器内的/var/run/docker.sock,还需要映射一个/workspace,该目录位置随意 ,目录内的内容为f需要构建镜像的文件,例如Dockerfile等文件。

-it:表示以前台方式运行

--rm:表示以支持后删除该容器

-v:表示目录映射(挂载),格式为:主机目录:容器内目录

--privileged:表示以特权方式运行

1
2
3
4
docker run -it --rm  \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
--privileged docker:20.10.9

3.容器内构建镜像

容器内执行docker build命令构建镜像并给镜像打上tag(标签)

-t:表示给要创建的容器打上一个tag()

Registry Mirrors:表示镜像仓库地址,例如: docker.io或者私有仓库192.168.1.10:1180。私有创建如果修改了默认端口,则需要指定。默认80与443

path:表示仓库项目目录,例如:/test/did

version:表示镜像版本号

hostpath:表示要构建镜像文件的位置,必须存在Dockerfile文件

1
docker build -t ${Registry Mirrors}/${path}:${version} ${hostpath}
1
2
# example
docker build -t 192.168.1.10:1180/test/did:v0.2 .

4.登录仓库

docker推送镜像时,需要先登录仓库

url: 表示仓库地址

port: 如果修改了仓库的默认端口,则需要指定

username: 表示用户名

password:表示密码

1
docker login ${url:port} -u ${username} -p ${passwd}
1
2
# example
docker login http://192.168.1.10:1180 -u admin -p 123456

5.推送镜像

构建镜像后存储在本地仓库中,使用docker push推送到镜像仓库

1
docker push 192.168.1.10:1180/test/did:v0.2