Docker / OSX快速入门

Docker / OSX快速入门

目录

Docker / OSX快速入门

在Mac上安装

Boot2Docker

关于容器的一个注意事项

一个例子:Python Flask App

运行

在AWS上运行相同的容器

更多东西


 

 

本文章向大家介绍Docker / OSX快速入门,主要内容包括在Mac上安装、Boot2Docker、一个例子:Python Flask App、在AWS上运行相同的容器、更多东西、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

 

Docker(容器技术)始于2013年,自那时起我便经常可以看到有关docker的消息。之前我已经尝试过docker的入门例子,但我觉得自己没有真正理解docker技术的价值所在以及docker容器是如何运行的。在这周,当我花了一些时间去研究docker之后,发现它并没有我之前想得那样神秘和复杂。

在Mac上安装

Docker技术脱胎于Linux,使用像LXC(linux container)这样的内核虚拟化技术作为运行的基础。docker还有一个Windows的版本(然而并没有多少人关注)。鉴于湾区的软件工程师们主要使用Mac作为工作机器,所以我们首先看看如何在OSX上安装并运行docker。

首先,不要尝试使用brew或其他软件包管理工具来安装docker。它是用Go编写的,Go编译生成的二进制文件具有不需要其他外部依赖即可运行的优点。此外,这个项目进展之快以至于软件包管理器中的版本都过时了。所以,放弃之前的方法然后通过下载docker可执行文件手动安装它。

手动安装之后如果你可以打开一个终端并执命令docker --version,那么恭喜你完成了第一步。

注:本教程适用于docker 1.5.0版本。

Boot2Docker

如果你现在试图运行一个docker镜像,你会得到一个像这样的神秘错误docker max dial unix /var/run/docker.sock: no such file or directory。这是因为Docker守护进程没有运行。事实上,它不能在Mac上运行!因此,您必须使用boot2docker,这是一个在VirtualBox中运行并具有Docker守护进程的小型虚拟机。再次使用二进制安装程序安装boot2docker。

要启动并运行,请打开终端运行以下命令。

boot2docker init
boot2docker up
eval "$(boot2docker shellinit)"
docker run ubuntu:14.04 /bin/echo 'Hello world'

这就是"Hello world"的例子。让我们来看看这里发生了什么。boot2docker init在VirtualBox中创建一个新的虚拟机:

下一步,boot2docker up运行这个虚拟机。eval "$(boot2docker shellinit)"设置一些环境变量,告诉Docker你当前在哪个环境中运行。如果单独执行boot2docker shellinit,你可以看到原始输出:

Writing /Users/chase/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/chase/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/chase/.boot2docker/certs/boot2docker-vm/key.pem
export DOCKER_HOST=tcp//192.168.59.104:2376
export DOCKER_CERT_PATH=/Users/chase/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1

前三行只是提示信息,只有最后三行输出到stdout(标准输出)。

最后一条命令docker run ubuntu:14.04 /bin/echo 'Hello world'实际上实例化了一个新的Docker容器(基于Ubuntu 14.04镜像),并在其中运行一个命令。

关于容器的一个注意事项

容器是微型虚拟化linux的实例。镜像是容器从其中分离出来的序列化定义文件。Docker的神奇之处在于这些镜像是完全可移植的。这个概念起初迷惑了我,我最初的想法是你需要在你的Mac上建立一个镜像配置并运行你需要的东西,然后在Amazon EC2上建立一个镜像,在重新配置运行同样的东西。

实际上,您可以在Mac上构建一个映像,配置好之后使用scp将该文件移动至AWS上直接运行即可。如果通过Docker Hub您甚至不需要手动复制它。

此外,在Docker容器中使用的Linux发行版不必与主机操作系统的发行版相匹配。你可以在CentOS主机中运行Ubuntu,反之亦然。

最后,镜像具有内置的分层机制。你可以以一个镜像为基础,在这个基础上修改,然后这些小修改会形成差异层的累积。这是一个强大的优化和抽象,我们将在后面讨论。

一个例子:Python Flask App

这是在docker中使用python的一个经典教程,但是我查阅了所有我能找到的文档也没有完成教程中的内容。这是我依据自己的情况完成的特殊版本:

首先,创建一个名为flask的新目录。并在这个目录下创建三个文件:

第一个文件名为app.py,这是一个简单的Flask示例应用程序。

from flask import Flask
import os
app = Flask(__name__)@app.route('/')
def hello():return "Hello World!"if __name__ == "__main__":app.run(host="0.0.0.0",debug=True)

然后,创建一个requirements.txt文件写入Flask作为依赖项:

Flask==0.10.1

最后,创建你的Dockerfile

FROM Python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python app.py

让我们花点时间分析这最后一个文件。第一行FROM指示Docker从容器公用存储库中调出python的镜像,并使用标签(如2.7)指定镜像版本。

第二行ADD将您的代码从当前目录复制到Docker容器的/code目录中。第三行WORKDIR设置/code为工作目录。

RUN可以多次使用,它告诉Docker在第一次构建容器时运行这些命令。运行步骤会被缓存,以后改变其中一个只会导致改变的那个再次运行。这应该是由于我们之前提到的容器分层。

EXPOSE告诉Docker该容器将开放5000端口提供服务,这是我们将运行Flask应用程序的端口。

最后,CMD指定将作为主守护进程在容器内运行的命令。如果您需要运行多个守护进程,请查看docker-compose。

运行

要运行该示例,请执行以下命令:

open "http://$(boot2docker ip):5000"
docker build -t flask-example .
docker run -it -p 5000:5000 -v $(pwd):/code:ro flask-example

这可能在Flask应用启动之前打开浏览器并造成一个“这个网页不可用”的错误页面,但如果你现在刷新它,你应该看到浏览器输出的"Hello World!" 文本。

上面你所做的就是创建一个名为flask-example的镜像并运行它。你甚至可以编辑本地文件系统上的代码,它会在Docker中同步(感谢-v(-v参数会指定容器和主机共享的目录)),修改Flask将自动重新启动。

在AWS上运行相同的容器

现在,我们来看看如何在AWS上运行同一个容器。首先请注册Docker Hub,这是免费的。

假设你的Docker Hub用户名是foobar。首先,重新构建并在docker hub上发布您的镜像:

docker build -t foobar/flask-example .
docker login
docker push foobar/flask-example

现在,创建一个新的EC2实例,确保使用"Amazon Linux"作为基础映像,这将使安装Docker变得更容易。SSH到你的实例并运行docker容器:

sudo yum install -y docker ; 使用最高权限安装并启动docker服务
sudo docker run -it -p 8000:5000 foobar/flask-example

第一行简单地安装Docker并启动它。第二行从Docker Hub下载镜像(注意:不需要验证!)并在交互式shell中运行它,并将主机EC2实例上的外部端口8000映射到容器内的端口5000。

如果您的安全组设置为公开端口8000,那么就应该能够在Web浏览器中使用这个EC2的ip加上端口号8000打开这个Flask应用。

更多东西

当我开始做这件事的时候,我犯了一个错误:试​​图在我对docker还没有一个清楚的理解的时候就使用docker-composedocker-machine,这些是官方插件,分别简化了Docker中多服务和多机器功能的配置。我建议在你有了上面的基础知识之前不要看这些东西。在一开使就看这些使我对docker更加困惑了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11范围for

在C98中,不同的STL容器和C风格数组的遍历方式各不相同,写法也不统一,而且不够简洁。而C11基于范围的for循环可以简洁并且统一的方式遍历STL容器和C风格数组。 在介绍for循环新的语法之前,简单来看一下for循环之前遍历STL容器的例…

力扣:149. 直线上最多的点数(Python3)

题目: 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱…

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…

农业中的机器学习

机器学习训练模型推荐: UnrealSynth虚幻合成数据生成器 - NSDT 机器学习是一个不断发展的领域,在农业中有许多潜在的应用。农民和农业科学家正在探索如何转向机器学习开发来提高作物产量、减少用水量和预测病虫害。未来,机器学习可以帮助农民…

相对位置编码RPE:桶的数量

在相对位置编码中,"桶"指的是一种将不同的相对位置映射到一个有限数量的离散区间的方式。这个离散区间的数量通常由"桶的数量"来表示。在编码相对位置时,相对位置的值会被分配到不同的桶中,以便在有限的编码空间中表示无…

Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的12864LCD液晶显示电话拨号键盘按键实验(完整仿真源文件及代码见文末链接) 仿真图如下 本设计主要介绍计算器键盘仿真,按键按下后在12864液晶上显示对应按键键值 仿真运行视频 Proteus仿真--12864LCD显示计算器…

设计模式_访问者模式

访问者模式 介绍 设计模式定义案例问题堆积在哪里访问模式访问模式是行为型设计模式 从对象中分类出算法 这些算法封装为对象, 这样这些算法类很容易扩展,添加新的算法类就可以了不同的VIP用户 在不同的节日 领取不同的礼物if else太多 解决办法小技巧…

[自定义 Vue 组件] 小尾巴顶部导航栏(2.0) TailTopNav

文章归档:https://www.yuque.com/u27599042/coding_star/oglrqteg8fzvvzn0 [自定义 Vue 组件] 响应式顶部导航栏(1.0) TopNav:https://www.yuque.com/u27599042/coding_star/hzltsltxgavwx8u2 组件效果示例 组件所依赖的子组件 [自定义 Vue 组件] 小尾巴…

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述(297.1) 课程要求:C语言熟练,提前学完 C51 2. 开发软件Keil5的安装(298.2) 开发环境的安装 编程语言:C语言需要安装的软件有两个:Keil5 和 STM32CubeMX Keil5 的安装…

读书笔记:彼得·德鲁克《认识管理》第3章 西尔斯公司

一、章节内容概述 与其他美国大型企业相比,西尔斯公司的成就更加令人瞩目、更加长盛不衰。然而,当没有任何邮购经验的芝加哥服装商人罗森沃尔德 1895年进行收购时,该公司已濒临破产。罗森沃尔德深入思考了公司的 业务,并询问下列…

android display 杂谈(三)WMS

用来记录学习wms,后续会一点一点更新。。。。。。 代码:android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中,调用run方法。 private void run() { // Initialize native services.初始化服务,加载andro…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

【持续更新】Mybatis常用代码汇总

目录 通用 #{} 和 ${} 返回类型 查询 sql处理 in数组处理 if语句 choose when association 一对一关联查询 日期格式 通用 #{} 和 ${} 在MyBatis 的xml映射配置文件中&#xff0c;动态传参有#{}和${}两种方式 1&#xff09;#{}&#xff1a;动态解析 -> 预编译…

什么是缓冲区溢出?

缓冲区溢出 1. 什么是缓冲区溢出2. 缓冲区溢出攻击的类型3. 攻击者如何利用缓冲区溢出4. 如何防止缓冲区溢出攻击 1. 什么是缓冲区溢出 &#xff08;1&#xff09;缓冲区 缓冲区是一块连续的计算机内存区域&#xff0c;用于在将数据从一个位置移到另一位置时临时存储数据。这…

【Spring Security】Spring Security 前后端分离认证

我们初步引入了Spring Security&#xff0c;并使用其默认生效的HTTP基本认证来保护URL资源&#xff0c;本章我们使用表单认证来保护URL资源。 前后端分离模式 表单登录配置模块提供了successHandler&#xff08;&#xff09;和failureHandler&#xff08;&#xff09;两个方法…

2023-2024 中国科学引文数据库来源期刊列表(CSCD)

文章目录 CSCD来源期刊遴选报告2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09; CSCD来源期刊遴选报告 2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09;

数据结构与算法(Java版) | 排序算法的介绍与分类

各位朋友&#xff0c;现在我们即将要进入数据结构与算法&#xff08;Java版&#xff09;这一系列教程中的排序算法这一章节内容的学习中了&#xff0c;所以还请大家系好安全带&#xff0c;跟随我准备出发吧&#xff01; 相信诸位应该都知道排序算法有很多种吧&#xff01;就算没…

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 这里以win10系统为例进行说明: 如下图所示,打开右下角的“网络和Internet设置”, 如下图所示,点击进入“更改适配器选项”, 如下图所示…

Leetcode—110.平衡二叉树【简单】

2023每日刷题&#xff08;十九&#xff09; Leetcode—110.平衡二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int preFunc(struct TreeNode* root) {if(root…

leetcode-887-鸡蛋掉落(包含最大值最小化,最小值最大化的二分优化+滚动数组的原理)

这里写目录标题 题意解题KNN复杂度DP解法思想&#xff08;超时&#xff09;上述方法的优化 &#xff08;最大值最小化二分优化&#xff09;完整代码 逆向思维的DP&#xff08;ksqrt(n)复杂度&#xff09;代码空间优化&#xff08;滚动数组&#xff09;代码 题意 链接&#xff…