硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

“救世主”Docker

  • 2021-04-09
  • 本文字数:2849 字

    阅读完需:约 9 分钟

“救世主”Docker

本文最初发布于 towards data science 博客,经原作者授权由 InfoQ 中文站翻译并分享。

前言

在一个快速变化的环境中工作,越来越多的工具以开源的方式发布,我的笔记本电脑已被我搞得一团糟。我安装了大量的应用程序,却忘了清理它们。类似地,我也用 Python 做过一些事情——没有虚拟环境,所以基本上,很多库分散在笔记本电脑上的各个地方。


最初,我的解决方案是从笔记本电脑中删除 Python 和所有其他杂七杂八的东西。但后来我发现,如果我为一篇博文或与工作相关的事情做 PoC,最终也会遇到同样的情况。然后我找到了 Docker。我花了一段时间弄明白了它的工作原理,以及自己该如何利用它。

准备工作

如果想跟着我做,那么你应该做好以下准备工作:


  • 官网下载 Docker

  • 某种 IDE,或者使用终端或 Jupyter Notebooks

理解 Docker 是什么

那么,Docker 是什么?这个魔术大师是怎么解决我的问题的?


Docker 是一个平台。你可以创建一个特定的配置包,并在你自己的隔离环境(我们称之为容器)中运行它。在某种程度上,容器与虚拟机非常相似。你可以轻松创建一个轻量级容器,其中仅包含一些相关的库和应用程序,并在其上运行代码。如果你决定与别人分享代码,则只需要分享 Docker 镜像。


那么镜像又是什么?一些用来设置容器的指令,其中包含所有的配置,以及工作目录中的相关文件。


因为它是一个平台,所以我们有一个服务器-客户端关系。


  • 客户端——最有可能是 CLI,用于和 Docker 引擎交互;

  • 服务器——在 Docker 引擎中编排和映射不同的东西;

  • 注册中心——存储 Docker 镜像的地方,后续可以被其他用户拉取。


好了,理论讲够了,我们来实践一下。

开始

好了,首先检查下 Docker 版本:



如果看到任何 Docker 版本输出,就可以开始了。


如果你多少了解一些终端的基本知识,那么你可能很熟悉下面这条命令:


ps
复制代码


这条命令会列出所有运行中的进程及其 PID。Docker 也提供了类似的命令:



可以看到,正在运行的 Docker 进程数为 0。如何让 Docker 进程运行起来呢?可以像下面这样:



让我们分别做下说明:


  • docker—— 在 Docker 上运行;

  • run—— 创建/拉取并运行容器;

  • hello-world—— 要加载到容器的镜像。

Postgres 数据库

假如我们要运行 Postgres DB 来做一些 PoC。为此,我们需要完成以下工作:


  • 在 Docker Hub 或我们的私有库中找到相应的 Docker 镜像;

  • 确定我们将要使用的版本;

  • 在 Docker 上运行它。

步骤 1

如果我们在谷歌上搜索 docker Postgres,那么最上面就是指向 Postgres 镜像的 Docker Hub链接。从中我们可以看到关于该镜像的大量信息及其用法。

步骤 2


我们看到,这里有 13.2、13、latest、13-alpine。这是什么意思呢?


举例来说,数字 13.2 表示一个特定的 Postgres 版本。Latest 指最新版本,如果有新版本,就会更新。最后但同样重要的是 alpine 版本。Alpine 版本是应用程序运行所需的最基本的框架。Alpine 版本会尽可能轻量化,它只包含必要的部分,比其他版本小。使用 alpine 的好处是可以最低限度地添加相关的东西。这样可以保证 Docker 容器尽可能小,易于移动和部署。


我们选 13.2。

步骤 3

执行以下命令:


docker run postgres:13.2
复制代码



好吧,有东西没运行,让我们看下出了什么问题——我们需要通过**-e**(是指环境变量)传入密码:



我们看到,终端进入运行进程模式,要在同一个会话中执行某些操作,就需要终止 Postgres 进程。有一种方法可以让我们在同一个终端会话上运行 Postgress docker 进程,并做一些事情。我们可以使用**-d**来运行分离式进程。



上述命令返回了一个长字符串。该字符串是 Docker 容器的 ID。如果运行 docker ps,就可以看到 Docker 容器已经启动并运行:



可以看到,命令 docker ps 返回的容器 id 和 docker run 返回的容器 id 不一样。仔细看下可以发现,docker ps 返回的字符串是那个长字符串的子串。Docker 很酷的一点是,它匹配容器 id 的开头,你不需要粘贴其完整版本!


但等一下,我不是说 Docker 是个隔离的环境吗?是的。我们不会对数据库做任何事情,因为我们没有公开任何可以用来与它交互的端口。要做到这一点,我们需要借助**-p**:


docker run -e POSTGRES_PASSWORD=myplaintextpassword -p HOST_PORT:DOCKER_CONTAINER -d postgres:13.2
复制代码

Dockerfile

好了,现在你可能会问,为什么这个家伙要向我解释如何输入这么一长串命令来运行一些隔离的东西,重复而乏味。我如何分享它?把命令发给下一个人?那并不是十分有效…


是的,玩一下可以,但要创建一个环境,这就不合适了。这就是为什么要有 Dockerfile。


基本上,Dockerfile 就是所有这些环境变量映射出来的指令。因此,对于 Postgres,可以创建这样一个 Dockerfile:



要进行构建,在 Dockerfile 所在的文件夹下运行如下命令:


docker build .
复制代码


输入如下所示:



bd9416c1457a 是新构建的 Docker 镜像的 id。现在,我们可像下面这样运行容器了:



值得一提的是,Docker 在每一步构建 Dockerfile 时,都会创建一个新的 Docker 镜像并将其传递给下一步。所有这些镜像都保存在缓存中,如果有需要就可以重用它们,例如,在末尾添加一个新的环境变量:



它的好处是,如果我们只在末尾做了修改,就可以更快地构建镜像。我们只需要从头开始构建新添加的部分!不过,如果我们要改变密码和用户名的位置,就不得不重新构建镜像了:


与容器交互

如果你希望优雅地关闭容器,可以使用如下命令:


docker stop CONTAINER_ID
复制代码


你也可以使用如下命令杀掉它:


docker kill CONTAINER_ID
复制代码


稍后,你可以使用如下命令查看已经停掉的进程:



如果要恢复容器,则可以通过以下命令:


运行多个 Docker 进程

好了,运行一个 Docker 进程很简单;我们创建一个 Dockerfile 并运行它。如果我另外还需要一个进程,我也可以创建并运行它。但这很快就会失去控制,因为每个 docker run 都需要设置端口和其他信息。


对于这种情况,可以使用 docker-compose

Docker compose

这是一个 YAML 文件,关于构建内容以及如何使用多个不同的 Dockerfile,其中包含了更多的信息。



让我来介绍一下:


  • version—— Compose 文件格式的版本。对照Docker文档,看下你的 Docker 引擎是否兼容;

  • app —— 使用一些预定义 Docker 镜像(即 airflow)的应用程序/服务,8080 端口映射到本机的 8080 端口;

  • db —— 一个数据库应用程序,我们将使用数据库目录下的 Dockerfile 把它容器化。


如果我们已经有这个文件了,该如何构建呢?如果已经在这个目录下,则可以执行以下命令:


docker-compose up -d --build
复制代码


此外,你也可以指定这个文件的完整路径:


docker-compose -f "PATH/YOU/HAVE/PUT/DOCKERCOMPOSE/FILE/docker-compose.yml" up -d --build
复制代码

总结

Docker 简化了开发工作。创建一个镜像,在上面运行你的应用,看看它是否可以工作。


我之所以使用 Docker,有以下几个方面的考虑:


  • 需要一个隔离的环境来进行基准测试/测试等(借助 GitHub Actions 和 Travis,你可以在 Docker 镜像中测试你的应用);

  • 测试版本升级,看看是否造成了什么破坏;

  • 如果你懒得清理本机环境,它就会变得一团糟。


顺便说一下,代码托管在GitHubhttps://github.com/TomasPel/workshops/tree/main/docker_101)上,你可以在 Jupyter Notebook 中交互式地运行它并查看结果。


原文链接:


https://towardsdatascience.com/docker-101-ee3d2b8ace11

2021-04-09 10:002991
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 587.7 次阅读, 收获喜欢 1981 次。

关注

评论

发布
暂无评论
发现更多内容

HarmonyOS音频开发指导:使用AVPlayer开发音频播放功能

HarmonyOS开发者

HarmonyOS

高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来

GPU算力

深入理解 Netty FastThreadLocal

vivo互联网技术

性能优化 Netty ThreadLocal 内存泄漏 FastThreadLocal

万字长文:拆解银行数智运营之困!

京东科技开发者

人工智能 数字化转型 金融 企业号10月PK榜

管控变更对提升质量的重要性

老张

质量保障 配置管理

OpenHarmony持久化存储UI状态:PersistentStorage

OpenHarmony开发者

OpenHarmony

浅析“代码可视化” | 京东云技术团队

京东科技开发者

架构 字节码 企业号10月PK榜 代码可视化

和鲸ModelWhale与中科可控X系列异构加速服务器完成适配认证,搭载海光芯片,构筑AI算力底座

ModelWhale

gpu 服务器 信创 算力 数据科学

梦幻西游手游详细图文架设教程

echeverra

梦幻西游

哪家堡垒机支持国密算法?有哪些功能?

行云管家

运维 堡垒机 安全运维 国密浏览器 国密算法

如何修改模型粗糙度增强模型表面粗糙度

3D建模设计

3D模型 粗糙度

即刻报名,企业服务与新经济论坛亮点提前揭秘!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

云计算进入 AI 原生时代

Baidu AICLOUD

大模型 RDMA AI 原生云

峰会倒计时 3 天!互联网与文娱论坛演讲亮点预告!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

正确选择数据库安全运维平台的几个原则-行云管家

行云管家

数据库 数据安全 数据库安全 安全运维

如何按照固定比例缩放模型

3D建模设计

3D模型 等比缩放

产品需求交付质量保证的“七重门” | 京东云技术团队

京东科技开发者

测试 交付质量 企业号10月PK榜

研发日常踩坑-Mysql分页数据重复 | 京东云技术团队

京东科技开发者

MySQL 数据库 分页 企业号10月PK榜

即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换

JackJiang

网络编程 即时通讯 IM

选择香港服务器发展线上业务的未来趋势:技术与市场的变化

一只扑棱蛾子

香港服务器

如何给模型换色

3D建模设计

3D模型 颜色 材质

cpu温度监测推荐 Turbo Boost Switcher Pro激活最新版

胖墩儿不胖y

Mac软件 温度监测工具

腾讯云入选2023 Gartner分布式混合基础设施魔力象限

极客天地

如何合并模型对象

3D建模设计

模型 3D

不会写代码同学的福音——AI 代码生成器 Amazon CodeWhisperer(通过注释写代码)

亚马逊云科技 (Amazon Web Services)

人工智能 CodeWhisperer Amazon Lambda 云上探索实验室

想让你的代码简洁,试试这个SimpleDateFormat类高深用法

华为云开发者联盟

Java 后端 开发 华为云 华为云开发者联盟

对话在行人|九州通:携手用友打造招聘共享中心实现招聘数智化

用友BIP

2023全球商业创新大会 对话在行人

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]

汀丶人工智能

ES 向量检索 搜索系统 语义搜索

瑞技伙伴 | ZPE 带外管理方案,稳固您的IT世界

Bytebridge

数据中心 带外管理方案 ZPE

“救世主”Docker_AI&大模型_Tomas Peluritis_InfoQ精选文章