Mac上Docker使⽤例⼦(本⼈亲⾃测试通过)
Docker 是 2014 年最为⽕爆的技术之⼀,⼏乎所有的都听说过它。Docker 是⼀种“轻量级”容器技术,它⼏乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐步使⽤ Docker 来替换现有的虚拟化平台了。作为⼀名 Java 程序员,我们是时候⼀起把Docker 学起来了!
本⽂会对虚拟化技术与 Docker 容器技术做⼀个对⽐,然后引出⼀些 Docker 的名词术语,⽐如:容器、镜像等,随后将使⽤ Docker 搭建⼀个 Java Web 运⾏环境,最后将对本⽂做⼀个总结。
我们先来回顾⼀下传统虚拟化技术的体系架构:
可见,我们在宿主机的操作系统上,可安装了多个虚拟机,⽽在每个虚拟机中,通过虚拟化技术,实现了⼀个虚拟操作系统,随后,就可以在该虚拟操作系统上,安装⾃⼰所需的应⽤程序了。这⼀切看似⾮常简单,但其中的技术细节是相当⾼深莫测的,⼤神级⼈物都不⼀定说得清楚。
凡是使⽤过虚拟机的同学,应该都知道,启动虚拟机就像启动⼀台计算机,初始化过程是相当慢的,我们需要等很久,才能看到登录界⾯。⼀旦虚拟机启动以后,就可以与宿主机建⽴⽹络连接,确保虚拟机与宿主机之间是互联互通的。不同的虚拟机之间却是相互隔离的,也就是说,彼此并不知道对⽅的存在,
但每个虚拟机占⽤的都是宿主机的硬件与⽹络资源。
我们再来对⽐⼀下 Docker 技术的体系架构吧:
可见,在宿主机的操作系统上,有⼀个 Docker 服务在运⾏(或者称为“Docker 引擎”),在此服务上,我们可开启多个 Docker 容器,⽽每个 Docker 容器中可运⾏⾃⼰所需的应⽤程序,Docker 容器之间也是相互隔离的,同样地,都是占⽤的宿主机的硬件与⽹络资源。
Docker 容器相对于虚拟机⽽⾔,除了在技术实现上完全不⼀样以外,启动速度较虚拟机⽽⾔有本质的飞跃,启动⼀个容器只在眨眼瞬间。不管是虚拟机还是 Docker 容器,它们都是为了隔离应⽤程序的运⾏环境,节省我们的硬件资源,为我们开发⼈员提供福利。
我们再来看看 Docker 的 Logo 吧:
很明显,这是⼀只鲸鱼,它托着许多集装箱。我们可以把宿主机可当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含⾃⼰的应⽤程序。这 Logo 简直的太形象了!
需要强调的是,笔者并⾮否定虚拟化技术,⽽是想通过本⽂让更多的读者了解如何使⽤ Docker 技术,让⼤家知道除了虚拟化技术以外,还有另⼀种替代技术,也能让应⽤程序隔离起来。
下⾯,我们将结合⼀个 Java Web 应⽤的部署过程,来描述如何“烹饪”Docker 这份美味佳肴。您准备好了吗?我们现在就开始!
原料
0 前提条件
Mac OS 版本:10.12
下载jdk及tomcat的tar安装包,并将其放⼊Mac的 /software/⽂件夹。
1 安装 Docker
下载mac版本的Docker.dmg,可以百度搜索。安装步骤略。。。
2 下载操作系统镜像
我们不妨还是以 CentOS 为例,通过以下步骤,下载⼀个 CentOS 的镜像。(国内使⽤daocloud的镜
像⽐较容易)
Mac上安装好docker后,屏幕右上⾓会出现docker的鲸鱼logo,点击该图标,并点击Preferences选项
先设置⽂件共享路径,点击+将Mac的/software路径加⼊共享路径
打开mac的命令⾏终端,输⼊如下命令
docker pull daocloud.io/centos:7
最后,使⽤以下命令查看本地所有的镜像:
docker images
当下载完成后,您应该会看到:
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/centos 7 e934aafc2206 2 months ago 199MB
如果看到以上输出,说明您可以使⽤“daocloud.io/centos7”这个镜像了,或将其称为仓库(Repository),有⼀个名
为“e934aafc2206 ”的镜像 ID(可能您所看到的镜像 ID 与此处的不⼀致,那是正常现象,因为这个数字是随机⽣成的)。此外,我们可以看到该镜像只有 199MB,⾮常⼩巧,⽽不像虚拟机的镜像⽂件那样庞⼤。
现在镜像已经有了,我们下⾯就需要使⽤该镜像,来启动容器。
3 启动容器
容器是在镜像的基础上来运⾏的,⼀旦容器启动了,我们就可以登录到容器中,安装⾃⼰所需的软件或应⽤程序。既然镜像已经下载到本地,那么如何才能启动容器呢?
只需使⽤以下命令即可启动容器:
docker run -i -t -v /software/:/mnt/software/e934aafc2206 /bin/bash
这条命令⽐较长,我们稍微分解⼀下,其实包含以下三个部分:
docker run <;相关参数> <;镜像ID> <;初始命令>
其中,相关参数包括:
-
i:表⽰以“交互模式”运⾏容器
-t:表⽰容器启动后会进⼊其命令⾏
-v:表⽰需要将本地哪个⽬录挂载到容器中,格式:-v <;宿主机⽬录>:<;容器⽬录>
假设我们的所有安装程序(jdk,tomcat)都放在了mac的/software/⽬录下,现在需要将其挂载到容器的/mnt/software/⽬录下。
需要说明的是,不⼀定要使⽤“镜像 ID”,也可以使⽤“仓库名:标签名”,例如:daocloud.io/centos:7。
初始命令表⽰⼀旦容器启动,需要运⾏的命令,此时使⽤“/bin/bash”,表⽰什么也不做,只需进⼊命令⾏即可。
4 容器内安装相关软件
通过上⾯的命令 ‘docker run -i -t -v /software/:/mnt/software/e934aafc2206 /bin/bash’ 创建了容器,并⾃动进⼊容器内的centos操作系统命令⾏,cd /mnt/software进⼊安装包所在路径。
4.1 安装 JD K
⾸先,解压 JDK 程序包:
tar -zxf
注意:tar后⾯的参数因与安装包的格式匹配,具体百度tar命令的⽤法
上述命令将包解压到当前路径下的⽂件夹,重命名 JDK ⽂件夹:
mv jdk1.7.0_67/ jdk/
4.2 安装 T om cat
⾸先,解压 Tomcat 程序包:
tar -zxf apache-tomcat-7.0.
然后,重命名 Tomcat ⽂件夹:
mv apache-tomcat-7.0.55/ tomcat/
4.3 设置环境变量
⾸先,编辑.bashrc⽂件
vi ~/.bashrc
然后,在该⽂件末尾添加如下配置:
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin
最后,需要使⽤source命令,让环境变量⽣效:
source ~/.bashrc
4.4 编写运⾏脚本
我们需要编写⼀个运⾏脚本,当启动容器时,运⾏该脚本,启动 Tomcat,具体过程如下:
⾸先,创建运⾏脚本:
vi /root/run.sh
docker进入容器
然后,编辑脚本内容如下:
#!/bin/bash
source ~/.bashrc
sh /mnt/software/tomcat/bin/catalina.sh run
注意:这⾥必须先加载环境变量,然后使⽤ Tomcat 的运⾏脚本来启动 Tomcat 服务。
最后,为运⾏脚本添加执⾏权限:
chmod u+x /root/run.sh
5 退出容器
当以上步骤全部完成后,可使⽤exit命令,退出容器。
随后,可使⽤如下命令查看正在运⾏的容器:
docker ps
此时,您应该看不到任何正在运⾏的程序,因为刚才已经使⽤exit命令退出的容器,此时容器处于停⽌状态,可使⽤如下命令查看所有容器:
docker ps -a
输出如下内容:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57c312bbaad1 e934aafc2206 "/bin/bash" 2 minutes ago Exited (0) 19 seconds ago naughty_goldstine
记住以上CONTAINER ID(容器 ID),随后我们将通过该容器,创建⼀个可运⾏ Java Web 的镜像。
6 创建 Java Web 镜像
使⽤以下命令,根据某个“容器 ID”来创建⼀个新的“镜像”:
docker commit 57c312bbaad1 chenwei/javaweb:0.1
该容器的 ID 是“57c312bbaad1”,所创建的镜像名是“chenwei/javaweb:0.1”,随后可使⽤新镜像来启动 新的Java Web 容器。
7 启动 Java Web 容器
有必要⾸先使⽤docker images命令,查看当前所有的镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
chenwei/javaweb 0.1 fc826a4706af 38 seconds ago 200 MB
daocloud.io/centos 7 e934aafc2206 2 months ago 199 MB
可见,此时已经看到了最新创建的镜像“chenwei/javaweb:0.1”,其镜像 ID 是“fc826a4706af”。正如上⾯所描述的那样,我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进⼊容器的命令⾏,⽽是直接启动容器内部的
Tomcat 服务。此时,需要使⽤以下命令:
docker run -d -v /software/:/mnt/software/ -p 58080:8080 --name javaweb fc826a4706af /root/run.sh
稍作解释:
-d:表⽰以“守护模式”执⾏/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上
-v: 表⽰需要将本地哪个⽬录挂载到容器中,格式:-v <;宿主机⽬录>:<;容器⽬录>
-p:表⽰宿主机与容器的端⼝映射,此时将容器内部的 8080 端⼝映射为宿主机的 58080 端⼝,这样就向外界暴露了 58080 端⼝,可通过 Docker ⽹桥来访问容器内部的 8080 端⼝了。
--name:表⽰容器名称,⽤⼀个有意义的名称命名即可。
关于 Docker ⽹桥的内容,需要补充说明⼀下。实际上 Docker 在宿主机与容器之间,搭建了⼀座⽹络通信的桥梁,我们可通过宿主机 IP 地址与端⼝号来映射容器内部的 IP 地址与端⼝号,
在⼀系列参数后⾯的是“镜像名”或“镜像 ID”,怎么⽅便就怎么来。最后是“初始命令”,它是上⾯编写的运⾏脚本,⾥⾯封装了加载环境变量并启动 Tomcat 服务的命令。
当运⾏以上命令后,会⽴即输出⼀长串“容器 ID”,我们可通过docker ps命令来查看当前正在运⾏的容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82f47923f926 chenwei/javaweb:0.1"/root/run.sh"4 seconds ago Up 3 seconds 0.0.0.0:58080->8080/tcp javaweb
注意:如果没有显⽰正在运⾏的容器,请检查步骤4的是否有操作错误。
8 品尝
在mac的浏览器中,输⼊以下地址,即可访问 Tomcat ⾸页:
localhost:58080/
注意:这⾥使⽤的是宿主机的 IP 地址(本机),与对外暴露的端⼝号 58080,它映射容器内部的端⼝号 8080。
总结
通过本⽂,我们了解了 Docker 是什么?它与虚拟机的差别在哪⾥?以及如何安装 Docker?如何下载
Docker 镜像?如何运⾏ Docker 容器?如何在容器内安装应⽤程序?如何在容器上创建镜像?如何以服务的⽅式启动容器?这⼀切看似简单,但操作也是相当繁琐的,不过熟能⽣巧,需要我们不断地操练。
除了这种⼿⼯⽣成 Docker 镜像的⽅式以外,还有⼀种更像是写代码⼀样,可以⾃动地创建 Docker 镜像的⽅式。只需要我们编写⼀个 Dockerfile ⽂件,随后使⽤docker build命令即可完成以上所有的⼿⼯操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论