先编写一个简单的flask程序
vim app.py
from flask import Flask
import redis
app = Flask(__name__)
# 链接redis做容器间关联验证效果用
rd = redis.Redis(host='redis',port=6379)
@app.route('/')
def hello():
# Redis Incr 命令将 key 中储存的数字值增一。
# 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
# 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
# 本操作的值限制在 64 位(bit)有符号数字表示之内。
count = rd.incr("hits")
return "hello world".format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0",port=5000)
编写Dockerfile
vim Dockerfile
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
FROM python:alpine
LABEL version="1.0"
LABEL description="demo image" # 简介
COPY . /code
RUN pip install flask redis && pip install xxx # 或者写多行
WORKDIR /code
EXPOSE 5000
CMD ["python","app.py"]
常用命令解释:
FROM:指定一个基础镜像(父镜像),必须为第一行,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令。
FROM python:alpine
镜像名:版本
LABEL:为镜像添加标签。一个 LABEL 就是一个键值对。
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 例:
LABEL version="1.0" description="描述" by="创建者"
注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
COPY:将主机中的某目录下的内容拷贝到镜像中指定目录下
COPY host-Dir image-dir
[主机目录] [镜像目录]
RUN:在镜像容器中执行命令,有两种命令执行方式:
# 1、shell执行
RUN <command>
# 2、exec执行
RUN ["executable", "param1", "param2"]
WORKDIR:配置工作目录。为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
EXPOSE:容器暴露的端口号。在启动容器时需要通过 -P 参数让 Docker 主机分配一个端口转发到指定的端口。使用 -p 参数则可以具体指定主机上哪个端口映射过来。
CMD:容器启动时执行指令,每个 Dockerfile 只能有一条 CMD 命令
VOLUME:创建一个可以从本地或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
VOLUME ["/data"]
# 指令添加多个数据卷
VOLUME ["/data1", "/data2"]
构建容器
docker build -t myweb .
-t:指定镜像名称
. 指定创建时的目录,可dockerfile文件中的 COPY 后的目录是同一级
启动该镜像前,先准备一个redis容器
docker pull redis:alpine # 拉取redis:alpine镜像
docker inspect redis:alpine # 查看必要信息
mkdir /redis-data # 创建redis数据存储文件夹
docker run -d --name redis -v /redis-data:/data redis:alpine --requirepass "123456" --appendonly yes
# --name 指定容器名字
# -v 挂载目录
# --requirepass 设置密码;
# --appendonly yes 数据持久化
启动镜像
docker run -d --rm --link redis -p 5000:5000 myweb
# --link 绑定 redis 容器,redis为redis容器指定的name,也可以使用redis容器的ID;
# -p:指定映射的端口,不然无法访问
效果查看:
可以通过 localhost:5000 来访问该服务,然后通过redis客户端等工具查看redis中的key值。