vlambda博客
学习文章列表

面向开发人员的Docker入门级实战,真香

好记性不如烂笔头,记录下来的才是永恒!这里是JavaQ大本营,诚邀关注。本文已收录入GitHub:https://github.com/wind7rui/JavaHub。

聊聊Oracle

2013年“去IOE”这个话题在IT圈火热起来,它是由阿里巴巴提出的概念,意思是在IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备,以自己在开源软件基础上开发的系统取而代之。虽然,Oracle数据库以容量大、稳定、安全、性能高自居,但是这些高性能指标都需要厚实的资金支撑(硬件不断扩展资金、技术咨询和服务费),所以当年很多私有、民办企业紧跟其后,逐渐不再使用Oracle。


回想过去,为了可以随时使用Oracle数据库,不得不在自己的笔记本电脑上安装,不知道各位有没有经历过其安装过程,安装过程很漫长,而且可能会遇到各种奇葩的错误信息,有错误中断安装后,需要再次重新安装。安装过程中会在系统上安装很多辅助软件,有些还被设置成了开机自启动服务。在经历过各种安装重启之后,好不容易安装完成,启动起来试试吧,接下来等待的就是漫长的启动过程,因为它需要加载很多东西,这时候如果电脑配置不行,散热风扇就开始嘶吼了。总结一下,个人笔记本电脑上使用物理安装的方式使用Oracle数据库,不容易!

选Vagrant,还是Docker

如果不是有特殊需求,我是不会再碰Oracle了。这不,最近因某些特殊原因不得不再次安装使用Oracle。不过,现在都2020年了,谁还直接物理安装啊!我很早之前的文章《》和《》详细介绍了不通过物理安装,直接使用Vargant快速打造开发环境,利用虚拟化技术将这些开发环境和软件安装到虚拟机上,通过Vagrant可以轻松实现对虚拟机的管理、自动化配置和安装开发环境及各类软件,这种Vagrant简单快捷、占用的物理资源也少,用的不爽了可以随时移除。


不过,Vagrant不是今天的主角,我们要聊的是Docker!Docker是什么?Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。举个简单的例子,我们把开发好的war包或可执行jar包在安装了JDK的Linux系统上部署,并将相关的依赖及配置也都配置好,然后直接将他们打包成一个镜像,拿着这个镜像就可以随时部署了,不用在部署的机器上安装一系列复杂的软件环境了(JDK、数据库、Redis等),不用再担心“我这可以运行,你那怎么就不行”,也不需要再考虑各种兼容性问题,因为这个镜像就是一个可直接交付的包含运行环境的成品,真正做到一次创建镜像,任意正常运行。Docker提供了镜像仓库,仓库中有很多打包好的、可以拿过来直接部署的镜像,例如Oracle、Nginx等。当然,这只是Docker的部分功能,更多有关Docker的介绍请移步搜索引擎。


Vagrant和Docker都使用了虚拟化技术,Vagrant是基于Virtualbox的虚拟机技术,Docker则是基于轻量级容器虚拟技术,两者的区别就像进程和线程,虚拟机内可以包含很多容器,正如一个进程中可以包含很多线程,所以前者基于虚拟机显重,后者基于容器虚拟技术显轻。不过,它们的侧重点不同,Vagrant是开发环境的部署工具,这一点可以通过它官网的介绍而知,而Docker是运行环境的部署工具。

安装Docker

相对于Vagrant的使用,Docker的操作成本会小很多,最主要的是Docker使用起来快、省。所以,本篇内容是在Windows7系统上使用使用Docker部署Oracle。为什么是Windows7,而不是Windows10?虽然Win10很炫,但是我更喜欢低调实用的Win7,不知道你们是不是也这么认为。不过,如果你是Win10用户也没关系,因为本篇内容也会带着介绍win10上如何部署,不要走开哦!


在Windows系统上安装Docker,操作系统的版本不同方式也不一样。Win7和Win8系统不支持Hyper-V,所以只能安装Docker Toolbox的方式使用Docker,它利用VirtualBox建立Linux虚拟机,在Linux虚拟机中安装Docker服务端和客户端。Win10操作系统可以利用Hyper-V虚拟化技术,所以直接安装Docker for Windows,它在Windows上安装docker服务端和客户端,安装前需要开启Hyper-V,具体操作:控制面板-程序-程序和功能-启用或关闭Windows功能-Hyper-V。



Win10系统安装Docker for Windows,在这里下载https://get.daocloud.io/#install-docker-for-mac-windows。


如果你是MacOS系统,系统版本低于OS X 10.10.3,在这里https://get.daocloud.io/toolbox/下载安装DockerToolbox-19.03.1.pkg,如果系统是OS X 10.10.3或者更高版本,需要下载安装Docker for Mac,在这里下载https://get.daocloud.io/#install-docker-for-mac-windows。


对于Windows系统,在安装前需要确认BIOS设置中是否开启了“Virsualization Technology”,具体操作:开机快速按BIOS设置键(各个品牌电脑不同,如果不知道通过搜索引擎查询),进入BIOS界面,依次选择Configuration -> Intel Virtual Technology -> Enabled(注意:因主板不同,名称和位置可能不一样,主要找Virtual字样的设置)。


Win7/Win8系统双击下载的DockerToolbox-19.03.1.exe,根据指引安装,如果VirualBox或Git已经安装,可以不勾选安装,下图中这个选项建议勾选。

面向开发人员的Docker入门级实战,真香

安装完成后,桌面上会出现Docker Quickstart Terminal快捷键图标,首次双击它进入命令行窗口后,界面提示正在创建一个名字叫default的虚拟机,创建过程会自动从github上下载boot2docker.iso文件,这个过程非常缓慢,而且大多数情况下会出现timeout,如果不能正常下载,虚拟机创建失败。

面向开发人员的Docker入门级实战,真香


如果碰巧你可以非常快速的下载完成,下面的这步骤可以省了。其实,仔细查看官方的DockerToolbox-19.03.1.exe说明,安装包是包含boot2docker.iso文件的。

面向开发人员的Docker入门级实战,真香


安装DockerToolbox-19.03.1.exe后,boot2docker.iso文件被存放到了安装目录下,例如我安装时选择的目录是C:\Program Files\Docker Toolbox,直接将boot2docker.iso拷贝到C:\Users\Administrator.docker\machine\cache下(其中,Administrator是我的用户名,可能和你的不一样),然后断开有线网和无线网,重新打开Docker Quickstart Terminal,就可以创建成功了(如果你尝试了还不行,评论留言@我直接发你),创建的default虚拟机IP默认是192.168.99.100,启动成功后的界面如下图。

面向开发人员的Docker入门级实战,真香


部署Oracle

本文通过使用Docker部署Oracle来学习一下Docker的入门级使用。开始下面的内容之前,我们先了解一下Docker中的镜像、容器和仓库。镜像是一个特殊的模板文件,它里面包含了运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),例如一个MySQL镜像,它包含一个完整的Linux系统,在这个系统上安装了MySQL数据库和其它相关的资源文件和配置。容器是由镜像创建的运行实例,运行镜像就会创建一个容器。镜像和容器的关系,打个比方,就像Java中的类和对象的关系。仓库,这个很好理解了,既然镜像是模板,那么就需要有存储的地方,仓库就是管理镜像的地方,我们可以从仓库中下载镜像,也可以向仓库提交镜像。


sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS=' --registry-mirror=自己的加速器地址 |g" /var/lib/boot2docker/profile

然后执行exit,可以看到退出了default虚拟机,接着依次执行如下命令:

docker-machine env default
eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default) --这一步是根据docker-machine env default执行后,提示需要执行的,如果你没有这个提示,请忽略
docker-machine restart default
docker-machine env --这一步是根据docker-machine restart default执行后,提示需要执行的,如果你没有这个提示,请忽略


{
"registry-mirrors": ["自己的加速器地址"]
}


注册完成后,在https://hub.docker.com/search页面搜索Oracle镜像。

面向开发人员的Docker入门级实战,真香

页面会列出很多镜像,我们根据需要选择某一个,我这里选择wnameless/oracle-xe-11g-r2这个镜像,点击进入详情页面,在这个页面会详细的描述这个镜像如何使用,以及镜像里有什么。

面向开发人员的Docker入门级实战,真香


因为Docker Quickstart Terminal和命令行窗口都不是很好用,所以,我们可以使用常用的ssh软件登录到创建的default虚拟机,我这里使用SecureCRT,其它软件如XShell也可以。登录主机名:192.168.99.100,端口:22,用户名:docker,密码:tcuser,登录成功后如下图。

面向开发人员的Docker入门级实战,真香


输入docker login命令,根据指引完成登录Docker Hub操作。

面向开发人员的Docker入门级实战,真香


根据刚刚在Docker Hub页面搜索wnameless/oracle-xe-11g-r2得到的使用指引,我们需要先输入docker pull wnameless/oracle-xe-11g-r2命令从镜像仓库中拉取该镜像到本地,拉取完成后,输入docker images查看本地有哪些镜像可以使用。

面向开发人员的Docker入门级实战,真香


输入docker run -d -p 1522:22 -p 1521:1521 --name awesome_lalande wnameless/oracle-xe-11g-r2命令,部署Oracle镜像,创建一个新的容器,得到一个可使用的Oracle数据库服务,启动过程之快令人惊讶,秒级别的。

上面命令参数解释:

  • docker run:创建一个新的容器并运行命令;

  • -d:后台运行容器,并返回容器ID;

  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口,如1521:1521;

  • --name:指定容器的名称,如awesome_lalande;

  • wnameless/oracle-xe-11g-r2:要运行的镜像;


输入docker ps查看有哪些正在运行的容器,如果想列出所有的容器,包括未运行的,可以使用docker ps -a。

面向开发人员的Docker入门级实战,真香

可以看到我们刚刚通过docker run命令部署的wnameless/oracle-xe-11g-r2镜像已经启动成功了,创建的容器ID为1050ac76bdcf。


如果你想看容器的运行启动日志,输入“docker logs CONTAINER_ID”,CONTAINER_ID就是docker ps输出的CONTAINER_ID。

面向开发人员的Docker入门级实战,真香


如果你想进入到Oracle容器中,也就是运行Oracle的Linux系统中,输入“docker exec -it CONTAINER_ID /bin/bash”,CONTAINER_ID同样是docker ps输出的CONTAINER_ID。退出容器,输入exit。

面向开发人员的Docker入门级实战,真香


如果想停止运行中的容器,可以输入docker stop 容器名称,例如docker stop awesome_lalande,这个awesome_lalande是我们上面使用docker run时通过--name参数指定的容器名称,如果你不确定容器名称,可以通过docker ps命令查看,输出的最后一列就是容器名称。

面向开发人员的Docker入门级实战,真香


启动一个已停止运行的容器,可以输入docker start 容器名称,例如docker start awesome_lalande。当日也可以使用docker restart命令重启容器,例如docker restart awesome_lalande。


到这里,我们就可以使用数据库操作客户端连接Oracle数据库并使用了。我这里使用Navicat,连接信息如下:hostname:192.168.99.10,port:1521,sid:xe,username:system,password:oracle。

小结

本篇内容基于Oracle镜像,当然你有可以试试其它镜像,例如MySQL、Nginx等,使用方式都是一样的,具体如何使用镜像,可以根据上面说的,查看Docker Hub中搜索得到的镜像详细描述。


本篇内容只是一个入门级的使用,Docker有很多很强大的功能,后续我也会结合实际工作中的使用经历不断分享,欢迎朋友们继续关注!


如果你还不知道Docker是什么,或者还没使用过,真的需要好好补补课了,不是因为它流行,而是真的很好用,真香!


聊个题外话,关注我的朋友可能发现了,我更新文章不是很固定,有时一周一更,有时两周一更,我不是专门做自媒体的,写作只为了记录(记忆不可靠)和分享(开源),所以没必要为了讨好别人浪费时间到处找文章、转发别人未授权的文章,一天一更。


以前看到好的文章也会分享、做排版,但是后来想想基本是在消耗我的时间,自己也没有得到技术积累,从那之后索性只分享自己的原创。我也会在圈里分享我写的文章,毕竟这些都是我早上早起挤时间整理的。所以关注我你会看到一手原创、有料的技术文章


学之多,而后知之少!朋友们点【在看】是我持续更新的最大动力,我们下期见!