段子
今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我碰见一朋友,问今年挣了吗?他望着天空喃喃自语:挣个鸟!看吧,只要肯努力,什么都能挣到。
年末将至,忽然发现,从创建开始到现在,整整一年时间,没有写过多少东西。为了留下一点痕迹,也是为了整理一下自己的收获,为17年画上一笔浓郁的色彩。
最近在看一本入门级机器学习的书,里面的案例基本上是python实现的,所以想搭建python相关的环境,然后又想偷懒,有一个运行环境,可以轻松安装和编写使用,也可以在其他地方使用,编写工具首选jupyter notebook,当然,在大多数的书中也是比较推荐这个工具,自己之前也使用过,觉得不错。还有个问题就是想在其他地方使用python环境和这个工具,不需要重复安装,此刻,我想到的是docker。之前对docker只是简单的理解,为此,特意学习了一下docker,现做分享。
上图就是docker的图标,这个图标对docker的含义阐释的还是比较全面:小鲸鱼代表的是船,船上的就是集装箱,所有的东西不管是什么,只要装在集装箱中,就可以方便的运输。docker公司的口号是build,ship,and run any app,anywhere。docker的本意是码头工人,而在这里说是集装箱的话,比较贴切。所有需要运行的环境和程序,装入docker,然后需要运行的时候,就运行这个特定的docker容器,提供特定的服务。
docker的通俗解析:点击这里
刚开始的时候,搞不清楚docker和虚拟机有什么区别,总感觉docker能干的事虚拟机也能,并且在使用的时候,总按照虚拟机的操作思路去做。那docker为什么会出现?
我在docker的官方网站找到了两张关于虚拟机和容器的区别:
容器 vs 虚拟机
容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
关于容器:点击这里
对于docker做了简单的了解之后,就需要实际去体验一下安装和构建容器,本例使用centos6.5:
1.安装docker相关软件
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7				
 					8				
 					9				
 					10				
 					11				
 					12				
 					13				
 					14				
 					15				
 					16			  | 
[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?,需要解决这个问题,如下:
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7			  | 
[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 官方镜像加速来解决无法拉取:
您可以使用以下命令直接从该镜像加速地址进行拉取:
| 
 					1			  | 
$ docker pull registry.docker-cn.com/myname/myrepo:mytag							 | 
例如:
| 
 					1			  | 
$ docker pull registry.docker-cn.com/library/ubuntu:16.04							 | 
原文如下:点击这里
而在本文中,我使用dockerfile来构建基础镜像ubuntu 16.04(xenial),其对应的dockerfile的github地址为:点击这里,搜索方式为在hub.docker.com中搜索ubuntu,即可看见对应的镜像信息。dockerfile内容如下:
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7				
 					8				
 					9				
 					10				
 					11				
 					12				
 					13				
 					14				
 					15				
 					16				
 					17				
 					18				
 					19				
 					20				
 					21				
 					22				
 					23				
 					24				
 					25				
 					26				
 					27				
 					28				
 					29				
 					30				
 					31				
 					32				
 					33				
 					34				
 					35				
 					36				
 					37				
 					38				
 					39				
 					40				
 					41				
 					42				
 					43				
 					44				
 					45				
 					46				
 					47			  | 
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中的相关命令解释一下:
- from 指的是依赖的基础镜像,如scratch表示的是空白的,从零开始的。依赖的镜像可以是本地的,也可以是远程库的
 - add 指的是添加本地文件到镜像中,如果遇到linux可解压格式文件,会自动解压,这就是为什么整个文件中没有对tar.gz进行显式解压
 - run 运行命令,如安装软件的相关命令
 - cmd 设置启动container时默认执行的命令,这个可以在启动容器时覆盖
 
目前,这个dockerfile中涉及的命令就这几个,其他等以后遇到再进行说明。解释完毕,开始构建:
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7				
 					8				
 					9				
 					10				
 					11				
 					12				
 					13				
 					14				
 					15				
 					16				
 					17				
 					18				
 					19				
 					20				
 					21				
 					22				
 					23				
 					24				
 					25				
 					26				
 					27				
 					28				
 					29				
 					30				
 					31				
 					32				
 					33				
 					34				
 					35				
 					36				
 					37				
 					38				
 					39				
 					40				
 					41				
 					42				
 					43				
 					44				
 					45				
 					46				
 					47				
 					48				
 					49				
 					50				
 					51				
 					52				
 					53				
 					54				
 					55				
 					56				
 					57				
 					58				
 					59				
 					60			  | 
[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命令运行:
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7				
 					8				
 					9			  | 
[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:
| 
 					1				
 					2				
 					3				
 					4				
 					5				
 					6				
 					7				
 					8			  | 
[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查看:
| 
 					1				
 					2				
 					3			  | 
[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服务,则是另外一种情况了。
基础镜像基本构建完成,后面的环境搭建,都将基于这个镜像构建。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:http://www.cnblogs.com/flowerbirds/p/8067900.html
相关文章
- 刀片服务器与机架服务器的区别介绍 2025-05-27
 - 服务器虚拟化技术深度科普 2025-05-27
 - 服务器租用价格怎么计算?服务器租用多少钱一年? 2025-05-27
 - 云服务器的“弹性”体现在哪些方面? 2025-05-27
 - 刀片服务器是什么 刀片服务器的主要特点 2025-05-27
 
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
 - 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
 - 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
 - 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
 - 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
 
快网idc优惠网
QQ交流群
- 
            2025-05-27 102
 - 
            2025-05-27 60
 - 
            2025-05-27 77
 - 
            2025-05-26 98
 - 
            2025-05-27 69
 
        



    		
            	
        
        
        
        