适用于Java开发人员的Docker:通过命令行的Docker

本文是我们学院课程中名为《 面向Java开发人员的Docker教程 》的一部分。

在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Docker的应用程序。 我们涵盖了广泛的主题,从通过命令行的Docker到开发,测试,部署和持续集成。 通过我们简单易懂的教程,您将能够在最短的时间内启动并运行自己的项目。 在这里查看 !

目录

1.简介 2.图片 3.容器 4.端口 5.卷 6.网络 7.连结 8.健康检查 9.资源限制 10.清理 11.多合一:部署堆栈 12.结论 12.接下来是什么

1.简介

在本教程的这一部分中,我们将掌握Docker的瑞士军刀,其同名docker命令行工具以及其最好的朋友docker-compose 。 为了给这些工具一些功劳,每个工具都支持无数种不同的命令行参数和选项,因此,讨论所有这些工具将使本节无穷无尽。 相反,我们将重点放在命令的最有用的类上,指向文档的相关部分,以防您想立即学习更多。

Docker的发展非常Swift,因此docker和docker-compose也在不断变化,增加了一些新的命令行参数,而弃用了其他参数。 突破性的变化并不罕见,但这是Docker用户现在面临相当长一段时间的现实。

最近生效的最大变化之一就是命令行工具。 过去, 泊坞窗曾经接受单个命令作为第一个参数,后跟选项列表。 但是,不同命令的数量变得如此之大,以至于该工具的使用变得非常混乱和繁琐。 决定将命令拆分为类(例如imagecontainernetworkvolumepluginsystem等等),以便每个命令都以其类开头 (例如docker build变为docker image build )。 这确实是需要进行的更改,尽管仍然支持旧式的命令用法,但我们将遵循本教程中推荐的做法。

本节的结构安排使您熟悉了最有用的命令,而又没有真正深入研究细节和使用场景。 但是,背后的原理很简单,在本教程的下一部分中,我们将在做实际的事情的同时对其中大多数(如果不是全部)进行测试。

2.图片

从底部开始并通过学习如何构建映像来熟悉docker看起来是合乎逻辑的。 在本教程的第一部分中,我们简要地介绍了该过程,但是现在该使用build命令自己进行了。

docker image build [OPTIONS] PATH | URL | -

正如我们记得, 码头工人建立从图像Dockerfile秒,在它被指定的顺序执行每一条指令。 PATH或URL选项是在哪里寻找Dockerfile的提示。

为了成功使用Docker ,构建小型高效的映像并如此快速地完成是其主要目标之一。 在编写Dockerfile的最佳实践中,很好地总结了图像缓存,标记,标记,减小图像的最终大小以及许多其他主题,强烈建议您阅读此内容。

您可能很少会发现需要构建自己的基础映像,因此让我们谈谈为Java应用程序选择基础映像时我们会选择什么。

到目前为止,客观上来说, Alpine Linux是容器化应用程序的事实上的基础Linux发行版。 如果您碰巧在OpenJDK上运行应用程序,那么您真的很幸运,因为该项目的官方DockerHub存储库提供了大量基于Alpine Linux的映像。 很快,这是最简单的Dockerfile示例:

FROM openjdk:8u131-jdk-alpine
CMD ["java", "-version"]

假设您的外壳指向此Dockerfile所在的文件夹,则可以使用以下命令构建(并标记)映像:

docker image build . --tag base:openjdk-131-jdk

如果您下注Oracle JVM发行版,那么遗憾的是,尚未正式支持Alpine Linux (尽管您可能会看到有人试图将二者结合在一起,但是请注意,这是可行的,但是容器中的JVM进程可以随时崩溃)。 此处的选项可以使用官方的Oracle Java 8 SE(服务器JRE)映像,也可以基于Ubuntu或Debian发行版构建自己的映像 。

关于要构建的JVM版本,请确保至少使用Java 8 update 131或更高版本,原因是我们将在接下来的部分中详细讨论(但是,如果您很好奇,这里是先睹为快)幕 )。

除了build之外 ,还有两个非常有用的命令值得一提。 ls命令显示所有图像:

docker image ls [OPTIONS] [REPOSITORY[:TAG]]

history命令显示图像的历史记录:

docker image history [OPTIONS] IMAGE

rm命令删除一个或多个图像时:

docker image rm [OPTIONS] IMAGE [IMAGE...]

要与注册表进行交互,可以使用pull和push命令。 第一个从注册表中获取图像,而第二个则将其上载到注册表。

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
docker image push [OPTIONS] NAME[:TAG]

最后,极其有用的prune命令删除所有未使用的映像(最好始终与-a选项一起使用):

docker image prune [OPTIONS]

Docker在最新发行版中引入的极其有用的功能之一是对多阶段构建的支持,该构建允许在Dockerfile中包含多个FROM语句。 我们只是在这里提到,但是它将在本教程的后续部分中再次介绍给我们。

3.容器

容器管理在功能上构成了Docker的很大一部分,并且有很多不同的命令来对其进行备份。 让我们首先剖析超强大的run命令,它会产生一个新的容器:

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

为了感觉到它有多么简单,我们可以使用我们之前手工构建的基于OpenJDK的映像来运行容器:

$ docker container run base:openjdk-131-jdk

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (IcedTea 3.4.0) (Alpine 8.131.11-r2)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

一旦容器运行,您可以将其附加到容器上,或使用启动 / 停止 / 重新启动命令来管理其生命周期。

docker container attach [OPTIONS] CONTAINER
docker container start [OPTIONS] CONTAINER [CONTAINER...]
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
docker container restart [OPTIONS] CONTAINER [CONTAINER...]

另外,使用pause / unpause命令,您可以控制容器中进程的状态。

docker container pause CONTAINER [CONTAINER...]
docker container unpause CONTAINER [CONTAINER...]

ls命令可能是最常用的命令,因为它列出了所有正在运行的容器(并带有-a选项,所有正在运行和已停止的容器):

docker container ls [OPTIONS]

因此, 检查命令显示有关一个或多个容器的详细信息:

docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

指定stats命令以公开有关容器的运行时统计信息。 top命令显示正在运行的容器进程,而logs命令则获取容器的日志。

docker container stats [OPTIONS] [CONTAINER...]
docker container top CONTAINER 
docker container logs [OPTIONS] CONTAINER

容器在其整个生命周期中可能会经历许多修改,并且与它的基本映像大不相同。 diff命令检查容器文件系统上文件或目录的所有更改,并报告这些更改。

docker container diff CONTAINER

万一您需要捕获这些更改,可以使用方便的commit命令从容器创建一个新映像。

docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

一旦不再需要容器,可以使用rm命令将其终止。 请小心,因为容器中存储的所有数据都将丢失(除非有卷支持)。

docker container rm [OPTIONS] CONTAINER [CONTAINER...]

rm命令的更极端版本( prune命令)可批量删除所有已停止的容器。

docker container prune [OPTIONS]

4.端口

每个容器都可以通过映像Dockerfile指令或通过run命令的选项来公开端口以在运行时进行侦听。 port命令列出了容器的所有端口映射(或特定的映射)。

docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

5.卷

我们记得,容器是短暂的,一旦容器终止,它保存的所有数据都会丢失。 在许多情况下这可能不是问题,但是例如,如果您在容器中运行数据存储,则很可能希望保留数据。

为了填补这一空白泊坞介绍卷作为持续由容器中使用数据的首选机构,显然, 搬运工具有专用类的命令为( 创建 , 检查 , LS , 剪枝和RM )。

docker volume create [OPTIONS] [VOLUME]
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
docker volume ls [OPTIONS]
docker volume prune [OPTIONS]
docker volume rm [OPTIONS] VOLUME [VOLUME...]

6.网络

Docker对容器提供了很好的网络支持 ,并提供了许多可用的网络驱动程序。 当然,可以使用标准的create , inspect , ls , prune和rm命令集来管理网络。

docker network create [OPTIONS] NETWORK
docker network inspect [OPTIONS] NETWORK [NETWORK...]
docker network ls [OPTIONS]
docker network prune [OPTIONS]
docker network rm NETWORK [NETWORK...]

Docker网络的与众不同之处在于dockerd守护程序包含一个嵌入式DNS服务器,该服务器在连接到同一用户定义网络的容器之间提供名称解析(以便可以使用其名称而不是IP地址来引用这些容器)。

任何正在运行的容器都可以分别使用connect和断开连接命令连接到网络或从网络断开连接 。

docker network connect [OPTIONS] NETWORK CONTAINER
docker network disconnect [OPTIONS] NETWORK CONTAINER

除此之外,可以通过将选项传递给run命令来将容器连接到特定网络。 可以通过调用prune命令删除所有未使用的网络。

docker network prune [OPTIONS]

7.连结

您的应用程序堆栈通常由许多连接的组件而不是独立的组件组成(一个典型的例子是与MySQL数据存储通信的Java服务器端应用程序)。 将其投影到容器世界中,您将需要一组容器,这些容器可以以某种方式发现它们的上游依赖性并相互通信。 在Docker中,它以前被称为链接,但如今,可以使用用户定义的网络轻松实现(这也是推荐的做法)。

8.健康检查

通常, Docker守护程序会非常快速地配置容器,但这并不意味着包装在容器中的应用程序已准备就绪且已完全正常运行。 对于许多Docker用户而言,它曾经是最令人烦恼的问题之一,迫使社区为该问题提出许多临时解决方案。

但是对Docker团队而言,我们现在有了运行状况检查 (可以在Dockerfile中指定,也可以使用run命令的选项进行检查)。 它是一个附加的验证层,指示Docker如何测试容器内的应用程序是否正常运行。 结果导致添加了新的健康状态属性以补充常规容器状态。

9.资源限制

有趣的是,默认情况下,容器没有资源限制,并且可能会消耗其主机操作系统的所有资源。 它本来可以阻止一切,但幸运的是, Docker通过将多个选项传递给run命令,提供了一种控制特定容器可以使用的内存,CPU或块I / O的方法。 或者,对于正在运行的容器, update命令允许动态调整容器配置(主要的资源限制)。

docker container update [OPTIONS] CONTAINER [CONTAINER...]

对于在容器内运行的JVM,CPU和内存限制的主题有些棘手。 从Java SE 8u131 (肯定在JDK 9中 )开始,以及更高版本, JVM已支持Docker ,并且只需进行少量调整即可根据规则很好地发挥作用。

10.清理

到目前为止,我们已经看到了很多可以使用Docker管理的抽象。 但是,随着时间的流逝, Docker会产生大量垃圾(例如未使用的层,图像,容器,卷等),从而浪费了宝贵的磁盘空间。 多年来一直是一个已知问题,但是从不久前开始,我们就有一个专用的prune命令来清除所有未使用的数据:

docker system prune [OPTIONS]

请注意,默认情况下,除非指定了–volumes选项,否则该命令不会清除卷。

11.多合一:部署堆栈

到目前为止,您可以仅使用docker命令行工具即可完成任何任务。 但是,管理连接在一起的多个容器的生命周期将很快成为负担,并迫使您考虑自动化该过程,以及一堆shell脚本等等。

社区很早就意识到了这个问题,并提出了一个出色的解决方案, 如今被称为Docker Compose 。 简而言之, Docker Compose提供了一种声明性方式来定义然后运行多个Docker容器,从而大大简化了容器化应用程序堆栈的相当复杂的部署。

那么它是怎样工作的? 仅涉及三个简单步骤,其中一些我们已经非常熟悉:

  • 通常通过Dockerfile为您的应用程序准备映像
  • 使用docker-compose.yml规范按照容器概述堆栈
  • 使用docker-compose命令行工具将规范具体化为一组正在运行的(通常是连接的)容器

让我们快速浏览一下可想象的部署堆栈,其中涉及我们之前创建的JDK映像, base:openjdk-131-jdk和MySQL数据库映像mysql:8.0.2 ,所有这些都放入了docker-compose.yml文件中。

version: '2.1'

services:
  mysql:
    image: mysql:8.0.2
    environment:
      - MYSQL_ROOT_PASSWORD=p$ssw0rd
      - MYSQL_DATABASE=my_app_db
    expose:
      - 3306
    networks:
      - my-app-network

  java-app:
    image: base:openjdk-131-jdk
    mem_limit: 256M
    environment:
      - DB=mysql:3306
    ports:
      - 8080
    depends_on:
      - mysql
    networks:
      - my-app-network

networks:
    my-app-network:
       driver: bridge

非常简洁明了,不是吗? docker-compose.yml规范格式的版本需要特别讨论。 最新推荐的规范格式是3.x ,但是我们在上面的示例中使用的2.x 也受支持并独立发展 。 这是为什么?

3.x旨在在Docker Compose和Docker Swarm (我们将在本教程的稍后部分中简要介绍的集群解决方案)之间实现交叉兼容,但可悲的是,它还删除了一些非常有用的选项(以及其他一些选项) )。 总的来说,我们会尽可能地坚持使用3.x ,不时回落到2.x ,以展示一些真正的功能。

12.结论

在本节中,我们浏览了Docker很棒的命令行工具docker和docker-compose ,重点介绍了最有用和最重要的命令。 我们还没有看到其中的大多数动作,但是在本教程的下一部分中,每个人都将寻找时间出现在舞台上。

12.接下来是什么

尽管这些工具很可能是您处理Docker的主要方式(如果不是唯一的方式),但是在本教程的下一部分中,我们将通过利用Docker Engine REST(ful)API来学习其他选择。

翻译自: https://www.javacodegeeks.com/2017/09/docker-java-developers-docker-command-line.html

你可能感兴趣的:(网络,大数据,python,java,人工智能)