大家好,我是kuls。
今天我们主要来聊一聊关于Docker相关的内容。
相信很多读者朋友都有自己写过项目,也曾想过如何使用Docker来进行部署。
但是网络上很多文章都写得零零碎碎,反倒让人有些懵逼。
今天K哥用通俗易懂的话语来把大体的思路给大家理一遍,这也是讲的最基础的打包部署。
你必须掌握的内容!
首先想要使用Docker来打包部署,那么你就得去了解一下Docker,至少要会安装吧。
K哥在很早很早以前写过一篇关于Docker的基本操作,大家可以看看:Python分布式爬虫-必须掌握的Docker基础!
你了解了Docker的基本操作,你还需要去了解一下Dockerfile。
关于Dockerfile的基本语法学习,你可以看看https://www.runoob.com/docker/docker-dockerfile.html
首先k哥得给你说的就是,我们的打包都是基于Dockerfile来实现的。
也就是说,我们需要在Dockerfile里面完成我们所有需要的东西,有哪些东西呢?
例如运行环境、代码或者编译后的运行文件等等。
首先我们需要去配置的就是我们的运行环境,如何配?
通过FROM关键词,例如我需要一个python3.6的环境:
FROM python:3.6
我们只需要在Dockerfile里面编写如上的代码,就能够拉取到一个python3.6的环境。
同理其他语言也是,例如.net:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
还有前端项目:
FROM nginx
具体的环境大家可以通过docker search 来进行搜索。
这是我们的第一步。
下一步我们也许会去定一个根目录,注意是也许,不是一定。
WORKDIR /app
WORKDIR的意思就是让后面的路径成为根路径,注意哦,这里的路径是docker里面的路径。
然后,我们就会把代码或者是编译完成之后的运行文件COPY到docker当中
COPY . .
上面就是COPY+本地路径 +docker中的路径
也就是本机当前路径文件,拷贝到docker中的路径中。
在Python中,我们还需要去安装一些Python库,所以你可能还需要这个操作:
RUN pip install -r requirements.txt
RUN 后面接的就是一个命令行。
安装完成之后,你需要去暴露一下端口
EXPOSE 80
这样能够让我们后续将docker中的端口和本机中的端口进行映射,从而我们可以通过本机ip+端口来进行访问操作。
最后一步就是运行,当然如果是Python我们就可以直接运行了,但是有一些语言框架可能不行,因为它可能还需要进行一次编译,然后再运行编译后的文件,所以这里大家需要注意了。
如果你不想在docker打包过程中编译,你也可以在本机中编译完,直接运行编译后的文件。
当然在Python中我们直接运行Python即可。
CMD ["python","main.py"]
在.NET环境下可能就是这样的姿势:
ENTRYPOINT ["dotnet", "HubService.dll"]
在前端项目中,我们就不需要再去运行啥,直接部署到Nginx上就行了,例如下面:
FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
也就是我们自己在本机上写个Nginx的配置文件,然后COPY过去就行了。
好了,上面大致就是打包的整个过程与思路,每个框架,每个语言都会有不一样,所以没有准确的答案,准确的答案在官方文档中一般有所体现。
这里也给大家汇总一下python的dockerfile
FROM python:3.6
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
EXPOSE 80
CMD ["python","app.py"]
编写完dockerfile,我们一般喜欢放在需要打包的地方的根路径,然后直接运行
docker build -t 你想要的名字 .
docker build -t pythondemo .
运行之后,docker会自动完成dockerfile里面的每一个步骤。
打包完成后,我们就可以看到images。
大家直接docker images 即可。
随后,我们就可以来创建容器了。
docker run -d -p 5000:80 pythondemo
docker run -d -p 要映射的本机端口:docker中项目运行的端口 镜像名称
如果你映射完后,还是发现无法访问,可以看看防火墙或者端口是否被占用。你也可以尝试去映射docekr中的80端口。
映射完成之后就可以通过你本机的ip+端口进行访问了!