Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Docker——Docker in Docker原理与实战,希望能够帮助你!!!。
本博文介绍Docker in Docker问题背景与构建方式。
Docker-in-Docker的方式主要是为了帮助核心团队更快地进行 Docker 开发。在 Docker-in-Docker 之前,典型的开发周期是:
如果你想要一个漂亮的、可重复的构建(即在容器中),那就有点复杂了:
Docker-in-Docker 并非 100% 有几个问题需要注意。
Docker run Docker的方式有三种
因为在特权模式下运行容器。Nestybox尝试通过使用sysbox Docker运行时来解决该问题。如果使用Nestybox sysbox运行时创建容器,则它可以在能够运行systemd,docker,kubernetes的容器内创建虚拟环境,而无需特权访问基础主机系统。解释sysbox需要足够的理解力,因此我不在本文的讨论范围之内。请参考此页面以全面了解sysbox。
Sysbox 是一个 OCI 运行时,可以用来代替 runc,或者作为 runc 的补充。它可以运行通常需要特权标志的“系统容器”,而无需特权标志;并在这些容器之间以及这些容器与其宿主之间提供足够的隔离。Sysbox 还提供了运行容器中容器的优化。具体来说,当并排运行多个 Docker 实例时,可以使用一组共享的镜像“播种”它们。这节省了大量磁盘空间和大量时间,我认为这在运行时会产生巨大的差异,例如容器中的 Kubernetes 节点。(在容器中运行 Kubernetes 节点对于 CI/CD 尤其有用,当您想要部署 Kubernetes 暂存应用程序或在其自己的集群中运行测试时,无需在专用机器上部署完整集群的基础架构成本和时间开销。)
步骤1:安装sysbox运行时环境。请参阅此页面以获取有关安装sysbox运行时的最新官方说明。
sysbox:https://github.com/nestybox/sysbox
第2步:一旦拥有sysbox运行时可用,您要做的就是使用sysbox运行时标志启动docker容器,如下所示。在这里,我们使用的是官方docker dind映像。
docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind
步骤3:现在将exec会话带到sysbox-dind容器。
docker exec -it sysbox-dind /bin/sh
如果您只是希望能够从 CI 系统运行 Docker(特别是:构建、运行,有时推送容器和映像),而该 CI 系统本身位于容器中?您想要的只是一个解决方案,以便您的 CI 系统(如 Jenkins)可以启动容器。最简单的方法是将 Docker 套接字公开给 CI 容器,方法是使用 -v 标志绑定挂载它。简而言之,当您启动 CI 容器(Jenkins 或其他)时,不要使用 Docker-in-Docker 来激活成功教程某些东西,而是从以下内容开始:现在这个容器将可以访问 Docker 套接字,因此能够启动容器。除了启动“子”容器之外,它将启动“兄弟”容器。你可以是使用 docker 官方镜像(包含 Docker 二进制文件):
#启动的容器
docker run -it -d -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker docker(镜像ID)
#进入容器并使用docker
sudo docker exec -it 容器(ID) /bin/bash
#使用的docker的相关指令docker pull
docker pull busybox
这看起来像 Docker-in-Docker,感觉像 Docker-in-Docker,但它不是 Docker-in-Docker:当这个容器将创建更多容器时,这些容器将在顶级 Docker 中创建。您不会遇到嵌套副作用,并且构建缓存将在多个调用之间共享。
Dockerfile内容以从容器内部测试映像构建。
# 基础镜像
FROM ubuntu:18.04
# 安装依赖
RUN apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 安装秘钥
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 添加仓库
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装docker
RUN apt-get install docker-ce docker-ce-cli containerd.io -y
编译Dockerfile
docker build -t images_name .
Docker 的启动命令
docker container run -it -v /var/run/docker.sock:/var/run/docker.sock testabc:1.0 /bin/bash
此方法实际上在容器内部创建一个子容器。仅当您确实要在容器中包含容器和镜像时才使用此方法。否则,我建议您使用第一种方法。为此,您只需要使用带有dind
标签的官方docker镜像即可。该dind映像使用Docker所需的实用程序进行制作以在Docker容器中运行。
注意:这要求您的容器以特权模式运行。
步骤1:建立dind-test以docker:dind镜像命名的容器
docker run --privileged -d --name dind-test docker:dind
步骤2:使用exec登录到容器。
docker exec -it dind-test /bin/sh
现在,您可以尝试使用Dockerfile构建映像,如先前方法所示。关键注意事项
# 基础镜像
FROM silverlogic/python3.6
# 描述
MAINTAINER python3.6+mysql5.6+redis
# 添加必要秘钥,以便添加apt库 archive.ubuntu.com
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
# 换中国源,其中archive.ubuntu.com用于安装mysql
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian/ stretch main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb http://archive.ubuntu.com/ubuntu trusty universe" >>/etc/apt/sources.list \
&& apt-get update
# 安装mysql5.6
RUN { \
echo mysql-server mysql-server/root_password password '123456'; \
echo mysql-server mysql-server/root_password_again password '123456'; \
} | debconf-set-selections \
&& apt-get install -y mysql-server-5.6 mysql-client-5.6
# 装redis
RUN apt install -y redis-server
# 启动命令
ENTRYPOINT service mysql start && redis-server # 让进程一直跑, 否则容器会exit
sudo docker build -t python3.6-mysql-redis .
# 创建+启动容器, 如果启动不了, 需要调试并修改dockerfile或启动脚本.需要外部连接的就用-p 暴露端口
sudo docker run -itd -p 3308:3306 --name py_mysql_redis py_mysql_redis
# 进入bash
sudo docker exec -it python3.6-mysql-redis bash
# 在容器里测试是否成功:
mysql -uroot -p123456
redis-cli
python
# 数据库端口暴露之后,在容器内部可以访问,但是外部还是无法连接
进到 docker 容器里面修改一下mysql账号允许从远程登录就行,
#by 后面是密码, 可自行修改。也是远程登录的密码 两条命令如下:
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
#刷新配置
flush privileges;
是否能在docker中装ubuntu,再嵌套部署启动一个docker? - 知乎
Using Docker-in-Docker for your CI or testing environment? Think twice.
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章