1.  容器

在过去,如果要开始编写Python应用程序,首先要做的就是在机器上安装Python运行时环境。但是,这就造成了这样一种情况:你的机器上的环境需要完美,以便你的应用程序能够按预期运行,而且还需要与你的生产环境相匹配。

使用Docker,你只需要获取一个可移植的Python运行时作为镜像,不需要安装。然后,当你构建应用程序时就会在代码旁边包含基本的Python镜像,确保应用程序、它的依赖项和运行时一起运行。

这些可移植的镜像被一些称之为“Dockerfile”来定义。

2.  用Dockerfile定义一个容器

Dockerfile

示例:

在你的本地机器上创建一个空目录,进入该目录,然后在此目录下创建一个名字叫Dockerfile的文件,将下列内容复制粘贴到文件中,保存。

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

可以看到,Dockerfile文件需要引用app.py和requirements.txt文件,于是,在与Dockerfile同级的目录下创建这两个文件

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

构建App

  1. $ ls
  2. Dockerfile app.py requirements.txt
  1. docker build --tag=friendlyhello .
  1. $ docker image ls
  2. REPOSITORY TAG IMAGE ID
  3. friendlyhello latest 326387cea398

注意:tag默认是latest,当然你可以手动指定,比如:--tag=friendlyhello:v0.0.1

3.  运行App

运行app,将本地4000端口映射到容器对外公布的80端口

  1. docker run -p 4000:80 friendlyhello

4.  共享你的镜像

为了能够在任何地方都运行,我们需要将我们的镜像上传到注册中心。注册中心是仓库的集合,而仓库是镜像的集合。这很像GitHub仓库或者Maven仓库。一个账号可以在注册中心中创建许多个仓库。

用Docker ID登录

  1. $ docker login

5.  给镜像打标签

将本地镜像关联到注册中心的某个仓库,格式是这样的: username/repository:tag

其中,tag是可选的,但是推荐加上tag。当你关联到仓库后,注册中心会给这个镜像分配一个版本号

给镜像打Tag的格式如下:

  1. docker tag image username/repository:tag

例如,我们给我们刚才的friendlyhello打一个tag

  1. docker tag friendlyhello gordon/get-started:part2

6.  发布镜像

  1. docker push username/repository:tag

(PS:这个过程很像git在本地打标签并推送到远程仓库)

  1. 1 git tag v1.0
  2. 2 git push origin v1.0 

推送成功以后,我们就可以在注册中心看到了

7.  备忘单

  1. docker build -t friendlyhello . # Create image using this directory's Dockerfile
  2. docker run -p 4000:80 friendlyhello # Run "friendlyhello" mapping port 4000 to 80
  3. docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
  4. docker container ls # List all running containers
  5. docker container ls -a # List all containers, even those not running
  6. docker container stop <hash> # Gracefully stop the specified container
  7. docker container kill <hash> # Force shutdown of the specified container
  8. docker container rm <hash> # Remove specified container from this machine
  9. docker container rm $(docker container ls -a -q) # Remove all containers
  10. docker image ls -a # List all images on this machine
  11. docker image rm <image id> # Remove specified image from this machine
  12. docker image rm $(docker image ls -a -q) # Remove all images from this machine
  13. docker login # Log in this CLI session using your Docker credentials
  14. docker tag <image> username/repository:tag # Tag <image> for upload to registry
  15. docker push username/repository:tag # Upload tagged image to registry
  16. docker run username/repository:tag # Run image from a registry

Docker 容器的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  3. 在docker容器中vi指令找不到

    在使用docker容器时,有时候里边没有安装vi,敲vi命令时提示说:vi: command not found,这个时候就需要安装vi,可是当你敲apt-get install vi命令时,提示: ...

  4. 理解Docker(4):Docker 容器使用 cgroups 限制资源使用

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  5. docker学习(5) 在mac中创建mysql docker容器

    github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像daocloud.io也能找到mysql ...

  6. 在Linux和Windows的Docker容器中运行ASP.NET Core

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...

  7. 自定义Docker容器的 hostname

    自定义Docker容器的 hostname   作者: John Deng 原创内容,欢迎传播,请注明出处:http://www.cnblogs.com/johnd/p/set-docker-host ...

  8. Docker容器是否可以改变世界?

    Docker容器是否可以改变世界? 2016-01-15 杜亦舒 2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接 ...

  9. 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】

    首先弄出来装有hadoop.java.ssh.vim的镜像起名badboyf/hadoop.做镜像有两种方法,一种是用Dockerfile来生成一个镜像,一种是基于ubuntu14.04的基础镜像生成 ...

  10. 在docker容器中安装和使用,linux版的powershell

    powershell 传教士 原创文章.始于 2016-09-18 ,2016-10-27修改powershell docker官网.允许转载,但必须保留名字和出处,否则追究法律责任 1 在任意版本的 ...

随机推荐

  1. Bootstrap免费模板站推荐

    第一个:http://startbootstrap.com/ 第二个:http://www.bootstrapzero.com/ 第三个:https://bootswatch.com/ 第四个:htt ...

  2. 畅通工程-HZNU寒假集训

    畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...

  3. python中元组、列表、字典、集合知识

    像列表一样处理字符串: 仅需要看字符串的首字符就知道如何处理该字符串的情况也很常见.例如,如果有一个姓与名的列表,您可以使用与列表相同的语法查看名与姓的第一个字符.这种看待字符串的方法叫做分片(sli ...

  4. 服务治理利器Hystrix-理论篇

    引言 现在的大中型应用,很多都在朝着服务化.分布式的方向发展.这有多方面的考虑,比如说,方便治理.便于扩展.服务隔离等等.不过在带来如此多利好的同时,不可避免的也会带来麻烦,比如系统架构复杂.服务依赖 ...

  5. 最详细的JavaWeb开发基础之java环境搭建(Windows版)

    阅读文本大概需要 3 分钟. 首先欢迎大家来学习JavaWeb,在这里会给你比较详细的教程,从最基本的开始,循序渐进的深入.会让初学者的你少踩很多坑(大实话),如果你已经掌握了JavaWeb开发的基础 ...

  6. java I/O流详解

    概况 I/O流主要分为二大类别:字符流和字节流. 字节流(基本流) 1.字节输入流    类名:FileInputStream    特点:读(对文件进行读取操作)    父类:InputStream ...

  7. 根据appId匹配项目名称

    有时候后端返回的接口中也许没有我们想要的字段,可以通过下面的方式拿到想要的字段 代码如下: //获取项目名称 getBizName(appId) { let proNameList = this.$s ...

  8. 微信小程序开发入门:10分钟从0开始写一个hello-world

    小程序开发需要三个描述整体程序的app文件 和 一个描述多个页面的 pages文件夹. (1)三个app文件分别是app.js,app.json,app.wxss. app.js文件是脚本文件处理一些 ...

  9. apache2.4 虚拟主机配置

    网上教程很多,仅记录我的配置,可供参考 一.修改httpd.conf 打开appserv的安装目录,找到httpd.conf文件,分别去掉下面两行文字前面的#号. #LoadModule vhost_ ...

  10. 解决MyEclipse注册失败的问题

    https://jingyan.baidu.com/article/acf728fd49519ff8e410a361.html