热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker简单安装与应用入门教程

这篇文章主要介绍了Docker简单安装与应用,结合实例形式分析了Docker常见的安装、应用构建、终端访问等操作相关实现技巧与注意事项,需要的朋友可以参考下

本文实例讲述了Docker简单安装与应用。分享给大家供大家参考,具体如下:

作为一个初次接触Docker的人来说,最大的问题是Docker是什么?Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。比如,我们在笔记本上编译测试通过的容器可以批量地在生产环境中部署,可以用于自动化测试和持续集成、发布。

还可以用于web应用的自动化打包和发布;在服务型环境中部署和调整数据库或其他的后台应用;从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

在Mac下安装Docker

打开Docker下载网址下载稳定版本,并安装和运行Docker。顶部状态栏中的鲸鱼指示Docker正在运行,并可以从终端访问。

点击顶部状态栏中的鲸鱼,选择About Docker以验证是否有最新版本。

运行这些命令来测试docker、docker-ompose、docker-machine版本是否是最新的,并且和Docker.app兼容。

$ docker --version
$ docker-compose --version
$ docker-machine --version

打开一个命令行终端,你可以运行一些Docker命令来验证Docker是否正常工作。比如使用docker version来检查你是否安装了最新版本,使用docker ps来列出正在运行的容器,使用docker run hello-world运行示例程序。

使用docker run命令可以启动一个新容器,这种单一的命令将触发安装运行序列:先在本机寻找该镜像,如果本机找不到就去Docker Hub下载这个镜像,并把镜像加载到容器中,然后启动该程序,这样容器就运行起来了。其他系统可以参考官网文档安装。

Docker示例项目

现在开始使用Docker构建应用程序,从Docker应用程序的层次结构底部开始,应用程序是一个容器,在这个层次上面是一个服务,它定义了容器在运行时的行为方式,最后,在顶层是堆栈,定义了所有服务的交互。

在过去,如果要开始编写一个Python应用程序,第一步就是在机器上安装一个Python运行库,但是,这会造成应用程序只能在您的机器运行。使用Docker可以将一个可移植的Python运行时环境作为一个镜像来获取,无需安装。然后构建可以将基础Python镜像与应用程序代码一起包括在内,确保您的应用程序、依赖项和运行时环境都一起移动。

这些可移植的镜像是由一个叫做Dockerfile的东西来定义的。

用Dockerfile定义容器

Dockerfile将定义容器内的环境中发生了什么,访问像网络接口和磁盘驱动器这样的资源是在这个环境中虚拟化的,这个环境与系统的其他部分是隔离的,所以必须将端口映射到外部世界,并具体说明想复制哪些文件到那个环境。完成这些工作后,这个Dockerfile中定义的应用程序在任何地方运行都将有完全相同的表现。

创建一个新的目录,在新目录下创建一个名为Dockerfile的文件,将以下内容复制并粘贴到该文件中保存。

# 使用官方的Python运行时环境作为父镜像
FROM python:2.7-slim
# 将工作目录设置为“/app”
WORKDIR /app
# 将当前目录内容复制到“/app”的容器中
ADD . /app
# 安装requirements.txt中指定的所有需要的软件包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 将端口80映射到外部世界
EXPOSE 80
# 定义环境变量
ENV NAME World
# 容器启动时运行app.py
CMD ["python", "app.py"]

创建并编辑应用程序

创建requirements.txt文件,并放在与Dockerfile相同的目录下。

Flask
Redis

创建app.py文件,并放在与Dockerfile相同的目录下。

from flask import Flask
from redis import Redis, RedisError
import os
import socket
# 连接到Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
  try:
    visits = redis.incr("counter")
  except RedisError:
    visits = "cannot connect to Redis, counter disabled"
  html = "

Hello {name}!

" \ "Hostname: {hostname}
" \ "Visits: {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)

很简单的就完成了应用程序部分,当Dockerfile被内置到镜像中时,由于DockerfileADD命令,app.pyrequirements.txt将会出现,并且app.py的输出将可以通过HTTP访问,这要归功于EXPOSE命令。

构建应用程序

打开一个命令行终端,确保仍然在新目录的顶层,运行构建命令,这会创建一个Docker镜像。

$ docker build -t friendlyhello .

构建的镜像可以在本地Docker镜像注册表中看到。

$ docker images

运行应用程序

运行应用程序,使用-p将机器的端口4000映射到容器的已发布端口80。

$ docker run -p 4000:80 friendlyhello

现在应该看到一条消息,Python在http://0.0.0.0:80上提供应用程序,但是这个消息来自容器内部,它并不知道该容器的端口80映射到4000,因此正确的URL为http://localhost:4000

也可以在命令行终端中使用curl命令来查看相同的内容。

$ curl http://localhost:4000

这个4000:80的端口重映射是为了演示Dockerfile中的EXPOSE与使用docker run -p发布的内容之间的区别。在后面的步骤中,会将主机上的端口80映射到容器中的端口80,并使用http://localhost

在Mac下,在命令行终端中点击CTRL + C即可退出。而在Windows系统下,CTRL + C不会停止容器。因此,首先键入CTRL + C来获取提示,或打开另一个Shell,然后键入docker container ls列出正在运行的容器,接着是docker container stop 以停止容器。否则,当尝试在下一步中重新运行容器时,将从守护程序中收到错误响应。

现在以分离模式在后台运行应用程序。

$ docker run -d -p 4000:80 friendlyhello

容器正在后台运行,您还可以使用docker container ls查看CONTAINER ID。

$ docker container ls

可以看到CONTAINER IDhttp://localhost:4000上的内容匹配。现在使用docker container stop来结束进程。

$ docker container stop 9dfc794cdc52

分享镜像

为了演示镜像的可移植性,上传我们构建的镜像,并在其他地方运行它,毕竟,将容器部署到生产环境中时,需要学习如何使用注册表。

一个注册表是一个存储库的集合,一个存储库是一个镜像集合,有点像GitHub存储库,除了代码已经建立。注册表上的帐户可以创建许多存储库。Docker CLI默认使用Docker的公共注册表。在这里使用Docker的公共注册表,是因为它免费,并且是预配置的,但是有许多公共选项可供选择,甚至可以使用Docker Trusted Registry设置您自己的私有注册表。

使用Docker ID登录

如果没有Docker帐户,请在Docker官网注册一个。然后,登录到本地机器上的Docker公共注册表。

$ docker login

标记镜像

将本地镜像与注册表中的存储库相关联的符号是username/repository:tag,该tag是可选的,但推荐使用,因为这是注册管理机构为Docker镜像提供版本的机制。给存储库标记一个有意义的名字,比如get-started:part2,这会将镜像放入启动存储库,并将其标记为part2。

现在,把它们放在一起来标记镜像,使用用户名、存储库、标签名称运行docker tag image,以便镜像将上传到想要的目的地。

# 语法
$ docker tag image username/repository:tag
# 示例
$ docker tag friendlyhello john/get-started:part2

运行docker imagesdocker image ls以查看新标记的镜像。

发布镜像

将您标记的镜像上传到存储库。

# 语法
$ docker push username/repository:tag
# 示例
$ docker push john/get-started:part2

一旦完成,这个上传的结果是公开的,如果你登录到Docker Hub ,你将会看到那个新的镜像和它的pull命令。

从远程存储库中提取并运行镜像

从现在开始,可以使用docker run并使用此命令在任何机器上运行您的应用程序。

# 语法
$ docker run -p 4000:80 username/repository:tag
# 示例
$ docker run -p 4000:80 john/get-started:part2

如果镜像在机器上本地不可用,Docker将从存储库中取出。无论docker run在哪里,它都会将您的镜像、Python以及所有依赖项从requirements.txt中提取出来,并运行您的代码。它们被打包在行李箱中一起旅行,主机不需要安装任何东西,除了Docker环境来运行它。

希望本文所述对大家docker容器的使用有所帮助。


推荐阅读
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • Ubuntu 用户安装 Linux Kernel 3.15 RC1
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
老陈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有