当前位置: 首页 > news >正文

在Ubuntu 16.04上安装Docker Compose的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

Docker 是一个用于自动化部署 Linux 应用程序的强大工具,它能够将应用程序部署在软件容器内,但要充分发挥其潜力,应用程序的每个组件都应该在自己独立的容器中运行。对于具有许多组件的复杂应用程序,编排所有容器一起启动、通信和关闭可能会变得非常棘手。

Docker 社区提出了一个流行的解决方案,叫做 Fig,它允许您使用单个 YAML 文件来编排所有 Docker 容器和配置。这变得非常受欢迎,以至于 Docker 团队决定基于 Fig 源代码制作 Docker Compose,而 Fig 现在已经被弃用。Docker Compose 让用户更容易地编排 Docker 容器的进程,包括启动、关闭和设置容器之间的链接和卷。

在本教程中,我们将向您展示如何安装最新版本的 Docker Compose,以帮助您管理多容器应用程序。

先决条件

要遵循本文,您需要一个安装了以下内容的 Ubuntu 16.04 服务器:

  • 一个具有 sudo 权限的非 root 用户(《在 Ubuntu 16.04 上进行初始服务器设置》解释了如何设置这一点。)
  • 通过《在 Ubuntu 16.04 上安装和使用 Docker》中的第 1 步第 2 步的说明安装了 Docker

一旦这些条件具备,您就可以开始跟着操作了。

步骤 1 — 安装 Docker Compose

虽然我们可以从官方的 Ubuntu 软件仓库安装 Docker Compose,但它的版本比最新发布的版本要落后一些,因此我们将从 Docker 的 GitHub 仓库安装 Docker Compose。下面的命令与您在发布页面上找到的命令略有不同。通过使用 -o 标志来指定输出文件,而不是重定向输出,这种语法避免了在使用 sudo 时遇到的权限被拒绝的错误。

我们将检查当前的发布版本,并在必要时在下面的命令中更新它:

sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

接下来,我们将设置权限:

sudo chmod +x /usr/local/bin/docker-compose

然后,我们将通过检查版本来验证安装是否成功:

docker-compose --version

这将打印出我们安装的版本:

docker-compose version 1.18.0, build 8dd22a9

现在我们已经安装了 Docker Compose,可以运行一个“Hello World”示例了。

步骤 2 — 使用 Docker Compose 运行容器

公共 Docker 注册表 Docker Hub 包含一个用于演示和测试的 Hello World 镜像。它演示了使用 Docker Compose 运行容器所需的最小配置:一个调用单个镜像的 YAML 文件。

首先,我们将为 YAML 文件创建一个目录并进入该目录:

mkdir hello-world
cd hello-world

然后,我们将创建 YAML 文件:

nano docker-compose.yml

将以下内容放入文件中,保存文件并退出文本编辑器:

my-test:image: hello-world

YAML 文件中的第一行用作容器名称的一部分。第二行指定要使用哪个镜像来创建容器。当我们运行 docker-compose up 命令时,它将查找我们指定的名称为 hello-world 的本地镜像。有了这个设置,我们将保存并退出文件。

我们可以使用 docker images 命令手动查看系统上的镜像:

docker images

当没有本地镜像时,只会显示列标题:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

现在,仍然在 ~/hello-world 目录中,我们将执行以下命令:

docker-compose up

第一次运行该命令时,如果没有名为 hello-world 的本地镜像,Docker Compose 将从 Docker Hub 公共仓库中拉取它:

Pulling my-test (hello-world:latest)...
latest: Pulling from library/hello-world
c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
. . .

拉取镜像后,docker-compose 创建一个容器,附加并运行 hello 程序,从而确认安装似乎工作正常:

. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .

然后它打印了它所做的事情的解释:

[secondary_label Output of docker-compose up]
1. Docker 客户端联系了 Docker 守护进程。
2. Docker 守护进程从 Docker Hub 拉取了 "hello-world" 镜像。
3. Docker 守护进程从该镜像创建了一个新的容器,运行了生成您当前正在阅读的输出的可执行文件。
4. Docker 守护进程将该输出流式传输到 Docker 客户端,后者将其发送到您的终端。

Docker 容器只在命令活动时运行,因此一旦 hello 运行结束,容器就会停止。因此,当我们查看活动进程时,列标题将会出现,但 hello-world 容器不会列出,因为它没有在运行。

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

通过使用 -a 标志显示所有容器而不仅仅是活动的容器,我们可以看到容器信息,这在下一步中会用到:

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
06069fd5ca23        hello-world         "/hello"            35 minutes ago      Exited (0) 35 minutes ago                       drunk_payne

这显示了我们在完成后需要删除容器的信息。

步骤 3 —— 移除镜像(可选)

为了避免使用不必要的磁盘空间,我们将移除本地镜像。为此,我们需要使用 docker rm 命令删除所有引用该镜像的容器,后面跟上容器的 CONTAINER ID 或 NAME。下面,我们将使用刚刚运行的 docker ps -a 命令中的 CONTAINER ID。请确保替换为您的容器的 ID:

docker rm 06069fd5ca23

一旦删除了所有引用该镜像的容器,我们就可以移除该镜像:

docker rmi hello-world

结论

我们已经安装了 Docker Compose,通过运行 Hello World 示例测试了我们的安装,并移除了测试镜像和容器。

虽然 Hello World 示例确认了我们的安装,但简单的配置并未展示 Docker Compose 的主要优势之一 —— 能够同时启动和关闭一组 Docker 容器。要看到 Docker Compose 的威力,您可能想看看这个实际示例:《如何在 Ubuntu 16.04 上使用 Docker 和 Docker Compose 配置持续集成测试环境》。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue的nextTick是下一次事件循环吗
  • 新华三H3CNE网络工程师认证—路由基础
  • springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后
  • AI与PS:技术革命下的设计工具比较
  • 数学建模之数据分析【二】:什么是数据?
  • C语言中整数类型及其类型转换
  • 用Java手写jvm之模拟方法调用指令invokexxx和方法返回指令xreturn
  • 深入解析 Nginx 反向代理:配置、优化与故障排除
  • Visual Studio vs VSCode:深入剖析两款开发工具的优劣与应用场景
  • 网络安全 - 应急响应检查表
  • 【基础算法模板】堆
  • Linux OOM Killer详解
  • pytest-bdd 行为驱动自动化测试
  • 防止老年痴呆的小学题
  • DLMS/COSEM中的信息安全:加密算法(下)2
  • 08.Android之View事件问题
  • 2017年终总结、随想
  • HTML-表单
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Objective-C 中关联引用的概念
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • STAR法则
  • 分布式熔断降级平台aegis
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 新版博客前端前瞻
  • 在Unity中实现一个简单的消息管理器
  • 最近的计划
  • Hibernate主键生成策略及选择
  • mysql面试题分组并合并列
  • 交换综合实验一
  • ​【已解决】npm install​卡主不动的情况
  • ​VRRP 虚拟路由冗余协议(华为)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (4)STL算法之比较
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (JS基础)String 类型
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ZT)薛涌:谈贫说富
  • (八)Flink Join 连接
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (离散数学)逻辑连接词
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)Python 垃圾回收机制
  • (一)Dubbo快速入门、介绍、使用
  • (一)UDP基本编程步骤
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .form文件_一篇文章学会文件上传
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 简单实现MD5
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET开源快速、强大、免费的电子表格组件
  • .Net中的集合