Docker从2013年发布至今,一直是广受瞩目,因此咱们或多或少也应该了解一些Docker的技术原理,而学习一项技术有了兴趣才能更好的让你持续学习下去。若是让你体会到Docker的神奇之处那么兴趣或许会大一点,接下来咱们就先从自定义一个本身的Docker容器镜像来开启学习Docker的第一步。html
在开始咱们的实践以前,咱们固然得在机器上安装Docker,请参考官方文档python
安装完Docker之后咱们就须要编写咱们要部署的项目代码了,咱们简单的部署一个用Python编写的Web应用,若是是以前部署到虚拟机中的话咱们得在虚拟机中安装各类环境才能将此项目部署成功。而如今在Docker中咱们只须要一个文件就能将环境所有打包成一个镜像而且运行。docker
from flask import Flask import socket import os app = Flask(__name__) @app.route('/') def hello(): html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname()) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
这个程序咱们在本机启动的话在浏览器中输入 http://0.0.0.0:80/
便可访问到后台打印的信息。接下来咱们就将其制做成镜像。flask
制做镜像的关键一步就是制做Dockerfile文件,在Dockerfile中经过Docker提供的一些命令编写一套执行流程来制做镜像。windows
# 使用官方提供的 Python 做为咱们镜像的基础环境 FROM python:2.7-slim # 将工做目录切换为 /Users/hupengfei/Downloads/docker/test WORKDIR /Users/hupengfei/Downloads/docker/test # 将当前目录下的全部内容复制到 /Users/hupengfei/Downloads/docker/test 下 ADD . /Users/hupengfei/Downloads/docker/test # 使用 pip 命令安装这个应用所须要的依赖 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 容许外界访问容器的 80 端口 EXPOSE 80 # 设置环境变量 ENV NAME World # 设置容器进程为:python app.py,即:这个 Python 应用的启动命令 CMD ["python", "app.py"]
下面介绍一些上面Dockerfile中用到的命令做用浏览器
此时咱们看到咱们的目录中存放的文件为app
hupengfei@localhost ~/Downloads/docker ls Dockerfile app.py requirements.txt test
此时在存放Dockerfile目录下执行一下命令curl
docker build -t helloworld .
其中-t是为此镜像起一个名字,其中此命令会自动的加载本路径下的Dockerfile文件中内容,按顺序执行命令来建立镜像。此时能够经过如下命令查看已经建立的镜像socket
hupengfei@localhost ~/Downloads/docker docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest c91cf8925eba 34 seconds ago 130MB
接下来经过dokcer run
命令进行启动镜像tcp
hupengfei@localhost ~/Downloads/docker docker run -p 4000:80 helloworld * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
其中4000:80
意思是将宿主机的4000端口映射到镜像中的80端口上,此时咱们用docker ps
就能够看到启动的docker镜像了
hupengfei@localhost ~ docker ps CONTAINER ID IMAGE COMMAND CREATED 1f1e5affd99e helloworld "python app.py" 23 seconds ago
此时访问页面也可以访问到
hupengfei@localhost ~ curl http://localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 1f1e5affd99e<br/>%
若是咱们不指定绑定4000端口的话,那么就会在宿主机上随机分配一个端口与镜像进行链接
hupengfei@localhost ~/Downloads/docker docker run -p :80 helloworld * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
此时咱们经过docker port id号
可以查询到宿主机与镜像对应链接的端口号
hupengfei@localhost ~ docker port 1a93958d31b1 80/tcp -> 0.0.0.0:32769
在Docker Hub上注册帐号
登陆进去后在主页点击Create a Repository
填写信息
在本机登陆本身的Docker Hub 帐号,命令是docker login
用docker tag
命令为本身的镜像取一个完整的名字包括版本号,v1为版本号
docker tag helloworld 刚才建立的帐户名字/helloworld:v1
将刚才所自定义的镜像上传上去,命令是docker push buxuewushu/helloworld:v1
,其中buxuewushu
是换成本身的帐号,后面是刚才打的标签名
此时你就能够在Docker Hub中看到本身上传的镜像了
本文的例子参考自极客时间中张磊写的深刻剖析Kubernetes,有兴趣的能够查看