Jasper Ji

开口不在舌头上

0%

学习Docker使用

去年年底的时候,当时有简单的研究下Docker,不过只是下载了一些类似MongoDB的镜像运行了下,感觉Docker非常适合安装这些软件。最近开始看Kubernetes,Docker的研究难免,那么如何把现有项目打包成一个Docker镜像以及运行,去年好像有简单的试下,不过有点遗忘,再次运行发现一些问题。

准备

这里运行Flask的一个简单例子,只为演示。创建一个文件flask_test的文件夹,

目录文件

1
2
3
app.py
requirements.txt
Dockerfile

app.py,默认host是127.0.0.1,这里有个问题就是打包成镜像,无法访问端口。在mac和linux都一样,具体可以参考这篇文章《Connection refused? Docker networking and how it impacts your image》

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)

requirements.txt,这个主要是放置python依赖库,目前只有flask一项。

1
flask

Dockerfile,这个是Build Docker的配置文件,EXPOSE 5000这个是指定容器内部的端口的,在Mac使用Docker客户端启动镜像时会有出现在设置里面。在Linux上构建镜像时出现下载python依赖https的错误SSL: CERTIFICATE_VERIFY_FAILED,需要去掉验证,RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org -r requirements.txt,下面这个是在Mac上可以运行的配置。

1
2
3
4
5
6
7
8
9
10
11
FROM python:3.9
WORKDIR /code
EXPOSE 5000

COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

CMD ["python", "app.py"]

构建

构建Docker镜像,在当前目录运行该命令,记得不要忽略这个.,另外镜像的名字不能出现大写,我一直开始写成testFlask,结果构建失败。

1
sudo docker build -t 'testflask' .

####运行
下面这个是以后台形式运行容器,8000是外部的访问端口,5000是容器内的端口。

1
docker run -p 8000:5000 -d testflask

常用命令

Mac上我会用Docker Desktop,不过Linux上还是命令行是王道。主要记几个常用的命令。

1
2
3
4
docker ps # 列出运行的容器
docker images # 列出当前的所有镜像
docker rm 容器ID # 删除指定的容器
docker rmi 镜像ID # 删除指定的镜像

后记

目前打包出的镜像居然有900多M,只有一个python和flask的依赖,觉得可能还是研究的不够。通过这个例子,发现还是得找本Docker的书籍系统的研究下,问题解决了,但是缺乏理论依据。

更新

因为初次接触docker,后来发现可以使用基础版本,修改Dockerfile文件FROM python:3.9-alpine,最后打包后50M。