为了便于理解,这里我将尽量使用 手动 操作,而不是Dockerfile
先启动一个 ubuntu 容器
docker run -i -t --name base ubuntu /bin/bash
在此容器中安装 docker 并且 尝试执行 docker ps 会得到如下错误
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
原因其实很简单,因为容器内部存在 docker.sock ,那实际上最简单的在容器中build image的方法,就是mount 这个sock,然后容器会和宿主机共享同一个 docker.sock
docker run -i -t --name base2 -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash
不过副作用是,因为使用了 宿主机的 sock,这里可以看到宿主机上运行的所有容器,并且实际上已经和宿主机在使用同一个docker环境了
新建一个 Dockerfile
FROM nginx
RUN echo 'hello dockerfile' > /usr/share/nginx/html/index.html
再次尝试build
error checking context: 'no permission to read from '/proc/1/mem''.
这是因为当前容器在创建的时候没有添加宿主机的 root 权限
添加 –privileged
docker run -i -t --name base3 --privileged -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash
这里有一个小插曲,如果直接在 / 路径下使用 Dockerfile的话会得到一个错误
error checking context: ‘file (‘/proc/4427/fd/5′) not found or excluded by .dockerignore’.
解决办法是不要在 / 根路径下build