一种实现docker容器嵌套的方法
·
【背景】
有个用户需要在docker容器中再运行一个容器,实现容器嵌套, 研究了下,可以这样来实现。
【方法】
1. 在系统上先安装一个docker服务,我的版本是20.10.17
[root@testkvm ~]# rpm -qa |grep docker
docker-ce-20.10.17-3.el7.x86_64
docker-ce-cli-20.10.17-3.el7.x86_64
docker-scan-plugin-0.17.0-3.el7.x86_64
docker-ce-rootless-extras-20.10.17-3.el7.x86_64
[root@testkvm ~]#
[root@testkvm ~]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@testkvm ~]#
[root@testkvm ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2024-11-14 04:57:42 CST; 2 days ago
Docs: https://docs.docker.com
Main PID: 954298 (dockerd)
Tasks: 58
Memory: 496.1M
CGroup: /system.slice/docker.service
└─954298 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.624954732+08:00" level=info msg="ccResolverWrapper: sending update to cc>
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.624970183+08:00" level=info msg="ClientConn switching balancer to \"pick>
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.641600382+08:00" level=info msg="[graphdriver] using prior storage drive>
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.646382394+08:00" level=info msg="Loading containers: start."
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.779878052+08:00" level=info msg="Default bridge (docker0) is assigned wi>
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.815611267+08:00" level=info msg="Loading containers: done."
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.828962289+08:00" level=info msg="Docker daemon" commit=a89b842 graphdriv>
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.829029829+08:00" level=info msg="Daemon has completed initialization"
11月 14 04:57:42 testkvm systemd[1]: Started Docker Application Container Engine.
11月 14 04:57:42 testkvm dockerd[954298]: time="2024-11-14T04:57:42.846595821+08:00" level=info msg="API listen on /run/docker.sock"
[root@testkvm ~]#
2. 上传centos-x86镜像
#导入centos-x86镜像
docker load -i centos-x86.tar.gz

3. 给centos镜像添加/sbin/init参数,方便容器内使用systemd
新建一个Dockerfile文件,添加entrypoint: /sbin/init参数
#创建/opt/Dockerfile目录
mkdir -p /opt/Dockerfile
cd /opt/Dockerfile
#新建Dockerfile文件,内容有以下2行代码
vim Dockerfile
FROM centos:latest
ENTRYPOINT ["/sbin/init"]

构建新的centos镜像,名称为centos:sbin-init
#构建centos:sbin-init镜像
docker build -t centos:sbin-init .

4. 通过新的镜像创建容器ttdocker, 并将docker安装包与nginx.tar镜像拷贝到容器里安装
#运行ttdocker容器
docker run -itd --name ttdocker --privileged centos:sbin-init bash
#拷贝/docker文件到容器内(包含docker安装包、nginx镜像)
docker cp docker/ ttdocker:/root/
#切入容器
docker exec -it -u 0 ttdocker bash

5.在容器内启动docker.serivce服务,并导入nginx镜像,启动nginx容器
#启动docker.serivce服务
systemctl start docker.serivce
#导入nginx镜像
docker load -i nginx1.tar
#运行nginx容器
docker run -itd --name testnginx nginx:stable-perl
docker ps -a
6. 检查nginx容器运行正常

【总结】
使用嵌套docker,关键是要解决容器内启动docker服务问题,通过给容器添加entrypoint: /sbin/init参数方法,可允许容器使用systemd来管理docker.service,但因容器获取特权模式后能够访问宿主机资源,有一定安全风险,需慎用。
更多推荐
所有评论(0)