先编写一个简单的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值。