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 ...
随机推荐
- Hangman游戏源代码 --- python实现
#hangman.py from PythonCard import model,dialog import random def find_letters(letter,a_string): loc ...
- mac tomcat: error 1 operation not permitted
在用微信传一个tomcat压缩包到别人后,解压后无法用idea启动,提示 error 1 operation not permitted,但是直接用命令可以执行. 仔细查看,原来是因为mac出于安全考 ...
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用
题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...
- LeetCode -- Linked List Circle ii
Question: Given a linked list, return the node where the cycle begins. If there is no cycle, return ...
- 2017 Multi-University Training Contest - Team 4 phone call(树+lca+并查集)
题解: (并查集处理往上跳的时候,一定要先让u,v往上跳到并查集的祖先,不然会wa掉) 代码如下: #include <iostream> #include <algorithm&g ...
- Flink 任务打包、提交
一.Flink版本 flink-1.6.1-bin-hadoop26-scala_2.11 二.Flink任务打包 笔者将写好的flink计算任务代码发到服务器(ubuntu16.04),在服务器端进 ...
- [Leetcode] first missing positve 缺失的第一个正数
Given an unsorted integer array, find the first missing positive integer. For example,Given[1,2,0]re ...
- 用JavaScript实现一个简单的树结构
数据源用数组混json结构,实现了基本的功能.效率一般,跟 dhtree 梅花雪树对比了下,都差不多. (ps感觉比dhtree快点,跟梅花雪树差不多,个人测试) 这个实现树的原理是根据json,不断 ...
- 用PHP迭代器来实现一个斐波纳契数列
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- shell里的getopts
By francis_hao Jul 5,2017 getopts是shell的一个内置命令. 概述 getopts optstring name [args]OPTIND,OPTARG,O ...