使用定义容器 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从零开始(二)容器初体验的更多相关文章

  1. Docker深入浅出系列 | 容器初体验

    目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...

  2. Spring核心原理之IoC容器初体验(2)

    本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...

  3. Yaf学习(二)----Yaf初体验

    1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...

  4. 常见docker命令(二)-容器生命周期相关

    docker run 命令主要参数-d 后台运行,返回容器id-i 以交互模式运行,通常与-t连用-t 为容器重新分配一个伪输入终端,通常与-i连用-P(大写) 随机端口映射,容器内部端口随机映射到主 ...

  5. docker入门(二)容器与镜像的理解

    10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...

  6. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...

  7. docker入门2---docker的初体验

    Tomxin7 Simple, Interesting | 简单,有趣 第一个Docker镜像? 尝试运行docker自带的镜像"hello-world",了解docker镜像的下 ...

  8. Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

  9. Docker深入浅出系列 | Docker Compose多容器实战

    目录 前期准备 Docker Compose是什么 为什么要用Docker Compose Docker Compose使用场景 Docker Compose安装 Compose Yaml文件结构 C ...

随机推荐

  1. Hangman游戏源代码 --- python实现

    #hangman.py from PythonCard import model,dialog import random def find_letters(letter,a_string): loc ...

  2. mac tomcat: error 1 operation not permitted

    在用微信传一个tomcat压缩包到别人后,解压后无法用idea启动,提示 error 1 operation not permitted,但是直接用命令可以执行. 仔细查看,原来是因为mac出于安全考 ...

  3. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

  4. LeetCode -- Linked List Circle ii

    Question: Given a linked list, return the node where the cycle begins. If there is no cycle, return  ...

  5. 2017 Multi-University Training Contest - Team 4 phone call(树+lca+并查集)

    题解: (并查集处理往上跳的时候,一定要先让u,v往上跳到并查集的祖先,不然会wa掉) 代码如下: #include <iostream> #include <algorithm&g ...

  6. Flink 任务打包、提交

    一.Flink版本 flink-1.6.1-bin-hadoop26-scala_2.11 二.Flink任务打包 笔者将写好的flink计算任务代码发到服务器(ubuntu16.04),在服务器端进 ...

  7. [Leetcode] first missing positve 缺失的第一个正数

    Given an unsorted integer array, find the first missing positive integer. For example,Given[1,2,0]re ...

  8. 用JavaScript实现一个简单的树结构

    数据源用数组混json结构,实现了基本的功能.效率一般,跟 dhtree 梅花雪树对比了下,都差不多. (ps感觉比dhtree快点,跟梅花雪树差不多,个人测试) 这个实现树的原理是根据json,不断 ...

  9. 用PHP迭代器来实现一个斐波纳契数列

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...

  10. shell里的getopts

    By francis_hao    Jul 5,2017   getopts是shell的一个内置命令. 概述 getopts optstring name [args]OPTIND,OPTARG,O ...