镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是
Dockerfile。
- 新建文件夹
- 进入文件夹,编辑Dockerfile文件
FROM python:3.9-slim
WORKDIR /app
ADD . /app
VOLUME ["/data_flask"]
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
ENV AUTHOR AE_fromcali
CMD ["python", "app.py"]
- vim一个requirement.txt文件(所需环境)
[root@ae_docker mydocker]# cat requirements.txt
Flask
Redis
- 新建app.py 编辑程序文件
[root@ae_docker mydocker]# cat 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 = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name},i am ae!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {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)
- 生成镜像文件
[root@ae_docker mydocker]# docker build -t ae_friendlyhello_2 .
(一定不要把最后一个点丢了,表示当前目录下)
顺便验证一下是否创建成功
[root@ae_docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ae_friendlyhello_2 latest 3858c193d323 17 minutes ago 133MB
ae_friendlyhello_1 latest 74e1f243dd0b About an hour ago 159MB
- 启动redis容器
[root@ae_docker mydocker]# docker run -d -p 6379 --name ae-redis-2 redis
- 启动一个自己制作镜像的容器,链接到redis容器
[root@ae_docker mydocker]# docker run -d --name ae-hello-2 -p 5080:80 --link ae-redis-2:redis ae_friendlyhello_2
- 测试一下(也可以curl)
成功。