一、下载docker
在Docker官网.中找到对应的mac下载。
点进来后,选择自己电脑对应芯片的版本开始下载,我自己是m1芯片的。
二、在MAC电脑上安装和运行docker
1.双击Docker.dmg打开安装程序,然后将 Docker 图标拖到 Applications 文件夹。
2. 双击Docker.appApplications 文件夹以启动 Docker。在下面的示例中,Applications 文件夹处于“网格”视图模式。
3. Docker 菜单 ( ) 显示 Docker 订阅服务协议窗口。它包括对 Docker Desktop 使用条款的更改。
4. 单击复选框表示您接受更新后的条款,然后单击接受继续。接受条款后,Docker Desktop 将启动。
5. 可以在终端中用docker -v
来查看当前docker版本,也可以用docker ps
来查看docker当前拥有的镜像有哪些
三、部署Flask项目
1.首先,这是我的一个简单的Flask项目
代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8090, debug=False)
这里注意 要指定host为0.0.0.0
如果不指定的话,默认的是127.0.0.1,只能本地访问,将host设置成0.0.0.0
后解决了这个问题。
2.生成requirements.txt
pip install freeze -> requirements.txt
来生成所需的依赖包文件
3.编写dockerFile文件
dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
FROM python:3.7.3
# FROM:指定基础镜像,必须为第一个命令
# FROM <image>:<tag>
# tag是可选的,如果不使用这个值时,会使用latest版本的基础镜像
# tag为版本号
ADD . /flaskproject/
# ADD 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
# ADD source target
# ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
# ADD hom* /mydir/ # 添加所有以"hom"开头的文件
# ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
# ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
# ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
WORKDIR /flaskproject
# WORKDIR:工作目录,类似于cd命令
# 示例:
# WORKDIR /a (这时工作目录为/a)
# WORKDIR b (这时工作目录为/a/b)
# WORKDIR c (这时工作目录为/a/b/c)
# 注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r /flaskproject/requirement.txt
# RUN:构建镜像时执行的命令
# 有以下两种命令执行方式:
# shell执行
# 格式:RUN <command>
# exec执行
# 格式:RUN ["executable", "param1", "param2"]
# 示例:
# RUN ["executable", "param1", "param2"]
# RUN apk update
# RUN ["/etc/execfile", "arg1", "arg1"]
# 注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
WORKDIR service
CMD python3.7 app.py
# CMD:构建容器后调用,也就是在容器启动时才进行调用。
# 格式:
# CMD ["executable","param1","param2"] (执行可执行文件,优先)
# CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
# CMD command param1 param2 (执行shell内部命令)
# 示例:
# CMD echo "This is a test." | wc -
# CMD ["/usr/bin/wc","--help"]
# 注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
完整代码:
FROM python:3.7.3
ADD . /flaskproject/
WORKDIR /flaskproject
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r /flaskproject/requirement.txt
WORKDIR service
CMD python3.7 app.py
4.构建dockerImage镜像
在项目文件里执行
docker build -t flaskpro .
注意:这个.
是必须的,它代表着在当前目录下找dockerfile,
docker build的语法是
docker build [OPTIONS] PATH | URL | -
-f :指定要使用的Dockerfile路径;
–rm :设置镜像成功后删除中间容器;
–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
语句运行后,docker就会自动构建python环境了。
同时,DockerDesktop也出现了我们构建的镜像。
5. 运行docker镜像
docker run :创建一个新的容器并运行一个命令
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
我们这里就使用这个语句就好了
docker run -p 8000:8090 -d flaskpro
这里的8000是主机的地址,8090是docker向外开放映射的地址
回到DockerDesktop客户端,发现images多了一个in use
的图标,我们点进去就能看到正在运行的image实例了。
再点击这个实例,我们可以查看它的具体运行情况
这里面有三个选项卡,第一个就是终端的日志
第二个就是配置详情
第三个是系统资源状态
然后我们就可以在浏览器地址栏输入
localhost:8000
来访问你的项目了
这几个按钮的话,第一个是在浏览器中打开,第二个是容器内的终端,第三个是停止容器,第四个是restart,第五个是删除
要想删除的话,得先停止运行image才行
其他命令:
停止运行中的容器flaskpro
docker stop flaskpro
重启容器flaskpro
docker restart flaskpro
附一个大佬的教程视频
https://www.bilibili.com/video/BV1Gt41157eQ?from=search&seid=16025884014759342622&spm_id_from=333.337.0.0