温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何构建docker基础镜像

发布时间:2021-08-21 10:14:40 来源:亿速云 阅读:214 作者:小新 栏目:服务器

这篇文章给大家分享的是有关如何构建docker基础镜像的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

容器 VS 虚拟机

如何构建docker基础镜像

如何构建docker基础镜像

容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

对于docker做了简单的了解之后,就需要实际去体验一下安装和构建容器,本例使用centos6.5:

1.安装docker相关软件

[root@bogon ubuntu-16.04]# rpm -ivh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm Retrieving http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm warning: /var/tmp/rpm-tmp.KYucBm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY Preparing...    ########################################### [100%]  1:epel-release   ########################################### [100%] [root@bogon ubuntu-16.04]# yum -y install docker-io Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile ... Complete! [root@bogon ubuntu-16.04]# service docker start Starting cgconfig service:         [ OK ] Starting docker:          [ OK ] [root@bogon ubuntu-16.04]# chkconfig docker on [root@bogon ubuntu-16.04]#

使用service docker status查看docker服务状态的时候,发现没有启动docker dead but pid file exists,执行docker相关命令(如docker ps)的时候会出现Cannot connect to the Docker daemon. Is 'docker -d' running on this host?,需要解决这个问题,如下:

[root@bogon ubuntu-16.04]# service docker status docker dead but pid file exists [root@bogon ubuntu-16.04]#yum-config-manager --enable public_ol6_latest Loaded plugins: fastestmirror, refresh-packagekit [root@bogon ubuntu-16.04]# yum install -y device-mapper-event-libs Loaded plugins: fastestmirror, refresh-packagekit, security ...

2.构建基础镜像

在使用docker的时候后,可以通过命令docker pull <镜像名称>从镜像库中获取,但是有时候会出现网络问题或是其他原因,导致无法拉取,在docker中国官网介绍使用通过 Docker 官方镜像加速来解决无法拉取:

您可以使用以下命令直接从该镜像加速地址进行拉取:

$ docker pull registry.docker-cn.com/myname/myrepo:mytag

例如:

$ docker pull registry.docker-cn.com/library/ubuntu:16.04

原文如下:点击这里

而在本文中,我使用Dockerfile来构建基础镜像ubuntu 16.04(xenial),其对应的Dockerfile的Github地址为:点击这里,搜索方式为在hub.docker.com中搜索ubuntu,即可看见对应的镜像信息。Dockerfile内容如下:

FROM scratch ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / # a few minor docker-specific tweaks # see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap RUN set -xe \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48	&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \	&& echo 'exit 101' >> /usr/sbin/policy-rc.d \	&& chmod +x /usr/sbin/policy-rc.d \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56	&& dpkg-divert --local --rename --add /sbin/initctl \	&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \	&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78	&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105	&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \	&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \	&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115	&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130	&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \	\ # https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151	&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests # delete all the apt list files since they're big and get stale quickly RUN rm -rf /var/lib/apt/lists/* # this forces "apt-get update" in dependent images, which is also good # enable the universe RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list # make systemd-detect-virt return "docker" # See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434 RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container # overwrite this with 'CMD []' in a dependent Dockerfile CMD ["/bin/bash"]

现在对Dockerfile中的相关命令解释一下:

  1. FROM 指的是依赖的基础镜像,如scratch表示的是空白的,从零开始的。依赖的镜像可以是本地的,也可以是远程库的

  2. ADD 指的是添加本地文件到镜像中,如果遇到linux可解压格式文件,会自动解压,这就是为什么整个文件中没有对tar.gz进行显式解压

  3. RUN 运行命令,如安装软件的相关命令

  4. CMD 设置启动Container时默认执行的命令,这个可以在启动容器时覆盖

目前,这个Dockerfile中涉及的命令就这几个,其他等以后遇到再进行说明。解释完毕,开始构建:

[root@bogon ubuntu-16.04]# docker ps CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES [root@bogon ubuntu-16.04]# docker images REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE [root@bogon ubuntu-16.04]# pwd /home/ml/ubuntu-16.04 [root@bogon ubuntu-16.04]# ll -h total 40M -rw-rw-r--. 1 ml ml 2.8K Dec 19 12:37 Dockerfile -rw-rw-r--. 1 ml ml 40M Dec 19 12:39 ubuntu-xenial-core-cloudimg-amd64-root.tar.gz [root@bogon ubuntu-16.04]#  [root@bogon ubuntu-16.04]# docker build -t ubuntu:16.04 . Sending build context to Docker daemon 41.94 MB Sending build context to Docker daemon  Step 0 : FROM scratch  --->  Step 1 : ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /  ---> 537c2f6dd023 Removing intermediate container dee7679a7ee2 Step 2 : RUN set -xe && echo '#!/bin/sh' > /usr/sbin/policy-rc.d && \ echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && \ dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl  && sed -i 's/^exit.*/exit 0/' /sbin/initctl && \  ...---> Running in 41d719b68981 + echo #!/bin/sh + echo exit 101 + chmod +x /usr/sbin/policy-rc.d + dpkg-divert --local --rename --add /sbin/initctl Adding 'local diversion of /sbin/initctl to /sbin/initctl.distrib' + cp -a /usr/sbin/policy-rc.d /sbin/initctl + sed -i s/^exit.*/exit 0/ /sbin/initctl + echo force-unsafe-io + echo DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; }; + echo APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; }; + echo Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache ""; + echo Acquire::Languages "none"; + echo Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz"; + echo Apt::AutoRemove::SuggestsImportant "false";  ---> c49bdbf61888 Removing intermediate container 41d719b68981 Step 3 : RUN rm -rf /var/lib/apt/lists/*  ---> Running in 6389964016a2  ---> 4508181f7442 Removing intermediate container 6389964016a2 Step 4 : RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list  ---> Running in cbed2b28c988  ---> 8eed06df8f19 Removing intermediate container cbed2b28c988 Step 5 : RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container  ---> Running in aff40dbc6e05  ---> 19c96e7912a4 Removing intermediate container aff40dbc6e05 Step 6 : CMD /bin/bash  ---> Running in 2469ee9d7251  ---> 77e565a65647 Removing intermediate container 2469ee9d7251 Successfully built 77e565a65647 [root@bogon ubuntu-16.04]# docker images  REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE ubuntu    16.04    77e565a65647  33 seconds ago  110.5 MB [root@bogon ubuntu-16.04]#

从构建日志可以看出,每条命令为一个step,执行完成之后会产生一个id,类似于6389964016a2,其实,这就是镜像的分层,一层层堆积在一起。

到此,一个ubuntu16.04版的docker镜像构建完成,那么接下来就是运行

3.运行镜像

使用docker run命令运行:

[root@bogon ubuntu-16.04]# docker run -it ubuntu:16.04 root@5ea0b95e8641:/# cat /etc/issue Ubuntu 16.04.3 LTS \n \l root@5ea0b95e8641:/# ps -ef UID   PID PPID C STIME TTY   TIME CMD root   1  0 0 22:47 ?  00:00:00 /bin/bash root   11  1 0 22:47 ?  00:00:00 ps -ef root@5ea0b95e8641:/#

其中5ea0b95e8641为当前容器的ID,进入容器查看所有进程,pid为1的时bash,linux不应该时init吗?其实,这就是容器与虚拟机的差别,容器的init进程就是主机上docker服务进程,每个容器只是一个进程而已。其中的参数-it指的是前端打开并分配一个终端,-d为在后台运行,我们试试当前这个可不可以使用-d:

[root@bogon ~]# docker run -d ubuntu:16.04 43ae7ded8e6920b55b8e744b52ffce37b89b25182fcacdc10a5414e6621abff3 [root@bogon ~]# docker ps CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES [root@bogon ~]# docker run -d ubuntu:16.04 /bin/bash 77f3ec2ebfb3f154772683eeea8ca7e2ba3b7756b1488f5f09818af424e0298e [root@bogon ~]# docker ps CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

可以明显的开出来,使用-d后,docker ps查不到任何运行的容器,如果使用-it的话,在别的shell下使用docker ps查看:

[root@bogon ml]# docker ps CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 8341a332c788  ubuntu:16.04  "/bin/bash"   18 seconds ago  Up 18 seconds       drunk_cori

可以看到,有容器在运行,因为我们没有退出。由此可以看出,容器其实以进程方式运行,执行完成/bin/bash之后,进程消亡,所以容器也就不存在,如果容器里面是一个tomcat服务,则是另外一种情况了。

基础镜像基本构建完成。

感谢各位的阅读!关于“如何构建docker基础镜像”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI