版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/79600059

简介

本文将用Docker的方式来构建一个应用APP。

过去,如果要开发一个Python应用APP,所需做的第一件事就是在开发机上安装Python运行时环境。在这种情形下,开发机的环境必须与APP所要求的环境一致,同时还需要与生产环境相匹配。

通过使用Docker,可以将一个可移植的Python运行时环境作为一个image获取,而无需安装。然后,就可以基于Python运行时环境image,将APP代码及其依赖库合并构建,从而简化了应用APP的部署难度。

用Dockerfile定义容器Container

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它简化了业务部署的流程,大大提高了业务的部署速度。Dockerfile的产出为一个新的可以用于创建容器的镜像。

Dockerfile语法由两部分构成,分别是“注释”和“命令+参数”。

# Line blocks used for commenting
COMMAND argument1 argument2 ...

对于Dockerfile,我们首先创建一个空目录,然后cd到该目录,并创建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 80 available to the world outside this container
EXPOSE 80# Define environment variable
ENV NAME World# Run app.py when the container launches
CMD ["python", "app.py"]

其中,app.py和requirements.txt都位于与Dockerfile相同的目录下,具体如下:

zjl@ubuntu:~/docker/pyapp$ ls
app.py  Dockerfile  requirements.txt

对于requirements.txt,其内容如下:

Flask
Redis

对于app.py,其内容如下:

from flask import Flask
from redis import Redis, RedisError
import os
import socketredis = 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库,同时APP会打印出环境变量NAME,同时将socket.gethostname()打印出来。

构建新的image镜像

下面,我们进行构建,具体如下:

zjl@ubuntu:~/docker/pyapp$ ls
app.py  Dockerfile  requirements.txtzjl@ubuntu:~/docker/pyapp$ sudo docker build -t fhello .
Sending build context to Docker daemon  4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
d2ca7eff5948: Pull complete
cef69dd0e5b9: Pull complete
50e1d7e4f3c6: Pull complete
861e9de5333f: Pull complete
Digest: sha256:e9baca9b405d3bbba71d4c3c4ce8a461e4937413b8b910cb1801dfac0a2423aa
Status: Downloaded newer image for python:2.7-slim---> 52ad41c7aea4
Step 2/7 : WORKDIR /app
...
Step 3/7 : ADD . /app
...
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
...
Step 5/7 : EXPOSE 80
...
Step 6/7 : ENV NAME World
...
Step 7/7 : CMD ["python", "app.py"]
...
Successfully built d3fafd68e807
Successfully tagged fhello:latestzjl@ubuntu:~/docker/pyapp$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
fhello              latest              12d000cd7a1b        12 minutes ago      148MB

运行新的image镜像

$ sudo docker run -p 4000:80 fhello* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)# 访问该网站
$ curl localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> f4e37f061593<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>$ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
4a150bdc67cd        fhello              "python app.py"     10 seconds ago      Up 9 seconds        0.0.0.0:4000->80/tcp   upbeat_austin

关闭容器,命令如下:

$ sudo docker container stop 4a150bdc67cd
4a150bdc67cd

给镜像打上标签

syntax: -->> docker tag image username/repository:tag
$ sudo docker tag fhello zhjl/getstarted:alpha-1
$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
fhello              latest              12d000cd7a1b        18 minutes ago      148MB
zhjl/getstarted     alpha-1             12d000cd7a1b        18 minutes ago      148MB$ docker run -p 4000:80 zhjl/getstarted:alpha-1

Recap and cheat sheet

# Create image using this directory's Dockerfile
docker build -t fhello .# Run "friendlyname" mapping port 4000 to 80
docker run -p 4000:80 fhello# Same thing, but in detached mode
docker run -d -p 4000:80 fhello# List all running containers
docker container ls# List all containers, even those not running
docker container ls -a# Gracefully stop the specified container
docker container stop <hash># Force shutdown of the specified container
docker container kill <hash># Remove specified container from this machine
docker container rm <hash># Remove all containers
docker container rm $(docker container ls -a -q)# List all images on this machine
docker image ls -a# Remove specified image from this machine
docker image rm <image id># Remove all images from this machine
docker image rm $(docker image ls -a -q)# Log in this CLI session using your Docker credential
docker login# Tag <image> for upload to registry
docker tag <image> username/repository:tag# Upload tagged image to registry
docker push username/repository:tag# Run image from a registry
docker run username/repository:tag

Docker技术笔记:Docker入门浅尝相关推荐

  1. php solr docker搭建,深入浅出Docker技术- 基于Docker Solr集群的搭建

    Posted on 6月 2, 2018 深入浅出Docker技术- 基于Docker Solr集群的搭建 SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在开发中的Solr ...

  2. docker学习笔记---基础入门

    背景:最近在公司搭建一些公司没有的漏洞环境,接触到docker可以拉取一些公共的漏洞镜像环境,对于搭建漏洞环境很方便,因此学习了下docker的一些入门知识,一些常用的命令分享出来,共勉! 一.认识d ...

  3. 狂神说--docker学习笔记-docker安装,常用命令,以及使用

    狂神说bilibili视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?p=1 1. Docker概述 1.1 Docker为什么出现? 大家经常做一款 ...

  4. Docker学习笔记 — Docker私有仓库搭建

    2019独角兽企业重金招聘Python工程师标准>>> 和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库. 使用私有仓 ...

  5. docker技术剖析--docker资源限制及应用总结 for centos7.2

    http://hongge.blog.51cto.com/ Docker(linux container)所依赖的底层技术 1 Namespace 用来做容器的隔离,有了namespace,在dock ...

  6. Docker学习笔记 - Docker Compose

    一.概念 Docker Compose 用于定义运行使用多个容器的应用,可以一条命令启动应用(多个容器). 使用Docker Compose 的步骤: 定义容器 Dockerfile 定义应用的各个服 ...

  7. Docker学习笔记 - Docker容器的日志

    docker logs  [-f]  [-t]  [--tail]  容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...

  8. Docker容器技术 笔记

    Docker容器技术 Docker是一门平台级别的技术,涉及的范围很广,所以,在开始之前,请确保你完成:Java SpringBoot 篇(推荐完成SpringCloud篇再来)视频教程及之前全部路线 ...

  9. 狂神 Docker学习笔记 从基础到进阶 一步到位

    Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...

最新文章

  1. xampp php源码的路径,php – XAMPP中的根路径
  2. il和idl区别_我来给普及一下matlab、IDL、fortran神马的区别吧
  3. java sql 参数_java jdbc连接数据库,Properties 属性设置参数方法
  4. 整合springMVC
  5. 递归和迭代路由_静态路由在以太网接口中的不同书写会导致路由器怎样的操作结果?...
  6. 设计模式——中介者模式
  7. GoLang语言多版本管理工具--GVM入门介绍
  8. java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】
  9. Unity的Animator中Transition有延迟的问题
  10. 手rm-linux联网后自动dhcp,Linux操作系统下DHCP简单设置
  11. 培生同意以3亿美元出售华尔街英语
  12. Visual Studio 2019 离线安装包下载
  13. kali初学——nmap扫描
  14. 互联网中B端客户和C端客户的区别
  15. 《黑客秘笈——渗透测试实用指南(第2版)》—第2章2.3节外部或内部主动式信息搜集...
  16. 速率法和终点法的区别_速率法,终点法
  17. 你的电脑/设备需要恢复 错误码0xc000014c
  18. 蓝牙耳机哪种通话效果最好?通话质量最好的蓝牙耳机盘点
  19. 【DL】第 6 章:文本生成转换器
  20. 20管理类联考考研视频全程班资料

热门文章

  1. 基础三:控制执行流程
  2. Android Studio使用外部jar包
  3. python学习笔记(一)——操作符和运算变量
  4. html用颜色区分不同区间数据_最新数据可视化指南
  5. java fork join原理_Java并发Fork-Join框架原理解析
  6. JAVA数组扁平化整合_数组扁平化的几种处理放法
  7. 多类感知器算法题目_先进算法讲解
  8. mybatis学习2之ResultMap结果集映射
  9. python代码图片头像_Python帮你微信头像任意添加装饰别再@微信官方了
  10. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2