返回介绍

9.1 使用 Docker

发布于 2025-04-26 13:26:35 字数 5937 浏览 0 评论 0 收藏 0

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。