本文旨在用最通俗的语言讲述最枯燥的基本知识
上一篇文章《为什么要用 docker》已经讲述了什么是 docker 以及我们要用 docker 的原因, 并且讲解了如何安装 docker. 这时候很多读者磨拳擦脚跃跃欲试但却发现安装好 docker 之后就无从下手了, 那么, 接下来, 小编会从以下方面讲述 docker 的一些基础知识, 当然, 理论都是生硬的, 所以小编选取了 javaweb 项目中最常用的一个软件 --tomcat 的安装和使用来引导学习一些 docker 相关的知识, 借此让读者能够从实战的角度去理解 docker 为什么会有这些基础知识以及如何使用这些基础知识.
我们知道, Web 开发和部署离不开 tomcat, 而在目前的实际情况是:
一个项目中, 每个开发者本机电脑都有自己的 tomcat 或者用 idea 的内置 tomcat, 当我们开发完成提交测试时, 测试服务器上也有一个 tomcat; 当项目上线时, 线上服务器也有一个 tomcat, 因此就很容易出现一些奇奇怪怪的问题, 比如在同事 A 电脑上能正常运行的, 到同事 B 电脑上就出问题的; 或者是在测试环境里一切正常, 到了线上 bug 一堆. 这时候 docker 就有了用武之地, 项目负责人把 docker 的 tomcat 镜像做好了之后上传到镜像仓库, 项目成员的电脑环境, 测试环境, 线上环境均拉取这个 tomcat 使用, 就能保持在所有的环境下 tomcat 的版本, 设置都是一致的, 避免了一些非技术的问题.
那么, 现在我们就用 docker 来做一个 tomcat 的环境.
镜像的查找和拉取
首先, 我们需要去镜像仓库找到我们要的镜像, 查找镜像的语法是
docker search 镜像名称: 镜像 TAG
因此, 查找 Tomcat 镜像:
docker search tomcat
有读者会疑问: 什么是镜像 TAG?
镜像的 TAG 值就是镜像的版本, 就比如 Tomcat 有 7.0,8.5,9.0 等我们常用的版本, 那么相应的这些软件被做成 docker 镜像之后, 官方也会根据软件本身的版本对应出 docker 镜像的版本.
下图为查找结果:
可以看到, 有很多的 Tomcat 镜像, 那么我们应该怎么选用这些镜像呢? 通常情况下, 我们都知道官方的东西基本上代表安全无公害, 因为可以看到右边有 official 标识为 OK 的就是官方的镜像, 因此我们拉取第一个 Tomcat 就可以.
拉取镜像的语法是:
docker pull 镜像 NAME: 镜像 TAG
因为我们要拉取 Tomcat 时, 就可以这样写:
docker pull tomcat
有人说你怎么没加上镜像 TAG
在拉取镜像时, 如果加上镜像 TAG, 就会去查找是否有相应版本的镜像, 如果有则拉取, 如果没有则不拉去. 而没有加 TAG 时, 就默认代表拉取的是该镜像的最新版本.
假如需要拉取固定版本如拉取 Tomcat8.5:
docker pull tomcat:8.5
就会相应的拉取了该版本的 Tomcat 镜像.
拉取成功之后, 我们要查看我们拉取的版本, 可以用命名:
docker images
可以看到, 镜像列表里已经有了我们要拉取的 Tomcat 镜像
镜像的使用
镜像拉取下来之后, 就如我们把从网上把下载到了本地电脑, 但是没有任何生命的迹象, 只有把它安装运行起来, 才是一个活的容器, 相应地, docker 镜像只有在 run 起来的时候, 才是一个有生命的容器.
创建和运行一个 Tomcat 容器只需要一行命令:
docker run --name my_tomcat tomcat:8.5
其中 --name 是指给容器起的名字, 后面的 tomcat 是指下载的惊喜的 NAME.8.5 是镜像 TAG.
到这里, 一个 tomcat 服务就安装并且启动好了, 因为默认的 Tomcat 端口都是 8080, 因此通常情况下此时我们用 ip:8080 就应该可以访问到 Tomcat 的标志性主页了.
但是!!!
事实并不是如此
因为我们是在 docker 下运行的容器, 你们的脑海中可否还有 docker 的 logo 图?
大海就相当于我们的服务器 (宿主机), 而在海中游走的鲸鱼就是 docker 服务, 而鲸鱼上的每一个集装箱都是一个容器, 也就是说:
容器之间是互相隔离的, 容器和宿主服务器也是互相隔离的.
因此我们在 docker 中运行了一个 Tomcat 的服务器, 虽然端口是 8080,
但是~
那是容器中的 8080 端口, 因此我们通过 ip:8080 访问到的其实只是宿主机上的 8080 端口, 并不是容器中的端口.
此时我们只需要把容器中的端口映射到宿主机上相应的端口即可.
端口映射只需要在运行时加入指令 -p 映射的宿主机端口: 容器运行端口
如下, 把容器运行的 8080 端口映射到宿主机的 8099 端口:
名称设置为 my_tomcat_1
docker run -p 8099:8080 --name my_tomcat_1 tomcat:8.5
此时, 你会发现, 控制台打出了 Tomcat 启动的日志, 启动完成后, 我们在浏览器上用 ip:8099 访问, 就会发现, Tomcat 主页就显示了, 说明 Tomcat 已经正确地运行起来了.
而用命令也可以查看容器是否起来, 我们用 docker ps 能查出本 docker 中运行的多有容器:
docker ps
在 Tomcat 运行的情况下, 当你用 ctrl+c 回到命令行输入 docker ps 时, 发现并没有找到 my_tomcat_1 这个 Tomcat 容器, 而你重新用 ip:8099 发现 Tomcat 也不见了
噢 no!
什么原因?
这是因为: 在 Linux 下用指令的方式运行程序, 如果没有加后台执行的指令, 那么在切回到命令时, 程序就被杀死了.
因此, 此时是因为我们运行 Tomcat 容器时, 没有设置在后台运行, 因此, 需要在运行时, 加上后台运行的指令, 在 docker 中设置后台运行只需要在 run 命名中加入 - d 即可.
因此我们重新运行 Tomcat, 名称设置为 my_tomcat_2:
docker run -d -p 8099:8080 --name my_tomcat_2 tomcat:8.5
运行完成后, 此时我们放心大胆的回到命名行. 重新执行 docker ps
看控制台的输出:
可以看到: my_tomcat_2 已经在运行, IMAGE 代表所用镜像以及镜像版本, PORTS 显示的是 0.0.0.0:8099->8080/tcp . 代表的是把本机的 8080 端口映射到宿主机上的 8099 端口中.
但是, 有读者又有疑问了:
"Tomcat 是运行了, 那我怎么把我的项目丢进去 docker 的 Tomcat 中呢? 我用 FTP 工具链接到服务器上也找不到 Tomcat 在哪里, 怎么办?"
上面提到, docker 中容器和宿主机是互相隔离的, 因此容器是不会在宿主机中有明确的文件夹路径, 所以找不到才是对的.
但是既然端口都能映射, 为啥文件夹不能映射呢?
在 docker 中, 可以用 -v 指令指定把容器中的某个文件夹挂载到宿主机中
它的语法为:
-v 宿主机目录: 容器目录
所以我们可以在创建运行一个容器时, 同时可以把指定的文件夹挂载到宿主机中
通常情况下, Tomcat 运行程序的文件是在 webapps 下的, 那么可以在运行时把这个文件夹挂载到宿主机某个路径上 (如:/data 目录中),
名称设置为 my_tomcat_3, 端口设置为 8098, 要把容器中的 webapps 文件夹挂载到宿主机中 / data/my_tomcat_3/webapps 文件夹:
docker run -d -p 8098:8080 -v /data/my_tomcat_3/webapps:/usr/local/tomcat/webapps --name my_tomcat_3 tomcat:8.5
此时我们再用 FTP 工具链接到宿主机服务器上, 进入 data 文件夹, 就会发现: my_tomcat_3/webapps 文件夹已经躺在里边了, 可见已经挂载成功.
把文件夹挂载成功之后, 此时我们把 Web 项目丢到宿主机中的 webapps 下, 重启 Tomcat 容器后, 再用 ip:8099 访问, 就会展示我们的 Web 项目的内容了.
到这里, docker 中用 Tomcat 运行 Web 项目的工作已经完成.
但是, 回过头来想想, 留下很多问题:
docker run 是创建并且运行容器, 那我怎么控制容器的状态呢? 比如启动和停止
为什么我在 docker run 时一直在重命名 Tomcat 的名字 my_tomcat_1,my_tomcat_2,my_tomcat_3..
拉取和运行了那么多镜像, 占据很多磁盘空间, 怎么处理?
运行后的 Tomcat, 怎么查看日志?
我想要修改一下 Tomcat 中的 server.xml 的设置, 但是宿主机中有没有这个文件, 难道我要挂载出来吗?
看完此文之后, 你有什么问题吗? 欢迎读者把问题后台留言给小编或者加小编的微信, 下一篇文章, 小编会针对上面的问题以及读者提出的问题, 做一个完整的解答以及把如何做好的 Tomcat 上传到镜像仓库做一个演示, 所以:
关! 注! 我!
下期小编甚至会把常用的一些 docker 命名整理出来, 方便大家集中记忆和使用!
觉得本文对你有帮助? 请分享给更多人
关注「编程 ***」, 提升装逼技能
<br>
来源: http://www.bubuko.com/infodetail-2928489.html