Docker container

时间:2015-12-14 10:10:47

标签: docker dockerfile

我想在正在运行的docker容器中安装docker。

docker run -it centos:centos7

我的基本容器正在使用centos,我可以使用docker exec登录正在运行的容器。但是当我尝试使用yum install -y docker在其中安装docker时,它会安装。

但不知怎的,我无法使用docker -d &启动docker服务,它给出了错误:

INFO[0000] Option DefaultNetwork: bridge 
WARN[0000] Running modprobe bridge nf_nat br_netfilter failed with message: , error: exit status 1 
FATA[0000] Error starting daemon: Error initializing network controller: Error initializing bridge driver: Setup IP forwarding failed: open /proc/sys/net/ipv4/ip_forward: read-only file system

有没有办法可以在docker容器中安装docker或者已经有运行docker的构建映像?我已经看过these个例子,但没有一个适合我。

主机上uname -r的输出:

[fedora@ ~]$ uname -r
4.2.6-200.fc22.x86_64

任何帮助都将不胜感激。

提前致谢

4 个答案:

答案 0 :(得分:11)

<强>更新

感谢https://stackoverflow.com/a/38016704/372019我希望展示另一种方法。

您应该复制或安装docker二进制文件的特定于容器的版本,而不是挂载主机的docker二进制文件。由于您仅在客户端模式下使用它,因此您无需将其作为系统服务进行安装。您仍然需要将Docker套接字安装到容器中,以便您可以轻松地与主机的Docker引擎进行通信。

假设你有一个带有工作Docker二进制文件的基本图像(例如official docker image),现在的例子如下:

docker run\ -v /var/run/docker.sock:/var/run/docker.sock\ docker:1.12 docker info

如果没有真正回答您的问题,我建议您阅读Using Docker-in-Docker for your CI or testing environment? Think twice

它解释了为什么运行docker-in-docker应该替换为Docker容器作为“外部”或“基础”容器的兄弟运行的设置。本文还链接到原始https://github.com/jpetazzo/dind项目,您可以在其中找到如何在Docker中运行Docker的工作示例 - 以防您仍然希望使用docker-in-docker。

如何启用容器来访问主机的Docker守护程序的示例如下所示:

docker run\
  -v /var/run/docker.sock:/var/run/docker.sock\
  -v /usr/bin/docker:/usr/bin/docker\
  busybox:latest /usr/bin/docker info

答案 1 :(得分:2)

如果你使用Docker工具箱在Mac上。

以下命令无效

docker run\
  -v /var/run/docker.sock:/var/run/docker.sock\
  -v /usr/bin/docker:/usr/bin/docker\
  busybox:latest /usr/bin/docker info

因为/var/run/docker.sock不在你的OSX文件系统上

Docker守护程序在boot2docker VM中运行 - 这就是unix套接字所在的位置。

所以你必须从boot2docker VM

运行容器
$ docker-machine ssh default
$ docker run\ 
         -v /var/run/docker.sock:/var/run/docker.sock\ 
         -v $(which docker):/usr/bin/docker\ 
         busybox:latest /usr/bin/docker info
$ exit

这看起来像Docker-in-Docker,感觉就像Docker-in-Docker,但它不是Docker-in-Docker,当这个容器会创建更多容器时,这些容器将在顶级Docker中创建。 / p>

答案 2 :(得分:1)

您需要--privileged参数。

  

默认情况下,Docker容器是“非特权”,而不是   例如,在Docker容器中运行Docker守护程序。

Source

使用命令docker run --privileged -it centos:centos7 bash运行基本映像。然后,您可以在该容器内安装并运行另一个docker容器。

答案 3 :(得分:0)

我的虚拟机也有类似的问题。

我已经解决了将存储文件系统从图像更改为 vfs(在 daemon.json 文件中)的问题 如下图

enter image description here

对于图像作品,首先创建一个基本图像,在我的例子中是 centos7

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

使用构建的这个镜像(在我的例子中我称为 local/c7-systemd)创建第二个镜像,安装 docker 并将 daemon.json 移动到里面。

FROM local/c7-systemd
RUN yum install -y yum-utils
RUN yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y docker-ce docker-ce-cli containerd.io
RUN curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
RUN ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
COPY daemon.json /etc/docker/daemon.json
RUN yum install -y nano
RUN systemctl enable docker

EXPOSE 80
EXPOSE 8080
EXPOSE 8161
EXPOSE 6379
EXPOSE 8761
CMD ["/usr/sbin/init"]

享受吧!