Docker官方文档翻译2
转载请标明出处:
https://blog.csdn.net/forezp/article/details/80158062
本文出自方志朋的博客
容器
准备工作
- 安装Docker,版本为1.13或者1.13之上。
- 阅读第一篇文章的内容
- 给你的Docker环境一个快速的测试,确保所有的工作准备就绪:
docker run hello-world
介绍
是时候以Docker的方式开始构建一个应用程序了。我们从这个层次结构的底部开始,即它是一个容器,这是我们在这个界面上介绍的。在这个层次(容器?)之上是一个服务,它定义了容器在生产环境中的表现行为,在下一篇文章中我们会进行探讨。最后,在顶层是堆栈,定义了第5篇文章中介绍的所有服务的交互。
- 堆栈(第五篇文章介绍)
- 服务(第三篇文章介绍)
- 容器(这篇文章介绍,you are here)
你的新的开发环境
在过去,如果你写一个pyhton的应用,你的第一步是在你的机器上安装python的开发环境。但是需要你的机器上的运行环境与应用程序完美适合,并且也需要匹配生产环境。
利用docker,你能移植一个便捷的python的运行库作为镜像,无需安装。然后,通过构建包含python运行环境和你的应用代码一起的镜像,能够确保你的代码和运行环境完美结合并运行。
这些便捷的镜像通过被称作DockeFile的文件定义。
通过Dockerfile定义一个镜像
dockerfile定义了在容器内部跑什么运行环境。访问网络接口和磁盘驱动器等资源是在此环境中虚拟化的,与系统其余部分隔离,因此你需要将端口映射到外部世界,并明确要将哪些文件“复制”到 运行的环境。 然而,在完成这些之后,你可以预期,在此Dockerfile中定义的应用程序的构建在运行时的行为完全相同。
Dockerfile
创建一个空的文件夹。通过cd命令进入到新创建的文件夹,创建一个文件取名Dockerfile,复制以下内容到文件中,并保存。
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
这个Dockerfile关联了2个我们还没有创建的文件,,即app.py和requirements.txt。下面我们来创建。
应用程序部分
创建2个文件,requirements.txt和app.py,并且将它们放到和Dockerfile放进同一个文件夹中。这就完成了我们的应用,你可以发现用创建应用很简单。当上面的Dockerfile构建成镜像,app.py和requirements.txt通过Add命令加入到镜像去了,Expose命令能够暴露端口,可以通过http访问。
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为Python安装Flask和Redis库,并且该应用程序打印环境变量NAME以及调用socket.gethostname()的输出。 最后,因为Redis没有运行(因为我们只安装了Python库,而不是Redis本身),所以我们应该期望在这里尝试使用它会失败并产生错误消息。
那正是要点! 您的系统上不需要Python或任何requirements.txt文件,也不需要在您的系统上安装或运行此映像。看起来你并没有真正用Python和Flask建立一个环境,但是你已经拥有了。
构建应用
我们已经为构建应用做好了准备。确保你对新建的文件与最高的权限。下面是通过ls命令,应该显示以下内容:
$ ls
Dockerfile app.py requirements.txt
现在运行构建命令。创建一个Docker镜像,通过-t标记,从而使镜像有一个友好的名字。
docker build -t friendlyhello .
你构建的镜像在哪里?在你的机器的本地Docker镜像注册库“
$ docker image ls
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
运行应用
运行应用程序,使用-p将机器的端口4000映射到容器的已发布端口80:
docker run -p 4000:80 friendlyhello
你应该在http://0.0.0.0:80看到一条消息,Python正在为你的应用程序提供服务。 但是该消息来自容器内部,它不知道将该容器的端口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>
这个4000:80的端口重映射是为了演示Dockerfile中的EXPOSE与使用docker run -p发布的内容之间的区别。 在后面的步骤中,我们只需将主机上的端口80映射到容器中的端口80并使用http:// localhost。
按CTRL+C结束进程。
现在可以让应用程序在后端进程中运行,用detached 模式。
docker run -d -p 4000:80 friendlyhello
你可以获取应用的容器ID,通过容器ID将应用程序停止。 容器正在后台运行。 可以使用docker container ls命令查看缩写的容器ID:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
现在用docker containner stop 命令结束进程,需要用到 container id,如下:
docker container stop 1fa4ab2cf395
分享你的镜像:
为了演示我们刚才创建的容器具有可移植性,我们上传我们构建的映像并可以在其他的任何地方运行。 毕竟,当你想要将容器部署到生产环境时,弄需要知道如何推送注册仓库。
注册仓库是存储库的集合,而存储库是图像的集合 - 有点像GitHub存储库,但代码已经创建。 注册仓库上的帐户可以创建许多存储库。 docker CLI默认使用Docker的公共注册库。
登录dokcer Id
如果你还没有Docker帐户,请在网站cloud.docker.com注册一个帐户。 记下你的用户名。
登录到本地计算机上的Docker公共注册库。
$ docker login
标记镜像
将本地映像与注册库中的存储库相关联的命令是username / repository:tag。 该标签是可选的,但建议使用,因为它是注册管理机构用于为Docker镜像提供版本的机制。 为该上下文提供存储库并标记有意义的名称,例如get-started:part2。 这将图像放入启动存储库并将其标记为part2。
现在,把它放在一起来标记图像。使用你的用户名,存储库和标签名称运行码头标签图像,以便将图像上传到您想要的目的地。 该命令的语法是:
docker tag image username/repository:tag
比如:
docker tag friendlyhello john/get-started:part2
运行 docker image ls 命令去查看你的新的标记的镜像。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest d9e555c53008 3 minutes ago 195MB
john/get-started part2 d9e555c53008 3 minutes ago 195MB
python 2.7-slim 1c7128a655f6 5 days ago 183MB
...
推送镜像
上传你的标记的镜像去仓库
docker push username/repository:tag
完成后,此上传的结果将公开发布。 如果你登录到Docker Hub,则可以通过其pull命令在那里看到新映像。
从远程仓库获取并运行镜像
从现在起,你可以使用docker run并使用此命令在任何机器上运行你的应用程序:
docker run -p 4000:80 username/repository:tag
如果镜像在本地机器没有,docker 从仓库中拉取。
$ docker run -p 4000:80 john/get-started:part2
Unable to find image 'john/get-started:part2' locally
part2: Pulling from john/get-started
10a267c67f42: Already exists
f68a39a6a5e4: Already exists
9beaffc0cf19: Already exists
3c1fe835fb6b: Already exists
4c9f1fa8fcb8: Already exists
ee7d8f576a14: Already exists
fbccdcced46e: Already exists
Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for john/get-started:part2
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
无论docker run在哪里执行,它都会将你的镜像以及Python和requirements.txt中的所有依赖关系一起提取出来,并运行你的代码。 它们都在一个整洁的小包中,并且您不需要在主机上安装任何Docker。
总结
这就是这个页面的内容。 在下一节中,我们将学习如何通过在服务中运行此容器来扩展我们的应用程序。
命令复习
这里列出了这个页面的基本Docker命令,以及一些相关的命令,如果你想在继续之前探索一下。
ocker build -t friendlyhello . # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag
扫码关注公众号有惊喜
(转载本站文章请注明作者和出处 方志朋的博客)
Docker官方文档翻译2的更多相关文章
- Docker官方文档翻译1
转载请标明出处: https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 本系列教程翻译于docker文档,文档地址:http ...
- Docker官方文档翻译之入门
转自:http://www.cnblogs.com/vikings-blog/p/3958091.html Docker学习总结之docker入门 Understanding Docker 以下均翻译 ...
- docker官方文档翻译5
转载请标明出处: https://blog.csdn.net/forezp/article/details/80244682 本文出自方志朋的博客 堆栈(Stacks) 准备工作 安装Docker 1 ...
- docker官方文档翻译4
转载请标明出处: https://blog.csdn.net/forezp/article/details/80186178 本文出自方志朋的博客 第四篇:Swarms 准备工作 安装Docker版本 ...
- docker官方文档翻译3
转载请标明出处: https://blog.csdn.net/forezp/article/details/80171723 本文出自方志朋的博客 第三部分: 服务 准备工作 安装Docker 1.1 ...
- Ubuntu安装Docker(官方文档翻译)
翻译自Docker官方文档 https://docs.docker.com/engine/installation/linux/ubuntulinux/ 之前因为看不懂官方文档,卡在某个步骤无法完成安 ...
- 关于Docker官方CentOS镜像无法启动mysqld的总结
很多童鞋反映,在Docker官方CentOS镜像中安装了Mysql server后,无法正常启动. 无法正常启动表现为两种情况: 1> 初始完数据库后,mysqld启动报错 2> syst ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)中一些知识点
Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Flume官方文档翻译--Flume 1.7.0 User Guide (unr ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)
Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...
随机推荐
- tornado handler 方法复用的 3 个方法
tornado handler 调用 特性 在一次 tornado 请求中调用其他 tornado handler 中的方法, 比如 run 方法 引言 在后台开发中, 有时需要做一些功能的整合, 比 ...
- .net mvc 设置div的动态部分视图内容 dynamic partial view
示例效果:点击按钮,在div中 显示不同的partial view的内容 $("#btnEdit").click(function () { //动态获取相应的部分视图 var u ...
- C# 实现OrderBy按多个字段排序
//倒序 list.OrderByDescending(i => i.a).ThenByDescending(i => i.b); //顺序 list.OrderBy(i => i. ...
- 优化代码CPU层面
今天在看<支撑处理器的技术>,其中,讲到了CPU流水线.在指令之间,如果下一条指令,需要用到上一条指令的结果,会影响到流水线的执行.书上给出了几种解决方案,一个是在指令中间插入一下无关的指 ...
- 如何把php项目部署到阿里云服务器window server2012__含公网ip访问时jquery/ajax失效解决办法
记一次蛋疼的折腾. 弄了一晚上最后发觉是360浏览器的问题,换个浏览器就好了.垃圾360用什么IE7文档模式.导致界面和功能失效. 建议大家测试的时候用firefox或者chrome. 项目部署到服务 ...
- C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...
- mysql四-1:单表查询
一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键 ...
- Web前端面试指导(十二):::before 和:before有什么区别?
题目点评 这个问题看来很简单,但如果之前没有琢磨这个问题,给人感觉也是门头一垂,听到这个题目就懵逼了,因为原来从来没有注意过这个问题,即便有注意这个问题也不能很好的回答清楚.回答的技巧就是从相同点和不 ...
- Android 使用RecyclerView优雅实现悬浮标题通讯录
项目地址:https://github.com/hgDendi/ContactsList 界面概览: ContactsListDemo ContactsListDemo2 概要 如图,主要简单划分为两 ...
- Android SharedPreferences存储map的方法
在网上查了一些资料后,精简改写后得出自己想用的形式,记录一下 public static void putHashMapData(Context context, String key, Map< ...