为了了解Docker到底是个什么东西,有什么作用,我们可以先参照Docker官方文档来创建我们的第一个Docker App,下面的步骤是在Ubuntu 16.04上进行的,其他系统可能只需要进行少量改动
我们的第一个App是一个简单的Flask Web应用,使用Flask自带的单线程HTTP服务器运行
1. 创建requirements.txt, 这个文件用来给pip安装Python库的,我们只需要Flask这一个库,内容如下:
Flask
2. 创建app.py,代码十分简单,仅有一个URL的Web应用,运行时占用80端口,内容如下:
from flask import Flask
import os, socket
app = Flask(__name__)
@app.route("/")
def hello():
html = "Hello {name}!
" \
"Hostname: {hostname}
"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80)
3. 创建Dockerfile文件,这个文件可以理解成Docker容器的配置文件吧,
内容如下:
第一行的FROM后面其实也是一个Docker镜像,里面已经安装了Python 2.7,后面的内容其实浅显易懂
# 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"]
4. 我们查看当前目录结构如下:
$ tree .
.
├── app.py
├── Dockerfile
└── requirements.txt
0 directories, 3 files
5. 创建Docker镜像,命令如下, demo是镜像名,你可以根据需要自行定义:
$ docker build -t demo .
Sending build context to Docker daemon 4.096kB
Step 1/7 : FROM python:2.7-slim
---> 4fd30fc83117
Step 2/7 : WORKDIR /app
---> Using cache
---> f3dcad317b5e
Step 3/7 : ADD . /app
---> Using cache
---> 8f7a6ce701c7
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Using cache
---> aaa35fe5c80a
Step 5/7 : EXPOSE 80
---> Using cache
---> 87964d8d273c
Step 6/7 : ENV NAME World
---> Using cache
---> 37a5f7259600
Step 7/7 : CMD ["python", "app.py"]
---> Using cache
---> 9fe935f31017
Successfully built 9fe935f31017
Successfully tagged demo:latest
6. 镜像创建后会存放在本地的某个目录下,你可以通过以下命令进行查看:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo latest 9fe935f31017 17 minutes ago 148MB
7. 接下来我们使用该镜像运行一个Docker容器,这就是我们的第一个Docker应用:
其中-d参数用于让容器在后台运行,-p参数用于将容器的端口映射到宿主机的某个端口上,这里也即将容器的80端口映射到主机的
4000端口上,demo即为镜像名
$ docker run -d -p 4000:80 demo
004c19687d267dd8b72c33840e80c509e35845e05c6022531fac19396c965d43
8. 我们打开浏览器访问主机的4000端口,可以看到如下网页,大家不要纠结马赛克下面是什么:
9. 你也可以验证下,在你的主机上其实并没有安装pip和Python的Flask库,这就是Docker的魔法呢!