一样的代码,本地可以跑,服务器上就不行,那这就是环境的问题和配置的问题了。而且,一个产品从开发到上线,往往有开发环境,测试环境,仿真环境和生产环境,每个环境我们都需要安装一遍mysql、redis、nginx,activemq等,运维的工作量也挺大,而且都是重复的工作。为了解决这些痛点,docker就出现了。
2、是什么?
docker就是一个容器,一次构建,处处运行。也就是说,我开发环境安装了mysql、redis,我可以直接将这两个镜像搬到测试环境,开箱即用,而不用重新去配置。
3、虚拟机技术和容器技术:
4、docker的核心概念:
二、docker的安装
1、安装前提:
2、docker的安装:
centos 6安装docker:
centos 7安装docker:
daemon.json的内容如下:
获取阿里云加速镜像链接的方法:登陆https://cr.console.aliyun.com,然后点击左下角的“镜像加速器”即可。
3、hello world:上面说过执行docker run hello-world
会打印出相关信息,执行这条命令过程如下:
三、docker常用命令
1、帮助命令:
2、镜像命令:回顾一下docker的logo,海上有一头鲸鱼,鲸鱼背上有一个个的集装箱。对应关系如下:
常用镜像命令如下:
3、容器命令:首先我们执行docker pull centos
拉取一个centos的镜像,下面所说的容器都是指centos(都可以是名字或者id)。
四、docker镜像
1、什么是镜像?镜像是一种轻量级的可执行的独立软件包。用来打包软件运行环境和基于运行环境开发的软件,包括代码、运行时、库、环境变量和配置文件。docker底层是一个unionFS(联合文件系统),即是一层一层的文件系统组成。
2、镜像为什么那么大?执行docker pull tomcat
命令,下载一个tomcat镜像,然后执行docker images
,发现一个tomcat就600多兆,为什么那么大?因为刚才说的,镜像是一个联合文件系统,tomcat镜像不仅仅包含tomcat,还包含tomcat运行的各种环境,一个镜像包含了很多层,分层镜像如下:
3、docker为什么采用分层镜像?最大的好处就是共享资源。比如多个镜像都需要jdk,那么宿主机上其实只要保存一份jdk就可以了,内存中也只需要加载一份。镜像的每一层都是可以共享的。
4、docker commit命令:首先我们运行docker run -it -p 8888:8080 tomcat
,这里表示docker内部将tomcat运行在8080端口,对外暴露8888端口,即执行完这条命令,我们要用8888端口才能访问到tomcat。如果你访问到的是404,不要方,这是因为你下载的这个版本的tomcat,webapps目录是空的,资源都在webapps-dist目录下,可以执行如下操作:
刷新页面,就可以看到熟悉的tomcat首页了。上面是指定对外暴露8888端口,还可以执行docker run -it -P tomcat
,大写的P表示随机分配端口,不自己指定。用这个命令启动后,执行docker ps
,就可以看到随机分配的端口是什么。
上面我们对tomcat做了一些修改,把访问会报404的tomcat改成了一个正常的tomcat,我们就可以使用commit命令以我们改好的tomcat为模板,生成一个启动就能直接访问的新的tomcat镜像。执行如下命令:docker commit -a="zhusl" -m="normal tomcat" 容器id newtomcat:1.0
五、容器数据卷
1、是什么?我们在docker上运行容器实例,运行时产生的数据,当docker关闭了就没了。但是我们希望有些数据可以持久化保存下来,这个保存的地方的就是容器数据卷,并且保存下来的数据可以共享。
2、容器数据卷的特点:
3、添加数据卷的方法:添加数据卷有两种方法,一种是命令添加,一种是用dockerfile。命令添加:
dockerFile添加:
4、数据卷容器:上面说了数据卷,数据卷容器其实就是数据卷之间的传递性。比如还是以zhusl/centos镜像为例,先执行docker run -it --name dc01 zhusl/centos
,运行一个名为dc01的实例,然后再执行docker run -it --name doc02 --volumes-from dc02 zhusl/centos
,以dc01为父容器,运行一个dc02。因为zhusl/centos是添加了数据卷的,所以运行的dc01是挂载了数据卷的,然后dc02又是from dc01,所以dc02也挂载了数据卷。如果还有一个dc03也是继承自dc01,当dc01挂了,dc02和dc03之间也是可以进行数据共享的。
六、dockerFile
1、是什么?就是一个写命令的文件,然后通过这个文件,就可以构建镜像。
2、构建的三个步骤:
登陆docker hub,然后随便搜索一个镜像,就以centos为例,选择版本然后进入,就可以看到它的dockerfile文件内容。如下就是centos7的dockerfile文件内容:
3、dockerfile内容基础知识:
4、dockerfile的执行流程:
5、dockerfile的保留字:
6、dockerfile构建镜像实操:
新建一个dockerfile2文件,内容就是上面那段,然后执行docker build -f /mydocker/dockerfile2 -t mycentos:1.0 .
进行构建。-f后面的是dockerfile2文件的路径,mycentos是镜像名字,1.0是版本号,.代表当前路径。
执行完后,docker images
就会发现有一个新镜像,名字叫mycentos。然后运行该镜像,就会发现这个mycentos可以使用vim和ifconfig的。再回溯一个问题,镜像那么大,是因为它包含了它运行所需的所有环境,那么是不是很浪费空间?就比如这个,我原本有一个centos镜像,只不过没有vim编辑器,现在我构建一个新的有vim的mycentos,docker images 显示centos 600M,mycentos 620M,那这两个是不是就要占用1个G?其实并不是,因为镜像是可以共享的,mycentos 是form centos的,也就是说这600其实是共用的,最后这两个镜像其实占空间就是620M。
执行docker history 镜像id
,就可以列出镜像的历史,即这个镜像有多少层。
意思就是制作一个镜像,一启动,就可以查出本机的IP。执行docker build -f /mydocker/dockerfile3 -t myip .
进行构建。然后运行该容器,就可以打印出ip信息。如果过执行的时候想加参数,比如docker run -it myip -i
,实际上就是想执行curl的时候加上-i
参数,打印请求头信息,那么抱歉,-i
会覆盖之前的命令,即覆盖CMD ["curl","-s","http://ip.cn"]
这一样,然后-i
根本就不是一个可执行命令,所以执行报错。要实现上面的需求,即加个-i
,让它真正执行的是curl -s -i https://ip.cn
,只需要把CMD
换成ENTRYPOINT
,然后启动容器时用docker run -it myip -i
即可。
然后,新建dockerfile4,FROM myip,build的时候会打印出 "我被触发了" 这一句话。
七、常用镜像安装
1、MySQL:
2、redis:
八、本地镜像推送到阿里云
本文分享自微信公众号 - java开发那些事(javawebkf)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。