最近阿里的面试官问我Docker是做什么用的,我记得之前360和美团,京东的都问过,但是一直没时间看,最近有时间了,系统的学习了一下Docker,在此做一下记录,方便各位看官学习交流
一、Docker概述:
Docker: 本意是码头工人,言外之意是集装箱;
Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;
Docker是:“一次封装,到处运行”,因为docker决绝了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。
一句话 应用打包工具
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器 [2]
Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,
源代码托管在 Github 上, 遵从Apache2.0协议开源。Docker的目标是实现轻量级的操作系统虚拟化解决方案。
学习Docker首先要了解几个概念:
镜像—Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息;
容器—容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在“Docker”上;
仓库—仓库是存放镜像的地方,有类似git的版本控制,同样分为公开仓库(Public)和私有仓库(Private)两种形式;
Docker支持大部分的Linux发行版,通过使用Docker容器,就可以在不同的操作系统,
不同的机器上运行自己的应用,不用关心硬件、运行环境之类的配置,应用程序的迁移变得非常简单。
二、Docker和传统虚拟化技术的对比
相比传统虚拟机技术,Docker资源占用少,启动更快,很大的方便了项目的部署和运维。
Docker是在操作系统层面上实现虚拟化,复用本地主机的操作系统,传统方式是在硬件的基础上,虚拟出多个操作系统,然后在系统上部署相关的应用。
下面的这张图片参考相关博文,很形象的说明了Docker和VM之类的传统虚拟化技术的区别:
vs
就像一个集装箱一样,不管需要运送服装还是化工产品,还是汽车,只需要放在集装箱里面,不管到那个船上,也不管到那个铁路上,我直接机械化的搬运就行了。很简单
三、真正的部署一下Dock的开发环境
首先要安装VMware 虚拟机和 并下载Centos 操作系统,然后安装上 Linux 环境,
此处如果不懂的话,可直接百度,
安装完之后,我这边不能上网,后来做了一下配置:
参考:VMware 虚拟机 不能上网 CentOS 6.5 Windows 7上面安装了VMware,然后安装了CentOS系统,安装完了无法上网;
然后可以上网了,好了linux环境 准备好了,开始安装了
(1)直接使用yum 安装 docker:
首先肯定是要机器中安装了docker,如果没安装就是用yum install -y docker 命令安装一下
yum install -y docker
既然是部署web应用,那么当然少不了Tomcat了,所以我们应该先拉取Tomcat镜像。
命令如下,(开始的时候,我还跑到网上去下载tomcat,后来发现,根本不需要,直接用docker拉取就行了)
docker pull tomcat
这个镜像有点大,所以可以事先拉取好,节省时间。
接下来我们就用Tomcat镜像来启动一个容器
docker run -it --name webdemo -p 80:8080 tomcat /bin/bash
这里我们启动一个交互式的容器,名字是webdemo,-p 80:8080表示将容器的8080端口映射到主机的80端口,这样我们只要访问主机的80端口就可以访问到容器的服务了。
容器创建好了之后是会进入容器里面的,这时我们刚好可以看看内部的文件结构。那里有个webapps文件,我们只要把我们的web应用程序保存成war包的格式,然后再复制到这个文件中就可以了。因为Tomcat会自动帮我们解压并且部署war包。
如何将文件从主机复制到容器中?
因为我之前的终端在容器里面,这里我开启第二个终端进行操作。我的war包文件我放在/mnt/的目录下
从主机复制到容器 sudo docker cp host_path containerID:container_path
从容器复制到主机 sudo docker cp containerID:container_path host_path
我们这里用的命令是:
docker cp /mnt/webdemo.war a2f2091a661fa51e02c0be54f252fc46fc604932526b17038ccc267affcef12c:/usr/local/tomcat/webapps
其中那个长的字符串是容器的id,自己去查一下。 后面的路径是容器的内部路径,实在不懂可以复制过去,这里要注意:冒号后面没有空格,我之前有空格,一直复制不过去。
接下来就是启动Tomcat了。
war包已经导入容器中了,这个时候我们可以去第一个终端查看一下
可以看到war包已经导入了。但是这个时候Tomcat服务其实是没有启动的,下面我们就启动Tomcat服务,让Tomcat帮我们完成war包的解压和部署。
这里我们进入bin目录把目录下的catalina.sh文件run起来,这样Tomcat就跑起来了,而且Tomcat跑起来是在前端运行的,这也是我为什么打开第二个终端的原因。
最后我们可以在浏览器中查看效果:
我照着网上的应用去做,上面的都没问题,成功了,不过后来把原来创建的容器ssh关闭了,然后又打开,
如何进入已经打开的容器呢,两种方法
a:使用docker attach命令
docker attach db3 或者 docker attach d48b21a7e439
db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID
然后就进去了这个容器的ssh界面。
但是它有一个缺点,只要这个连接终止,或者使用了exit命令,容器就会退出后台运行
b:使用docker exec命令
这个命令使用exit命令后,不会退出后台,一般使用这个命令,使用方法如下
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
db3是后台容器的NAMES,d48b21a7e439是容器的进程ID CONTAINER ID
/bin/sh 是固定写法
它也能进入这个容器
参考:在Docker中如何利用Tomcat快速部署web应用?
原文地址:https://www.cnblogs.com/aspirant/p/8808809.html