Docker 入门 到部署Web 程序- (阿里面试经常使用的docker命令和优势)

最近阿里的面试官问我Docker是作什么用的,我记得以前360和美团,京东的都问过,可是一直没时间看,最近有时间了,系统的学习了一下Docker,在此作一下记录,方便各位看官学习交流html

后来去面试,他们问我 若是如今有5台服务器 同时部署docker 你会如何处理,我当时说一台台部署,那哥们听完脸色铁青,说有没有用过swarm和compose 作docker的批量部署,我说没有,后来回来一查,我晕,本身每天在用compose  我写了篇博客:docker swarm和compose 的使用(阿里)前端

1、Docker概述:java

Docker: 本意是码头工人,言外之意是集装箱;node

Java号称“一次编译,处处运行”,由于java虚拟机解决平台的兼容性问题,因此有java虚拟机的地方就能跑java代码;linux

Docker是:“一次封装,处处运行”,由于docker决绝了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。git

一句话 应用打包工具

Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的Linux机器上,也能够实现虚拟化,容器是彻底使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有如下几个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器 [2] web

Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,
源代码托管在 Github 上, 听从Apache2.0协议开源。Docker的目标是实现轻量级的操做系统虚拟化解决方案。面试

学习Docker首先要了解几个概念:docker

镜像—Docker的镜像和常见的系统ISO镜像相似,包含了应用程序的信息;centos

容器—容器至关于一个能够运行起来的虚拟机,应用程序运行在容器中,Docker运行在“Docker”上;

仓库—仓库是存放镜像的地方,有相似git的版本控制,一样分为公开仓库(Public)和私有仓库(Private)两种形式;

Docker支持大部分的Linux发行版,经过使用Docker容器,就能够在不一样的操做系统,

不一样的机器上运行本身的应用,不用关心硬件、运行环境之类的配置,应用程序的迁移变得很是简单。

2、Docker和传统虚拟化技术的对比

相比传统虚拟机技术,Docker资源占用少,启动更快,很大的方便了项目的部署和运维。
Docker是在操做系统层面上实现虚拟化,复用本地主机的操做系统,传统方式是在硬件的基础上,虚拟出多个操做系统,而后在系统上部署相关的应用。

下面的这张图片参考相关博文,很形象的说明了Docker和VM之类的传统虚拟化技术的区别:

 vs

 

就像一个集装箱同样,无论须要运送服装仍是化工产品,仍是汽车,只须要放在集装箱里面,无论到那个船上,也无论到那个铁路上,我直接机械化的搬运就好了。很简单

3、真正的部署一下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

  docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行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经常使用的命令,有必要对Docker经常使用的命令作一次梳理:

 

(1) 安装 docker:

yum install -y docker

(2) 启动 docker服务:

service docker start   //启动docker service

若是想要关闭docker服务:

service docker stop

(3) 获取镜像:

sudo docker pull NAME[:TAG]
sudo docker pull centos:latest

 好比获取tomcat 镜像:

docker pull tomcat   //命令格式: docker pull NAME

(4) 罗列全部镜像:

docker images

 (5)、删除镜像,从本地删除一个已经下载的镜像

sudo docker rmi IMAGE [IMAGE...]
sudo docker rmi centos:latest

 

(5)建立docker容器 并进入 webdemo1:

docker run -it --name webdemo1 -p 81:8080 tomcat /bin/bash

docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本

注意:name前面是两个-, 端口前面有-p, 后面有个tomcat;

这里咱们启动一个交互式的容器,名字是webdemo1,-p 81:8080表示将容器的8080端口映射到主机的81端口,这样咱们只要访问主机的81端口就能够访问到容器的服务了。若是还想建立其余的容器,那么名称 要改,并且不能再挂载到主机的81上了,能够82上挂载;

(6)启动一个中止的容器:

docker start webdemo

(7) 罗列全部的docker容器:包含了启动的Docker和没有启动的容器Docker

docker ps -a;

(8) 启动容器:

docker start webdemo

可能端口会被占用,咱们能够先把运行的docker实例停掉,而后再删掉,

docker kill webdemo

docker rm webdemo

 

(9) 进入其中一个容器:使用docker exec命令

这个命令使用exit命令后,不会退出后台,通常使用这个命令,使用方法以下
docker exec -it webdemo /bin/bash

(10)拷贝文件

从主机复制到容器 sudo docker cp host_path containerID:container_path

从容器复制到主机 sudo docker cp containerID:container_path host_path

请注意,以上这两个命令都是在主机中执行的,不能再容器中执行

docker cp /root/software/docker.war webdemo:/
docker cp demo:/abc.txt  /root/software/

(10) 在容器中启动tomcat:  

cd /usr/local/tomcat/bin
./catalina.sh run

(11)记住一个服务器能够有多个容器,可是一个服务器只须要安装一个tomcat,而后每一个容器能够挂载到不一样的tomcat的端口上面,就是这关系。前台访问:

http://192.168.163.128:80/docker  //这是第一个容器webdemo

http://192.168.163.128:81/docker; //这是第二个容器webdemo1

 

Docker的优势:

 Docker五大优点:持续集成、版本控制、可移植性、隔离性和安全性

【编者的话】 随着Docker技术的不断成熟,愈来愈多的企业开始考虑使用Docker。Docker有不少的优点,本文主要讲述了Docker的五个最重要优点,即持续集成、版本控制、可移植性、隔离性和安全性。

对于Docker,应该不须要进行详细的介绍了。它是最火热的开源项目之一,经过在容器中增长一个抽象层(a layer of abstraction),就能够将应用程序部署到容器中。在看似稳定而成熟的场景下,使用Docker的好处愈来愈多。在这篇文章中,我不谈论Docker是什么或者Docker是怎么工做的,取而代之,我会提出使用这个不断成长的平台的五大好处。

持续部署与测试

Docker在开发与运维的世界中具备极大的吸引力,由于它能保持跨环境的一致性。在开发与发布的生命周期中,不一样的环境具备细微的不一样,这些差别多是因为不一样安装包的版本和依赖关系引发的。然而,Docker能够经过确保从开发到产品发布整个过程环境的一致性来解决这个问题*Docker容器经过相关配置,保持容器内部全部的配置和依赖关系始终不变。最终,你能够在开发到产品发布的整个过程当中使用相同的容器来确保没有任何差别或者人工干预。

使用Docker,你还能够确保开发者不须要配置彻底相同的产品环境,他们能够在他们本身的系统上经过VirtualBox创建虚拟机来运行Docker容器。Docker的魅力在于它一样可让你在亚马逊EC2实例上运行相同的容器。若是你须要在一个产品发布周期中完成一次升级,你能够很容易地将须要变动的东西放到Docker容器中,测试它们,而且使你已经存在的容器执行相同的变动。这种灵活性就是使用Docker的一个主要好处。和标准部署与集成过程同样,Docker可让你构建、测试和发布镜像,这个镜像能够跨多个服务器进行部署。哪怕安装一个新的安全补丁,整个过程也是同样的。你能够安装补丁,而后测试它,而且将这个补丁发布到产品中。

多云平台

Docker最大的好处之一就是可移植性。在过去的几年里,全部主流的云计算提供商,包括亚马逊AWS和谷歌的GCP,都将Docker融入到他们的平台并增长了各自的支持。Docker容器能运行在亚马逊的EC2实例、谷歌的GCP实例、Rackspace服务器或者VirtualBox这些提供主机操做系统的平台上。举例来讲,若是运行在亚马逊EC2实例上的Docker容器可以很容易地移植到其余几个平台上,好比说VirtualBox,而且达到相似的一致性和功能性,那这将容许你从基础设施层中抽象出来。除了AWS和GCP,Docker在其余不一样的IaaS提供商也运行的很是好,例如微软的Azure、OpenStack和能够被具备不一样配置的管理者所使用的Chef、Puppet、Ansible等。

环境标准化和版本控制

经过上面的讨论,Docker容器能够在不一样的开发与产品发布生命周期中确保一致性,进而标准化你的环境。除此以外,Docker容器还能够像git仓库同样,可让你提交变动到Docker镜像中并经过不一样的版原本管理它们。设想若是你由于完成了一个组件的升级而致使你整个环境都损坏了,Docker可让你轻松地回滚到这个镜像的前一个版本。这整个过程能够在几分钟内完成,若是和虚拟机的备份或者镜像建立流程对比,那Docker算至关快的,它可让你快速地进行复制和实现冗余。此外,启动Docker就和运行一个进程同样快。

隔离性

Docker能够确保你的应用程序与资源是分隔开的。几个月前,Gartner发表了一篇报告,这份报告说明了运行Docker 容器进行资源隔离的效果和虚拟机(VM)管理程序同样的好,可是管理与控制方面还须要进行完善。

咱们考虑这样一个场景,你在你的虚拟机中运行了不少应用程序,这些应用程序包括团队协做软件(例如Confluence)、问题追踪软件(例如JIRA)、集中身份管理系统(例如Crowd)等等。因为这些软件运行在不一样的端口上,因此你必须使用Apache或者Nginx来作反向代理。到目前为止,一切都很正常,可是随着你的环境向前推动,你须要在你现有的环境中配置一个内容管理系统(例如Alfresco)。这时候有个问题发生了,这个软件须要一个不一样版本的Apache Tomcat,为了知足这个需求,你只能将你现有的软件迁移到另外一个版本的Tomcat上,或者找到适合你现有Tomcat的内容管理系统(Alfresco)版本。

对于上述场景,使用Docker就不用作这些事情了。Docker可以确保每一个容器都拥有本身的资源,而且和其余容器是隔离的。你能够用不一样的容器来运行使用不一样堆栈的应用程序。除此以外,若是你想在服务器上直接删除一些应用程序是比较困难的,由于这样可能引起依赖关系冲突。而Docker能够帮你确保应用程序被彻底清除,由于不一样的应用程序运行在不一样的容器上,若是你不在须要一款应用程序,那你能够简单地经过删除容器来删除这个应用程序,而且在你的宿主机操做系统上不会留下任何的临时文件或者配置文件。

除了上述好处,Docker还能确保每一个应用程序只使用分配给它的资源(包括CPU、内存和磁盘空间)。一个特殊的软件将不会使用你所有的可用资源,要否则这将致使性能下降,甚至让其余应用程序彻底中止工做。

安全性

如上所述,Gartner也认可Docker正在快速地发展。从安全角度来看,Docker确保运行在容器中的应用程序和其余容器中的应用程序是彻底分隔与隔离的,在通讯流量和管理上赋予你彻底的控制权。Docker容器不能窥视运行在其余容器中的进程。从体系结构角度来看,每一个容器只使用着本身的资源(从进程到网络堆栈)。

做为紧固安全的一种手段,Docker将宿主机操做系统上的敏感挂载点(例如/proc和/sys)做为只读挂载点,而且使用一种写时复制系统来确保容器不能读取其余容器的数据。Docker也限制了宿主机操做系统上的一些系统调用,而且和SELinux与AppArmor一块儿运行的很好。此外,在Docker Hub上可使用的Docker镜像都经过数字签名来确保其可靠性。因为Docker容器是隔离的,而且资源是受限制的,因此即便你其中一个应用程序被黑,也不会影响运行在其它Docker容器上的应用程序。

结语

将云计算一块儿考虑,上面提到的这些好处可以清楚地证实Docker是一个有效的开源平台。使用Docker的好处愈来愈多,今天我只想强调这前五大好处。若是你使用了Docker,欢迎分享你的使用案例或者任何你以为使用Docker带来的好处。

参考:Docker经常使用命令

参考:安装Docker和下载images镜像和经常使用Docker命令

参考:docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

参考:如何通俗解释Docker是什么?

参考:Docker搭建Java Web运行环境

参考:在Docker中如何利用Tomcat快速部署web应用?

参考:docker进入后台运行的容器

参考:Docker五大优点:持续集成、版本控制、可移植性、隔离性和安全性

相关文章
相关标签/搜索