在docker容器中正常启动docker服务
背景
在容器中,运行docker,是devops中无法避免的场景,通常被应用于,容器被作为执行机使用,且要运行容器类任务时,网上的方案通常为三类。参考:
How To Run Docker in Docker Container 3 Easy Methods,但如果我不想使用dind镜像去构建,不想用宿主机的docker.sock,不想使用sysbox,就想用我的自己提供的基础镜像去构建出来自带docker的镜像,这些方法就不行了,当然你也可以使用DOCKERHOST
去连接到正常使用docker服务机器,去执行docker命令,但这种方式显然比较麻烦。所以最好的方法就是在容器中去安装docker服务,我以alpine为基础镜像,构建出可以运行docker服务的镜像。
dockerfile代码
FROM alpine:latest
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache curl \
&& apk add --no-cache iptables \
&& curl -O https://download.docker.com/linux/static/stable/x86_64/docker-20.10.21.tgz \
&& tar zxvf docker-20.10.21.tgz \
&& cp docker/* /usr/bin/ \
&& docker -v\
&& rm -rf /var/cache/apk/*
上面的docker安装步骤,是参考docker官网提供docker安装流程
构建及运行容器
构建
docker build -t dind-test:v1 -f dind.Dockerfile .
运行容器
docker run -it --privileged --name dind-1 dind-test:v1
运行dockerd
dockerd &
可以看到docker daemon已经启动起来了
测试
docker pull hello-world
可以看到docker可以在容器中正常运行了。