Docker是怎么出现的
关于Docker的发展史,本文就不做介绍,有兴趣的小伙伴们可以查看这篇文章,挺有意思的。http://www.oschina.net/news/57838/docker-dotcloud
什么是Docker?
在Docker之前,我们肯定要先了解Docker是什么。官网的介绍是“Docker is the world’s leading software container platform.”官方给Docker的定位是一个应用容器平台。至于为什么要做这个Docker,官网上还有这么一句话"Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud."这句话用一句非常简单的话去概括就是"Build once,Run anyWhere".这一点跟Java很像。那么它这样做是要解决现实中什么问题,我列举几个情况。
1.合作开发的时候,在本机可以跑,别人的电脑跑不起来。
这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可。
2.服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了。
这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
3.公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。
常用命令:
制作镜像(docker build)
# 确保当前目录下有Dockerfile,注意最后的点 .
>>>docker build -m "message" -a "author" -t="imagename:tag" .
# 开启新的终端,查看正在运行的容器
>>>docker ps -l
# 查看输出结果,找到对应容器的CONTAINER ID
# 查看容器的ip
>>>docker inspect --format '{{ .NetworkSettings.IPAddress }}' CONTAINER ID
在对镜像进行修改之后,默认是不保存的,如果需要保存,需要使用docker commit命令
>>>docker commit -m "message" -a "author" CONTAINER ID imagename:tag
注意区分容器与镜像之间的区别
# 删除容器
>>>docker rm CONTAINER ID
# 清理所有处于终止状态的容器
>>>docker rm $(docker ps -a -q)
-
要确保此镜像没有开启容器
-
要确保此镜像不是作为本地其他镜像的依赖
>>>docker rmi IMAGE ID
# 修改镜像名,修改之后默认标签为latest
>>>docker tag IMAGE ID NEW-REPOSITORY
# 修改镜像标签
>>>docker tag IMAGE ID NEW-REPOSITORY:TAG
前提:用dockerhub账号
以用户名为xxx栗子
# 登陆Dockerhub,输入账号密码
>>>docker login
# 确保要上传的镜像名称形如xxx/IMAGE NAME
# 可使用docker tag命令进行更改
>>>docker push xxx/IMAGE NAME
# 稍作等待,之后便可以到DockerHub上查看是否推送成功
在安装完docker并启动之后,主机上会创建一个虚拟的网桥服务,形如172.17.x.x
在运行docker的时候,与主机或者容器间的网络配置,可利用–net参数进行更改
有以下几种模式,默认为bridge模式
–net=bridge|none|container:NAME_or_ID|host
举个栗子:
>>>docker run -it --net=host IMAGE NAME:TAG /bin/bash
# --net=host表示启动host模式,与主机共享ip
端口映射问题。使用-p或者-P解决,格式如下:
# 指定ip:主机端口:容器端口
- ip:hostport:containerport
# 指定ip::容器端口
- ip::containerport
# 主机端口:容器端口
- hostport:containerport
# 映射所有端口
- -P
这个命令具体用途体现在,当容器端口只开放如8080端口时,但是宿主机8080端口又被占用,此时可使用此方式改变映射端口。
举个栗子:
# command表示需要执行的命令
>>>docker run -p 5000:8080 -d IMAGE NAME:TAG command
# 此命令就可以成功的将容器8080端口映射到宿主机的5000端口之上,访问宿主机的5000端口即可