使用定义容器 Dockerfile

Dockerfile定义容器内所需要的环境。对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要“复制”到哪些文件哪个环境。但是,在执行此操作之后,您可以预期Dockerfile在此处定义的应用程序的构建 在其他任何地方运行执行效果都是相同的,实现了一次构建,处处运行。

Dockerfile

创建一个空目录,创建一个名为的文件Dockerfile,将以下内容复制并粘贴到该文件中,然后保存。

  1. # Use an official Python runtime as a parent image
  2. FROM python:2.7-slim
  3.  
  4. # Set the working directory to /app
  5. WORKDIR /app
  6.  
  7. # Copy the current directory contents into the container at /app
  8. ADD . /app
  9.  
  10. # Install any needed packages specified in requirements.txt
  11. RUN pip install --trusted-host pypi.python.org -r requirements.txt
  12.  
  13. # Make port available to the world outside this container
  14. EXPOSE
  15.  
  16. # Define environment variable
  17. ENV NAME World
  18.  
  19. # Run app.py when the container launches
  20. CMD ["python", "app.py"]

Dockerfile 里用到两个文件我们还尚未创建,一个requirements.txt  (python软件安装依赖包列表文件)  app.py 使用flask框架写的一个 程序

requirements.txt

  1. Flask
  2. Redis

app.py

  1. from flask import Flask
  2. from redis import Redis, RedisError
  3. import os
  4. import socket
  5.  
  6. # Connect to Redis
  7. redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
  8.  
  9. app = Flask(__name__)
  10.  
  11. @app.route("/")
  12. def hello():
  13. try:
  14. visits = redis.incr("counter")
  15. except RedisError:
  16. visits = "<i>cannot connect to Redis, counter disabled</i>"
  17.  
  18. html = "<h3>Hello {name}!</h3>" \
  19. "<b>Hostname:</b> {hostname}<br/>" \
  20. "<b>Visits:</b> {visits}"
  21. return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
  22.  
  23. if __name__ == "__main__":
  24. app.run(host='0.0.0.0', port=80)

说明:现在我们看到pip install -r requirements.txt为Python安装Flask和Redis库,应用程序打印环境变量NAME,以及调用的输出socket.gethostname()。最后,因为Redis没有运行(因为我们只安装了Python库,而不是Redis本身),我们应该打印失败信息。

构建应用程序

我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls应该显示的内容:

  1. $ ls
  2. Dockerfile app.py requirements.txt

现在运行build命令。这会创建一个Docker镜像,我们将使用-t它来标记,因此它具有友好的名称。

  1. docker build -t friendlyhello .

你的镜像在哪里?它位于您机器的本地Docker镜像注册表中:

  1. $ docker image ls
  2.  
  3. REPOSITORY TAG IMAGE ID
  4. friendlyhello latest 326387cea398

运行该应用程序

运行应用程序,使用以下方法将计算机的端口4000映射到容器的已发布端口80 -p

  1. $ docker run -p : friendlyhello

现在让我们以分离模式在后台运行应用程序:

  1. docker run -d -p : friendlyhello
  2. a8a005836f01968b4aec14cbd03c149a4db68f9d3fdc48306d8a950ca15f5ac3

分享你的镜像

为了演示我们刚刚创建的内容的可移植性,让我们上传我们构建的图像并在其他地方运行它。毕竟,当您想要将容器部署到生产环境时,您需要知道如何推送到注册表。

注册表是存储库的集合,存储库是图像的集合 - 类似于GitHub存储库,除了代码已经构建。注册表上的帐户可以创建许多存储库。

使用您的Docker ID登录

如果您没有Docker帐户,请在hub.docker.com上注册一个帐户 。记下您的用户名。

登录本地计算机上的Docker公共注册表。

  1. $ docker login

标记图像

将本地映像与注册表上的存储库相关联的表示法是 username/repository:tag。标签是可选的,但建议使用,因为它是注册管理机构用来为Docker镜像提供版本的机制。为上下文提供存储库和标记有意义的名称,例如get-started:part2。这会将图像放入get-started存储库并将其标记为part2

现在,把它们放在一起来标记图像。docker tag image使用您的用户名,存储库和标记名称运行,以便将图像上载到所需的目标位置。该命令的语法是:

  1. docker tag image username/repository:tag

例如:

  1. docker tag friendlyhello benjamin77/image:part2

将标记的图像上传到存储库:

  1. docker push benjamin77/image:part2

停掉正在后台运行的容器

  1. [root@docker11 ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. a8a005836f01 friendlyhello "python app.py" minutes ago Up minutes 0.0.0.0:->/tcp hungry_turing
  4. [root@docker11 ~]# docker stop a8a005836f01
  5. a8a005836f01

从现在开始,您可以使用docker run以下命令在任何计算机上使用和运行您的应用程序:

如果镜像在计算机上不可用,则Docker会从存储库中提取镜像。

无论在哪里docker run执行,它都会提取您的图像,以及Python和所有依赖项requirements.txt,并运行您的代码。它们都在一个整洁的小包中一起旅行,你不需要在主机上安装任何东西,以便Docker运行它。

在另一台宿主机上 获取刚刚上传到docker hup上面的镜像

  1. docker pull username/repositry:tag

在docker12上运行 刚刚从docker hub上拉取下来的容器

  1. [root@docker12 ~]# docker run -d -p : benjamin77/image:part2
  2. 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. ACM做题随做随思

    程序停止运行:数组开太大: 输入一串单词,可以“string s; while(cin>>s){//代码块}”,因为cin>>s遇到空格会停止: map<key,valu ...

  2. Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展

    一.Bing搜索的相关背景 第一,必应搜索前几年的发展重点在于欧美市场,并且取得了一定的成效:根据 Hitwise 的统计数据,Bing 在 2011年3 月份市场占有率突破了 30% 大关,达到 3 ...

  3. C#中async和await用法

    .net 4.5中新增了async和await这一对用于异步编程的关键字. async放在方法中存在await代码的方法中,await放在调用返回Task的方法前. class Class1 { pr ...

  4. web相关基础知识3

    一 .浮动布局   ★元素浮动之后不占据原来的位置,脱离标准流 ★浮动的盒子在一行上显示 ★行内元素浮动之后转换为行内块元素.(不推荐使用,会脱离标准流,转行内元素最好使用display: inlin ...

  5. Win10 1803安装Ubuntu1804子系统

    1.win10应用商店选择Ubuntu1804安装 点击打开会提示https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 2.用管理员po ...

  6. 51nod 1565模糊搜索(FFT)

    题目大意就是字符串匹配,不过有一个门限k而已 之前有提到过fft做字符串匹配,这里和之前那种有些许不同 因为只有A,C,G,T四种字符,所以就考虑构造4个01序列 例如,模板串a关于'A'的01序列中 ...

  7. React & Redux 的一些基本知识点

    一.React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态. 1. React.createCl ...

  8. 关于Maven项目install时出现No compiler is provided in this environment的处理

    关于Maven项目build时出现No compiler is provided in this environment的处理 新配置的Eclipse环境,运行现有项目没问题,一日,从svn上检出了一 ...

  9. watch用法小记

    By francis_hao    Jun 30,2017   watch:周期性的执行一个一个程序,并全屏显示输出 概述 watch [options] command   描述 watch重复的运 ...

  10. Saruman’s Level Up~(多校赛算组合数)

    Description Saruman’s army of orcs and other dark minions continuously mine and harvest lumber out o ...