您好,登錄后才能下訂單哦!
今天小編給大家分享一下如何從零開始構(gòu)建docker基礎(chǔ)鏡像的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
容器 vs 虛擬機(jī)
容器和虛擬機(jī)具有相似的資源隔離和分配優(yōu)勢(shì),但功能有所不同,因?yàn)槿萜魈摂M化的是操作系統(tǒng),而不是硬件,因此容器更容易移植,效率也更高。
關(guān)于容器:
對(duì)于docker做了簡(jiǎn)單的了解之后,就需要實(shí)際去體驗(yàn)一下安裝和構(gòu)建容器,本例使用centos6.5:
1.安裝docker相關(guān)軟件
[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服務(wù)狀態(tài)的時(shí)候,發(fā)現(xiàn)沒(méi)有啟動(dòng)docker dead but pid file exists,執(zhí)行docker相關(guān)命令(如docker ps)的時(shí)候會(huì)出現(xiàn)cannot connect to the docker daemon. is 'docker -d' running on this host?,需要解決這個(gè)問(wèn)題,如下:
[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.構(gòu)建基礎(chǔ)鏡像
在使用docker的時(shí)候后,可以通過(guò)命令docker pull <鏡像名稱>從鏡像庫(kù)中獲取,但是有時(shí)候會(huì)出現(xiàn)網(wǎng)絡(luò)問(wèn)題或是其他原因,導(dǎo)致無(wú)法拉取,在docker中國(guó)官網(wǎng)介紹使用通過(guò) docker 官方鏡像加速來(lái)解決無(wú)法拉?。?/p>
您可以使用以下命令直接從該鏡像加速地址進(jìn)行拉?。?/p>
$ docker pull registry.docker-cn.com/myname/myrepo:mytag
例如:
$ docker pull registry.docker-cn.com/library/ubuntu:16.04
原文如下:
而在本文中,我使用dockerfile來(lái)構(gòu)建基礎(chǔ)鏡像ubuntu 16.04(xenial),其對(duì)應(yīng)的dockerfile的github地址為:點(diǎn)擊這里,搜索方式為在hub.docker.com中搜索ubuntu,即可看見對(duì)應(yīng)的鏡像信息。dockerfile內(nèi)容如下:
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"]
現(xiàn)在對(duì)dockerfile中的相關(guān)命令解釋一下:
from 指的是依賴的基礎(chǔ)鏡像,如scratch表示的是空白的,從零開始的。依賴的鏡像可以是本地的,也可以是遠(yuǎn)程庫(kù)的
add 指的是添加本地文件到鏡像中,如果遇到linux可解壓格式文件,會(huì)自動(dòng)解壓,這就是為什么整個(gè)文件中沒(méi)有對(duì)tar.gz進(jìn)行顯式解壓
run 運(yùn)行命令,如安裝軟件的相關(guān)命令
cmd 設(shè)置啟動(dòng)container時(shí)默認(rèn)執(zhí)行的命令,這個(gè)可以在啟動(dòng)容器時(shí)覆蓋
目前,這個(gè)dockerfile中涉及的命令就這幾個(gè),其他等以后遇到再進(jìn)行說(shuō)明。解釋完畢,開始構(gòu)建:
[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]#
從構(gòu)建日志可以看出,每條命令為一個(gè)step,執(zhí)行完成之后會(huì)產(chǎn)生一個(gè)id,類似于6389964016a2,其實(shí),這就是鏡像的分層,一層層堆積在一起。
到此,一個(gè)ubuntu16.04版的docker鏡像構(gòu)建完成,那么接下來(lái)就是運(yùn)行
3.運(yùn)行鏡像
使用docker run命令運(yùn)行:
[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為當(dāng)前容器的id,進(jìn)入容器查看所有進(jìn)程,pid為1的時(shí)bash,linux不應(yīng)該時(shí)init嗎?其實(shí),這就是容器與虛擬機(jī)的差別,容器的init進(jìn)程就是主機(jī)上docker服務(wù)進(jìn)程,每個(gè)容器只是一個(gè)進(jìn)程而已。其中的參數(shù)-it指的是前端打開并分配一個(gè)終端,-d為在后臺(tái)運(yùn)行,我們?cè)囋嚠?dāng)前這個(gè)可不可以使用-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
可以明顯的開出來(lái),使用-d后,docker ps查不到任何運(yùn)行的容器,如果使用-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
可以看到,有容器在運(yùn)行,因?yàn)槲覀儧](méi)有退出。由此可以看出,容器其實(shí)以進(jìn)程方式運(yùn)行,執(zhí)行完成/bin/bash之后,進(jìn)程消亡,所以容器也就不存在,如果容器里面是一個(gè)tomcat服務(wù),則是另外一種情況了。
基礎(chǔ)鏡像基本構(gòu)建完成,后面的環(huán)境搭建,都將基于這個(gè)鏡像構(gòu)建。
以上就是“如何從零開始構(gòu)建docker基礎(chǔ)鏡像”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。