- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
9.1 使用 Docker
使用 Docker 可以很方便地创建和管理镜像,以及管理已经生成的和正在运行的容器。
那么什么是镜像和容器呢?
镜像是一种文件存储方式,可以把许多文件做成一个镜像文件。例如可以把一个操作系统做一个 GHOST 镜像,用来重装操作系统,把一个光盘文件做成一个 ISO 镜像,等等。
容器是镜像运行的一个实例。运行一个镜像,就会生成一个容器。容器生成之后,就可以在容器中管理应用系统了。
9.1.1 Docker 安装
在 Linux 上安装 Docker,要求是 64 位系统,并且内核版本需要 3.10 以上,如果使用 CentOS,则使用 CentOS 7.0 可符合要求。可以使用下列指令查看 Linux 的内核版本:
# uname – r
如果安装了 CentOS 7.0,上述指令将返回类似如下的版本信息:
3.10.0-123.el7.x86_64
上述版本符合 Docker 的安装要求,可以使用下列指令安装。
首先编写如下内容到 docker.repo 中,以方便 yum 能找到 Docker 引擎:
#tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF # yum update # yum install docker-engine
安装完成后,可以使用下列指令启动 Docker:
# service docker start
使用下列指令可以查看 Docker 的版本信息:
# docker -v
如果启动成功,上述指令可以看到版本信息。下列是按照上面安装方法安装后查看的版本信息:
Docker version 1.8.2, build bb472f0/1.8.2
关于 Docker 的更多安装信息,可以参考其官方网站的说明: https://docs.docker.com/engine/installation/ 。
9.1.2 Docker 常用指令
Docker 启动之后,就可以使用 Docker 来创建和管理镜像了。下列指令可以测试运行一个已经存在的镜像,它将会生成一个容器并且启动它,然后执行 java–version 指令,最后停止运行的容器。
# docker run --name java8 -it java:8 java – version
运行上面指令将启动一个包含 Java:8 镜像的容器,如果本地没有这个 Java:8 镜像,将会从远程的镜像服务器中下载一个符合版本号的镜像,执行 Java 的指令打印其版本信息,然后退出容器。但是容器还存在,只是处于停止状态。上面指令将运行 Java 容器并打印出类似如下所示的版本信息:
openjdk version "1.8.0_66-internal" OpenJDK Runtime Environment (build 1.8.0_66-internal-b17) OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode)
现在,在系统中,存在一个命名为 Java8 的镜像和一个处于停止状态的容器。可以使用 Docker 的一些指令来管理镜像和容器。例如,直接运行这个容器打印出 Java 的版本信息。这个容器没有什么用途,可以将它删除,但这个 Java8 镜像在发布服务时还会用得到。
为了使用 Docker,需要学习 Docker 的一些指令。表 9-1 列出了一些主要指令的功能,将在下节结合实际操作来演示如何使用这些指令。
表 9-1 Docker 主要指令列表
9.1.3 使用 Docker 发布服务
为了方便演示,先执行如下指令停掉 CentOS7.0 的防火墙:
# systemctl stop firewalld.service #停止 firewall # systemctl disable firewalld.service #禁止 firewall 开机启动
使用第 8 章的实例工程 spring-boot-cloud,可以将各个模块的应用通过 Docker 发布。
首先,将各个模块的配置文件中有 localhsot 的改为安装了 Docker 服务的 Linux 服务器的 IP 地址,因为在测试时发现使用 localhost 连接不了发现服务器。按照 Neo4j 数据库服务器安装的情况,修改模块 data 中连接数据库的参数,按照 RabbitMQ 服务器安装的情况,修改模块 config、模块 web、模块 data 中连接 RabbitMQ 服务器的参数。
然后将整个工程重新打包,这可以在操作系统中打开一个命令行窗口,将路径切换到工程根目录中,输入下列的 Maven 指令执行打包:
mvn clean package
打包完成后,可将 jar 文件和各个模块中创建镜像的脚本 Dockerfile 上传到安装有 Docker 服务的 Linux 服务器上(实例工程的各个模块已经准备好了创建镜像的脚本,分别存放在各个模块的 docker 目录下面)。可以在 Linux 服务器中为各个模块创建一个目录,分别用来存放各个模块的 jar 和 Dockerfile 文件。例如,使用如图 9-1 所示的方式创建目录结构。
图 9-1 发布服务的目录结构
Dockerfile 是创建镜像的一个脚本文件,它的内容如代码清单 9-1 所示,这是 config 模块创建镜像的脚本,脚本首先导入 java:8 的镜像,最后使用 Java 来运行 jar。其他各个模块的 Dockerfile 跟这个差不多,只是其中的 jar 文件和 EXPOSE 设置不同而已。
代码清单 9-1 创建镜像脚本
FROM java:8 VOLUME /tmp ADD config-1.0-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 8888 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
现在以 config 模块为例,说明如何创建镜像。首先切换到上面上传的 config 模块文件的所在目录,然后执行下列指令,使用当前目录的 Dockerfile 脚本创建一个名称为 config 的镜像,镜像已包含 Java:8 的支持,指令中最后的“.”表示使用当前目录的脚本文件。
#docker build -t config .
执行上面指令的输出结果如下:
Sending build context to Docker daemon 38.57 MB Step 0 : FROM java:8 ---> de4a13c84f53 Step 1 : VOLUME /tmp ---> Using cache ---> 78fdb4381981 Step 2 : ADD config-1.0-SNAPSHOT.jar app.jar ---> 1caac40c3c4b Removing intermediate container b2ddba948d17 Step 3 : RUN bash -c 'touch /app.jar' ---> Running in f032d980aa40 ---> 2d7145d3875c Removing intermediate container f032d980aa40 Step 4 : EXPOSE 8888 ---> Running in e3c025ecb44f ---> 10f0835f36b4 Removing intermediate container e3c025ecb44f Step 5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar ---> Running in cb3982402715 ---> 46dc046aa4e3 Removing intermediate container cb3982402715 Successfully built 46dc046aa4e3
从输出结果中可以看到命令执行的步骤,最后完成的镜像 ID 为 46dc046aa4e3。使用下列指令可以查看已经创建的和存在的镜像:
#docker images
从执行结果可以看出刚才创建的镜像的名称、版本、ID、创建时间和镜像大小等信息,由于没有指定版本,所以默认生成为 latest,如下所示:
REPOSITORY TAG MAGE ID CREATED VIRTUAL SIZE config latest 46dc046aa4e3 About a minute ago 719 MB
现在可以使用下列指令来运行这个镜像,这个指令设定服务在后台运行,并将容器的内部端口 8888 映射到外部端口 8888,容器的名字也设定为 config。
#docker run --name config -d -p 8888:8888 config
只有在第一次运行服务时,才需要使用上面的指令,因为它同时会生成一个容器,所以以后需要运行服务时,只要直接启动容器即可。
使用下列指令可以查看正在运行的容器:
#docker ps
要查看正在运行的容器中服务的运行情况,可以使用下列指令来查看正在运行的服务的控制台输出日志。例如,下列指令可以查看 config 容器的输出日志:
#docker logs – f config
由于还没有运行发现服务器 discovery,从日志中可以看出输出了一些错误信息。现在先使用如下指令停止这个容器:
#docker stop config
要启动一个已经存在的容器,例如启动 config 容器,可以使用如下指令:
#docker start config
使用上面创建镜像的方法,将实例工程中的其他几个模块,按照模块的名称来命名镜像,各自创建一个镜像。实例工程中每个模块都已经提供了镜像生成脚本 Dockerfile。在下一节将介绍使用更加简便的工具来管理这些镜像及其相关的容器和服务。
所有镜像创建完成之后,使用查看镜像指令可以列出已经创建的镜像,类似于如下所示的镜像列表:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE web latest da3c3b3da46b 28 seconds ago 721.9 MB hystrix latest 2cce1f533f11 About a minute ago 685.4 MB discovery latest cbfa35ccadb9 5 minutes ago 718 MB data latest 9ddea4fd1adc 6 minutes ago 825.9 MB config latest 46dc046aa4e3 15 hours ago 719 MB
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论