docker从零开始(二)容器初体验
使用定义容器 Dockerfile
Dockerfile
定义容器内所需要的环境。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件哪个环境。但是,在执行此操作之后,您可以预期Dockerfile
在此处定义的应用程序的构建 在其他任何地方运行执行效果都是相同的,实现了一次构建,处处运行。
Dockerfile
创建一个空目录,创建一个名为的文件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 available to the world outside this container
EXPOSE # Define environment variable
ENV NAME World # Run app.py when the container launches
CMD ["python", "app.py"]
Dockerfile 里用到两个文件我们还尚未创建,一个requirements.txt (python软件安装依赖包列表文件) app.py 使用flask框架写的一个 程序
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本身),我们应该打印失败信息。
构建应用程序
我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls
应该显示的内容:
$ ls
Dockerfile app.py requirements.txt
现在运行build命令。这会创建一个Docker镜像,我们将使用-t
它来标记,因此它具有友好的名称。
docker build -t friendlyhello .
你的镜像在哪里?它位于您机器的本地Docker镜像注册表中:
$ docker image ls REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
运行该应用程序
运行应用程序,使用以下方法将计算机的端口4000映射到容器的已发布端口80 -p
:
$ docker run -p : friendlyhello
现在让我们以分离模式在后台运行应用程序:
docker run -d -p : friendlyhello
a8a005836f01968b4aec14cbd03c149a4db68f9d3fdc48306d8a950ca15f5ac3
分享你的镜像
为了演示我们刚刚创建的内容的可移植性,让我们上传我们构建的图像并在其他地方运行它。毕竟,当您想要将容器部署到生产环境时,您需要知道如何推送到注册表。
注册表是存储库的集合,存储库是图像的集合 - 类似于GitHub存储库,除了代码已经构建。注册表上的帐户可以创建许多存储库。
使用您的Docker ID登录
如果您没有Docker帐户,请在hub.docker.com上注册一个帐户 。记下您的用户名。
登录本地计算机上的Docker公共注册表。
$ docker login
标记图像
将本地映像与注册表上的存储库相关联的表示法是 username/repository:tag
。标签是可选的,但建议使用,因为它是注册管理机构用来为Docker镜像提供版本的机制。为上下文提供存储库和标记有意义的名称,例如get-started:part2
。这会将图像放入get-started
存储库并将其标记为part2
。
现在,把它们放在一起来标记图像。docker tag image
使用您的用户名,存储库和标记名称运行,以便将图像上载到所需的目标位置。该命令的语法是:
docker tag image username/repository:tag
例如:
docker tag friendlyhello benjamin77/image:part2
将标记的图像上传到存储库:
docker push benjamin77/image:part2
停掉正在后台运行的容器
[root@docker11 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8a005836f01 friendlyhello "python app.py" minutes ago Up minutes 0.0.0.0:->/tcp hungry_turing
[root@docker11 ~]# docker stop a8a005836f01
a8a005836f01
从现在开始,您可以使用docker run
以下命令在任何计算机上使用和运行您的应用程序:
如果镜像在计算机上不可用,则Docker会从存储库中提取镜像。
无论在哪里docker run
执行,它都会提取您的图像,以及Python和所有依赖项requirements.txt
,并运行您的代码。它们都在一个整洁的小包中一起旅行,你不需要在主机上安装任何东西,以便Docker运行它。
在另一台宿主机上 获取刚刚上传到docker hup上面的镜像
docker pull username/repositry:tag
在docker12上运行 刚刚从docker hub上拉取下来的容器
[root@docker12 ~]# docker run -d -p : benjamin77/image:part2
e4b41422f88b7453c99e6cee9161872876a55931218dbf8b6e200fbb1f561213
docker从零开始(二)容器初体验的更多相关文章
- Docker深入浅出系列 | 容器初体验
目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...
- Spring核心原理之IoC容器初体验(2)
本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...
- Yaf学习(二)----Yaf初体验
1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...
- 常见docker命令(二)-容器生命周期相关
docker run 命令主要参数-d 后台运行,返回容器id-i 以交互模式运行,通常与-t连用-t 为容器重新分配一个伪输入终端,通常与-i连用-P(大写) 随机端口映射,容器内部端口随机映射到主 ...
- docker入门(二)容器与镜像的理解
10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...
- docker入门(二)容器与镜像的关系
[编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...
- docker入门2---docker的初体验
Tomxin7 Simple, Interesting | 简单,有趣 第一个Docker镜像? 尝试运行docker自带的镜像"hello-world",了解docker镜像的下 ...
- Docker深入浅出系列 | 容器数据持久化
Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...
- Docker深入浅出系列 | Docker Compose多容器实战
目录 前期准备 Docker Compose是什么 为什么要用Docker Compose Docker Compose使用场景 Docker Compose安装 Compose Yaml文件结构 C ...
随机推荐
- 转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5 Posted February 18, 2011 at 6:29 PM ...
- lintcode-62-搜索旋转排序数组
62-搜索旋转排序数组 假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2).给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引 ...
- 关于C标准
关于C标准 1. 前言 本文从英文 C-FAQ (2004 年 7 月 3 日修订版) 翻译而来.本文的 中文版权为朱群英和孙云所有. 本文的内容可以自由用于个人目的,但 是不可以未经许可出版发行. ...
- http请求整理
终于又回来了,先来简单整理一波http请求的信息.对于前端来说,不管是在面试还是在实际项目中,都有必要去了解一些关于http的信息. http请求包含三部分:请求行request line.请求头re ...
- [剑指Offer] 10.矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? [思路]可归纳得出结论: f(n) = f(n-1) + f ...
- hdu 3357 Stock Chase (图论froyd变形)
Stock Chase Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 周记【距gdoi:126天】
这周比上周好了那么一点点……但还是有点呵呵 搞了仙人掌图(当然不是动态的……),以及一个远古算法2-sat(神奇的对称性运用,需要巨大脑洞的建边). 然后关于高考不加分竞赛被“打压”……大神们都发表了 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压
考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种 ...
- 【bzoj2141】排队 [国家集训队2011]排队(魏铭) 树套树 线段树套替罪羊树
这个题就是动态偏序对,每次操作做两个删除两个插入就好了. #include<cstdio> #include<iostream> #include<cstring> ...