Docker入门 二 开发自己的镜像
体验新的开发环境
在以前,如果你想要进行Python开发,那么你第一件事情就是必须现在自己的电脑上面安装Python运行时和类库。
但是,这样导致了一种情况,那就是为了期望应用运行正常必须跟你开发电脑环境一样,服务器部署运行也是这样的情况。
使用了Docker,你能够仅抓取一个便携式的作为镜像的Python运行时,而无需安装。这样,你构建出来的东西包含了基础的Python镜像和你的应用代码,保证了你的应用和它的依赖还有运行时都能够作为整体来传输和使用。其实,你狗构建出来的东西还是镜像,是通过一个叫做Dockerfile来定义的。
使用Dockerfile定义一个容器
Dockerfile能够定义容器内部的环境如何运行。为了要访问资源,像网络接口和硬盘驱动在容器内部都是虚拟化的,与主机系统的其他部分都是隔离的,你不得不映射端口到外部,确定具体的文件交互格式。不管怎么样,你使用Dockerfile
把你的应用定义成镜像,就能够做到无论在什么样的环境下,都能够运行地特别一致。
1 新建一个文件叫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 -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
andrequirements.txt两个文件,接着创建
2 应用本身
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类库,并没有安装服务器啊),结果可惜而知当用到时就会报错。
3 构建应用
我们准备构建(就是打包),确保你是在目录中
![](https://images2017.cnblogs.com/blog/699473/201709/699473-20170904154430429-1550640716.png)
现在运行狗i按命令,使用 -t 参数来指定一个友好的名字
docker build -t friendlyhello .
看清楚了最后有一个空格和点,否则就会出错,正确结果是这样滴
![](https://images2017.cnblogs.com/blog/699473/201709/699473-20170904160009866-56552020.png)
网速慢,真烦人。
生成的镜像去了哪里?在我们电脑的本地镜像中心
运行你的应用
使用-p参数来映射宿主的端口到容器内的端口
docker run -p 4000:80 friendlyhello
结果
![](https://images2017.cnblogs.com/blog/699473/201709/699473-20170904160434085-1380850041.png)
访问本机浏览器 http://localhost:4000/
提示出错了,不过这是在预期内。
使用 -d参数让它在后台运行
docker run -d -p 4000:80 friendlyhello
查看运行
![](https://images2017.cnblogs.com/blog/699473/201709/699473-20170904161241163-508849893.png)
停止下来
docker stop 2c209c0636f4
分享你的镜像
先去官网注册一个账号。
连接 Docker login
标记你的镜像
命令
docker tag image username/repository:tag
例子
docker tag friendlyhello archimate/get-started:part1
结果
![](https://images2017.cnblogs.com/blog/699473/201709/699473-20170904161834616-1346802067.png)
发布你的镜像到注册中心
之后,就可以从远程来使用这个镜像了
docker run -p 4000:80
archimate/get-started:part1。
到此,容器已经创建并发布成功,下一章介绍如果在服务中运行容器并扩展。