当前位置: 首页 > 编程日记 > 正文

Docker入门六部曲——容器

原文链接:http://www.dubby.cn/detail.html?id=8734

准备

  • 已经安装好Docker 1.13或者以上的版本。
  • 读完的上一篇文章(基本引导)。
  • 简单的测试一下你的本地环境是否已经OK了:docker run hello-world

介绍

让我们开始构建一个Docker应用吧。这篇文章介绍的是,Docker整个结构层次中最底层的一个,那就是容器。上一个层级是服务,服务定义了容器的行为,这会在下一篇文章中介绍。最后一个,也是最高的一个层级,是堆栈,定义了所有服务的交互,这在之后也会被介绍。

  • Stack(堆栈)
  • Services(服务)
  • Container(容器)——你正在看的

走进新的开发环境

在没有Docker的时候,如果你想写一个Python应用,你首先要做的是安装一个Python的运行环境。但是,你的机器的环境必须是这样,才能使得应用可以正常执行,而且,服务器也必须有这样的环境。

有了Docker,你可以直接通过镜像来获得一个Python的运行环境,不需要安装哦。然后把你的代码和这个镜像放到一起,当然还要加上你的代码所需的依赖。

这些融合在一起,就形成了一个新的镜像,定义这个融合逻辑的就是Dockerfile

使用Dockerfile来定义一个容器

Dockerfile是用来定义你的容器。对于一些资源访问,比如网卡、磁盘,在容器里都是虚拟化的,和宿主机都是隔离的,因此,你必须把容器内的资源和宿主机的资源做一个映射;还需要指定你想要把哪些文件copy到你的容器里(比如你的代码)。当然,你还希望这个写好的Dockerfile在任何地方运行都是一样的。

Dockerfile

创建一个空目录,然后在里面新建一个文件Dockerfile

# 使用Python官方镜像作为镜像的基础
FROM python:2.7-slim# 设置工作空间为/app
WORKDIR /app# 把当前目录下的文件拷贝到 容器里的/app里
ADD . /app# 安装requirements.txt中指定的依赖
RUN pip install -r requirements.txt# 开放80端口
EXPOSE 80# 设置 NAME 这个环境变量
ENV NAME World# 当容器启动时,运行app.py
CMD ["python", "app.py"]

这个Dockerfile中需要的几个文件还没有准备好,app.pyrequirements.txt,所以我们继续吧。

应用

Dockerfile同一个目录下,创建这两个文件。因为ADD命令需要把这些拷贝进容器里。而且app.py中的服务器输入端口也正好是80,这会因为配置了EXPOSE而暴露出来。

requirements.txt

Flask
Redis

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket# Connect to 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 = "<i>cannot connect to Redis, counter disabled</i>"html = "<h3>Hello {name}!</h3>" \"<b>Hostname:</b> {hostname}<br/>" \"<b>Visits:</b> {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)

可以看出,pip install -r requirements.txt安装了Flask和Redis的库,应用打印出NAME这个环境变量和socket.gethostname。最后,因为Redis没有运行(pip安装的只是使用Redis的库,并不是Redis本身),所以我们应该做尝试连接Redis,如果连接失败就打印错误信息。

注意:在容器内部访问主机名时,会检索容器的ID,类似于进程ID。

构建应用

就这样!你不需要安装Python,不需要安装requirements.txt中指定的任何依赖。看起来,你什么都没做,但是其实你已经做完了。

执行ls(默认为类Unix环境):

$ ls
➜  demo ls
Dockerfile       app.py           requirements.txt

现在来执行构建命令。这个会创建一个Docker镜像,-t可以让你给镜像自定义一个名字:

docker build -t friendlyhello .

你肯定要问要,你的镜像在哪里?他就在你的本地Docker镜像注册中心:

$ docker imagesREPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

运行你的应用

运行,当然还要映射端口号,我们需要使用-p

docker run -p 4000:80 friendlyhello

你可以看到Python启动是提醒你访问http://0.0.0.0:80。但是不要忘记这个响应是从容器内返回的哦,而我们把容器内的80端口映射到宿主机的4000端口了,所以,我们应该访问http://localhost:4000

打开浏览器,可以看到:

你也可以使用curl来看响应内容:

$ curl http://localhost:4000<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

按键CTRL+C可以退出Docker。

现在试试在后台运行这个Docker应用:

docker run -d -p 4000:80 friendlyhello

执行完后台运行的命令后,你可以获得一个容器的ID

➜  demo docker run -d -p 4000:80 friendlyhello
b0054baaca448f3b30b01004de98be45fbb9aaccd850137629220bbc730b0a1a

你也可以使用docker ps来看到缩短的容器ID:

➜  demo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
b0054baaca44        friendlyhello       "python app.py"     About an hour ago   Up About an hour    0.0.0.0:4000->80/tcp   keen_beaver

当然也可以在http://localhost:4000上看到这个容器ID。你可以使用docker stop来结束这个进程,后面要加上容器ID哦:

➜  demo docker stop b0054baaca44
b0054baaca44

分享你的镜像

为了展示Docker的便捷性,我们来尝试上传这个镜像吧,然后再证明可以run anywhere

注册中心就是一个镜像的仓库的集合——有点类似GitHub(代码仓库)。一个账号可以创建很多个仓库。docker默认情况下就是Docker公共注册中心。

我们这里使用Docker的公共注册中心,仅仅是因为他是免费而且是默认的。不过还是有很多公开的注册中心可以选择的,甚至你可以设置一个私服。

登录

如果你没有账号,那你需要先注册一个。

然后在你的本机上使用:

docker login
  • 1

给镜像打标签

镜像的标记一般这样命名username/repository:tag。tag是可选的,不过推荐使用tag,这样可以给镜像加一个版本。建议把仓库名和标签名都起得有意义一些,比如get-started:part1。这样会把镜像放到get-started仓库里,打上part1的标签。

语法是docker tag image username/repository:tag,现在开始用命令来尝试打标签吧:

➜  demo docker tag friendlyhello dubbyyoung/get-started:part1
➜  demo docker images                                        
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
dubbyyoung/get-started   part1               4ac5012183e0        4 hours ago         194 MB
friendlyhello            latest              4ac5012183e0        4 hours ago         194 MB
python                   2.7-slim            d962f7a9f2f1        2 days ago          182 MB
hello-world              latest              1815c82652c0        9 days ago          1.84 kB
➜  demo 

推送到远端

推送的命令是:

docker push username/repository:tag

我执行的结果是:

➜  demo docker push dubbyyoung/get-started:part1
The push refers to a repository [docker.io/dubbyyoung/get-started]
b57286e58751: Pushed 
7b71bca6a91c: Pushed 
cdc93fd01629: Pushed 
553c628e7577: Mounted from library/python 
8f02c55c4e74: Mounted from library/python 
15d2fe96bb43: Mounted from library/python 
0d960f1d4fba: Mounted from library/python 
part1: digest: sha256:6d816f3a86c74e8855cef96750ff1da98eb11747c4a31cbb486b92dd20e075e6 size: 1787

随时随地都可以执行了

到了这一步,你可以使用docker run在任何一个机器上运行了:

docker run -p 4000:80 username/repository:tag

如果本地没有这个镜像,Docker会自动去远端拉取:

➜  demo docker run -p 4000:80 dubbyyoung/get-started:part1* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

注意:如果你不指定标签:tag,那么缺省的就是:latest,不管是构建的时候还是运行的时候。

相关文章:

window.name实现的跨域数据传输

2019独角兽企业重金招聘Python工程师标准>>> 这篇文章是对 JavaScript跨域总结与解决办法 的补充。 有三个页面&#xff1a; a.com/app.html&#xff1a;应用页面。a.com/proxy.html&#xff1a;代理文件&#xff0c;一般是一个没有任何内容的html文件&#xff0c;需…

ajax frameworks(转贴)

Thinking in AJAX(三) —— AJAX框架汇总 引 此文原出于AJAX Patterns网站的一篇《Ajax Frameworks》的wiki文章&#xff0c;很早前我就注意到&#xff0c;后来在国内也有人翻译了&#xff0c;不过最近发现此wiki还是在不断添加维护中&#xff0c;截止此文发布前&#xff0c;作…

Maya角色面部表情动画制作视频教程 Maya: Facial Rigging

Maya角色面部表情动画制作视频教程 Maya: Facial Rigging Maya角色面部表情动画制作视频教程 Maya: Facial Rigging Maya角色面部表情动画制作视频教程 Maya: Facial Rigging MP4 |视频:h264&#xff0c;1280x720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#x…

(一三〇)UITextField的光标操作扩展

简介 在iOS开发中&#xff0c;有时候需要完全自主的定义键盘&#xff0c;用于完整的单词输入&#xff0c;例如计算机应用中&#xff0c;需要一次性的输入sin(&#xff0c;在移动光标时要完整的跳过sin(&#xff0c;在删除时也要完整的删除&#xff0c;这就需要对光标的位置进行…

android 多个占位符,Android多语言支持:由于占位符计数不同导致的字符串格式问题...

我正在制作一个法语Android应用程序,我正在努力支持英语.我使用“占位符”来格式化我的字符串,因此我可以将它们调整为男性和女性用户.例如,我的s​​trings.xml文件中的这个字符串&#xff1a;Les %1$s sont compliqu%2$ss...将成为“Les hommessontcompliqus”(“男人很复杂”…

Docker入门六部曲——Swarm

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8738 准备工作 安装Docker&#xff08;版本最低1.13&#xff09;。安装好Docker Compose&#xff0c;上一篇文章介绍过的。安装好Docker Machine&#xff0c;上一篇文章也提到了&#xff0c;Mac和Windows已经预先安装…

Ubuntu 查看磁盘空间大小命令转

df -hDf命令是linux系统以磁盘分区为单位查看文件系统&#xff0c;可以加上参数查看磁盘剩余空间信息&#xff0c;命令格式&#xff1a;df -hl显示格式为&#xff1a; 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Moun…

MSSQLid清零

truncate table [cellphone2016].[dbo].[tp_phone_9]转载于:https://www.cnblogs.com/wangchuang/p/5259615.html

Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender

Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Brellias |时长:1h 30m |视频:H264 1920x1080 |音…

Linux搜索文件&搜索文件名&替换文件内容

locate是Linux系统提供的一种快速检索全局文件的系统命令,它并不是真的去检索所以系统目录,而是检索一个数据库文件locatedb(Ubuntu系置/var/cache/locate/locatedb),该数据库文件包含了系统所有文件的路径索引信息,所以查找速度很快。time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。:快速返回某个指定命令的位置信息。

Lock和Synchronize区别详解

synchronized是Java中的一个关键字,当我们调用它时会从在虚拟机指令层面加锁,关键字为monitorenter和monitorexitLock是Java中的一个接口,它有许多的实现类来为它提供各种功能,加锁的关键代码为大体为Lock和unLock;synchronized可对实例方法、静态方法和代码块加锁,相对应的,加锁前需要获得实例对象的锁或类对象的锁或指定对象的锁。说到底就是要先获得对象的监视器(即对象的锁)然后才能够进行相关操作。

android usb 触摸屏 apk,Android插入USB设备,自动弹出提示运行apk

USB HOST模式开发下可能会遇到这个问题。第一步是在AndroidManifest.xml文件中修改,主意下面红色字体......一般调用的activity都是Main和Lanunch入口&#xff0c;加入上面的action后&#xff0c;在SDK中以Run As Android Application时&#xff0c;仅执行安装动作&#xff0c;…

sskeychain使用(轻量级框架)

原文地址&#xff1a;http://www.ithao123.cn/content-2407927.html keychain的主要功能就是帮助用户安全地记住他的密码&#xff0c;keychain保存的密码文件都是经过加密的&#xff0c;其它人不能直接通过打开keychain的文件获得保存在keychain中的密码。在mac上可以安装钥匙串…

如何在团队中做好Code Review

一、Code Review的好处 想要做好Code Review&#xff0c;必须让参与的工程师充分认识到Code Review的好处 1、互相学习&#xff0c;彼此成就 无论是高手云集的架构师团队&#xff0c;还是以CURD为主的业务开发团队&#xff0c;大家的技术能力、经验都是有差异的。 通过Code…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

2019独角兽企业重金招聘Python工程师标准>>> 转自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&am…

ubuntu18下配置VS Code

配置逻辑主要是 launch.json指定预先处理的任务(preLaunchTask)及读取build文件(program) tasks.json指定输入原始文件和输入build文件(args) 参考:https://www.cnblogs.com/JsonZhangAA/p/9750282.html launch.json中的配置 {"version": "0.2.0","co…

Blender钢铁机器人建模与动画全流程制作视频教程

Blender钢铁机器人建模与动画全流程制作视频教程 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小:15.8 GB |时长:19.5小时 使用软件&#xff1a;…

android 模板 ui布局,Android UI布局

一、线性布局-LinearLayout(至上而下布局)其中android:orientation”vertical”意思为垂直方向的线性布局&#xff0c;此处的”vertical”可改为”horizontal”,意思是水平方向的线性布局。android:layout_width”match_parent”意思为这个控件的宽度占满整个屏幕或者父控件&am…

两数的加减乘除

设计思路&#xff1a; 首先要解决把输入的字符转化为计算的数字的问题&#xff0c;然后解决怎样用消息框输入输出即可。 程序流程图&#xff1a; 源代码&#xff1a; 实验结果&#xff1a; 转载于:https://www.cnblogs.com/wxyxxx/p/4859039.html

使用Docker搭建svn服务器教程

使用Docker搭建svn服务器教程 svn简介 SVN是Subversion的简称&#xff0c;是一个开放源代码的版本控制系统&#xff0c;相较于RCS、CVS&#xff0c;它采用了分支管理系统&#xff0c;它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点…

SDK Instrumentation创建一个Note的实例

除了高层框架如Robotium的solo&#xff0c;我们也可以直接调用SDK底层的提供的Instrumentation的API来实现如前几篇文章描述的创建一个note的功能。总所周知之Robotium就是基于Instrumentation的框架高层抽象实现的一个项目&#xff0c;所以对比《Robotium创建一个Note的实例》…

UOJ #53.线段树区间修改

【题目描述】&#xff1a;如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a;1.将某区间每一个数加上x2.求出某区间每一个数的和 【输入描述】&#xff1a;第一行包含两个整数N、M&#xff0c;分别表示该数列数字的个数和操作的总个数。第二行包含N个…

Blender三维插图设计视频教程 3D Characters and Illustrations in Blender 2.9

Blender三维插图设计视频教程 3D Characters and Illustrations in Blender 2.9 MP4 |视频:h264&#xff0c;1920x1080 |音频:aac&#xff0c;44100 Hz |时长:16h:06分钟|文件大小:4.75 GB 流派:电子学习|语言:英语 云桥网络 平台 获取 教程 本课程详细介绍了blender 4个案…

android mac测试地址,android获取有线网的Mac地址

Android TV开发中有的机器会接有线网&#xff0c;需要获取Mac地址&#xff0c;下面是我测试的两种Mac地址的获取方式。1.一共两个方法&#xff0c;目前第二个方法获取的不准&#xff0c;最后一位数取的不对。private String getMacAddress(){String strMacAddr null;try {Inet…

[高中作文赏析]感受冬天

转载于:https://www.cnblogs.com/zhangzujin/p/4864725.html

2022-2028年中国文化产业园投资分析及前景预测报告(全卷)

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国文化行业市场行业相关概述、中国文化行业市场行业运行环境、分析了中国文化行业市场行业的…

matlab 降维工具箱

Matlab Toolbox for Dimensionality Reduction降维方法包括&#xff1a;Principal Component Analysis (PCA) • Probabilistic PCA • Factor Analysis (FA) • Sammon mapping • Linear Discriminant Analysis (LDA) • Multidimensional scaling (MDS) • Isomap •…

程序还没写完只能当然计算器用,先发过来用着后面的慢慢写

真的是没办法&#xff0c;只好先发上来用着&#xff0c;后面的要先处理事情&#xff0c;等处理完接着写!! http://files.cnblogs.com/mari/starco.rar 这个是地址!!!转载于:https://www.cnblogs.com/mari/archive/2004/12/22/80317.html

Servlet生命周期与工作原理

Servlet生命周期分为三个阶段&#xff1a; 1&#xff0c;初始化阶段 调用init()方法 2&#xff0c;响应客户请求阶段 调用service()方法 3&#xff0c;终止阶段 调用destroy()方法 Servlet初始化阶段&#xff1a; 在下列时刻Servlet容器装载Servlet&#xff1a; 1&#…

ue4中面部动画制作视频教程 Facial Animation More In Unreal Engine 4

ue4中面部动画制作视频教程 Facial Animation & More In Unreal Engine 4 时长4h 包含项目文件 1920X1080 MP4 大小解压后&#xff1a;5.75G 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 面部动画&虚幻引擎4中的更多内容 信息…