参考官方文档
介绍
是时候使用Docker的方法来构建app了。我们从container —— app的底层构建开始。在这一层的上方是服务,他定义了一个产品中的containers的行为,这个会在后面介绍。最顶层是stack,他定义了服务的所有交互。
- Stack
- Services
- Container (you are here)
开发环境
一般情况下,如果想搭建一套开发环境,首先需要安装一大堆的依赖,很多人相比都经历过这样的痛苦,例如一个Python应用,你必须先安装Python的运行环境。
使用Docker,您可以将可移植的Python运行时作为镜像(image)获取,无需安装。构建时可以在应用程序代码旁边包含基本Python镜像,这样可以确保您的应用程序,其依赖项和运行时都一起运行。
这些可移植镜像统称为Dockerfile。
Dockerfile
Dockerfile定义了你的container内部环境。
对网络接口和磁盘驱动器等资源的访问需要在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将内部端口映射到外部,并具体说明要“复制”哪些文件到那个环境。但是,在执行此操作之后,您可以预期这个Dockerfile定义的应用程序在其运行的任何位置都会完全相同。
创建Dockerfile
新建一个文件夹,新建一个文件命名为Dockerfile,复制以下内容
# 使用官方 Python runtime 作为父镜像(image)
FROM python:2.7-slim
# 设置工作区 /app
WORKDIR /app
# 把当前路径下的所有文件拷贝到容器中的 /app
ADD . /app
# 安装所有requirements.txt中定义的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 向容器外暴露80端口
EXPOSE 80
# 定义环境变量
ENV NAME World
# container启动时执行 app.py
CMD ["python", "app.py"]
创建App
这个稍微有一点python基础的都可以看懂,没有基础的也能看明白大致意思
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 = "cannot connect to Redis, counter disabled"
html = "Hello {name}!
" \
"Hostname: {hostname}
" \
"Visits: {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)
构建App
目前我们的文件夹下应该有以下三个文件
$ ls
Dockerfile app.py requirements.txt
执行build操作,这会创建一个Docker image,我们使用 -t
让他有一个有好的名字
docker build -t friendlyhello .
查看你的构建结果
$ docker image ls
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
运行App
将本机端口4000映射到容器的已发布端口80 -p:
docker run -p 4000:80 friendlyhello
// 后台模式
docker run -d -p 4000:80 friendlyhello
访问 http://localhost:4000
即可查看结果。
使用后台模式启动时,会返回一个应用程序的长容器ID。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
停止这个进程
docker container stop 1fa4ab2cf395
共享image
Docker提供了想github一样的平台,用于多人共享。
如果您没有Docker帐户,请在hub.docker.com上注册一个帐户 。记下您的用户名。
登录本地计算机上的Docker公共注册表。
$ docker login
将本地映像与注册表上的存储库相关联的表示法是 username/repository:tag
。标签是可选的,但建议使用。
现在,把它们放在一起来标记图像。docker tag image
使用您的用户名,存储库和标记名称运行,以便将图像上载到所需的目标位置。该命令的语法是:
docker tag image username/repository:tag
例如:
docker tag friendlyhello nowheretorun/get-started:master
运行docker image ls以查看新标记的图像。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 71d87c79fd0e 4 hours ago 132MB
nowheretorun/get-started master 71d87c79fd0e 4 hours ago 132MB
hello-world latest 4ab4c602aa5e 4 days ago 1.84kB
python 2.7-slim c9cde4658340 7 days ago 120MB
发布
docker push username/repository:tag
这样之后,就可以直接拉取并执行一个远程仓库的镜像
如果映像在计算机上不可用,则Docker会从存储库中提取映像。
常用命令
进入容器(有四种方式,先只记最方便的一种)
docker ps // 查看 CONTAINER ID
docker exec -it 69f6eecda047 /bin/bash// 根据ID 进入容器
停止服务
docker container stop 69f6eecda047 // CONTAINER ID