有时候我们需要将我们的程序成为“热插拔”,也就是别人打开开关就运行,关闭就不运行,docker容器相当于一个盒子,这个盒子有个开关,我们只要让我们的程序一直运行在docker容器里面,即可实现。docker创建容器,容器里面需要配置我们的程序所需要的环境,还需要放我们的程序的镜像,让镜像一直在容器中运行,然后通过docker启动或者停止容器来实现“热插拔”,(热插拔是我自己起的名字,我觉得跟网络那里的概念有点像)

首先就是下载docker,根据版本自行下载。在封装进入docker之前,你的程序一定是可以在本地(即你的电脑)跑通的。
然后将我们的项目,比如就叫A项目,把所有文件放在A文件夹下,且A文件夹里面放运行的py文件,如,run.py
此时,在A文件夹下执行终端命令:pip3 freeze > requirement.txt    ## 这个可以产生你的项目中所有需要的依赖包及其版本
然后就是编写Dockerfile,必须是这个名字,这个文件就是将你的代码打包进入docker(即build操作),docker唯一编译的文件,所以所有文件都写到这里。

[我建议,将你的项目文件夹(就是A文件夹)重新放在一个新的文件夹下(如A_docker),在A_docker文件夹下放A文件夹和Dockerfile文件]

### 编写Dockerfile

FROM python:3.8       # 拉取一个基础镜像,这样我们的项目可以在这个基础镜像使用,比如简单的import time math这些包都是有的
MAINTAINER tianye     # 维护者信息
ADD ./A/ /code/A/       # 将你的项目文件放到docker容器的/code/A文件夹,这里code是在根目录的,与usr  opt  etc等等在一个目录,而且必须是/code/A/ 如果不加/A/ 那么你本地A文件夹里面的所有东西将直接放到code文件夹下,会导致目录结构乱,如果你还导入了自己写的程序,那么会报错。
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone    # 设置容器时间,有的容器时间是西方时间,跟我们本地相差8小时!
ENV LANG C.UTF-8      # 设置语言为utf-8
ENV PATH=$PATH:/usr/local/lib/python3.8/   
ENV PYTHONPATH $PATH    # 将python路径加入到环境变量
WORKDIR /code/A      # 设置工作目录
RUN pip3 install --default-timeout=1000 -r requirements.txt  # 根据requirement.txt下载好依赖包
EXPOSE 9090          # 暴漏端口,使得容器可以访问第三方网址,比如百度  阿里,这个端口是自己设置的,只要跟别的容器的端口不冲突即可。
CMD "python3""run.py""runserver" "0.0.0.0:9090"  # 启动项目,CMD最好只写一个

 

 现在Dockerfile已经写完了,在运行RUN pip3 install --default-timeout=1000 -r requirements.txt的时候可能会报错,如果下载的时候,提示找不到包,那么只能下载到本地,建议下载.whl文件,我是这么干的,我把所有需要的包手动下载,放到与Dockerfile一个目录下,
然后编写Dockerfile 的时候,把上面第7行RUN pip3 install --default-timeout=1000 -r requirements.txt 换成   ADD redis-3.5.3-py2.py3-none-any.whl /usr/local/lib/python3.8/   ADD PyMySQL-0.10.1-py2.py3-none-any.whl /usr/local/lib/python3.8/   RUN pip3 install /usr/local/lib/python3.8/*.whl
也可以成功配置环境。如果没有对应的.whl文件,只有.tar.gz文件,那么就别指望用tar -zxvf *.tar.gz解压了,python3 */setup.py install 安装成功了,基本8可能。此时还是使用最简单的 RUN pip3 install * 下载吧 ,比如DBUtils就没有whl文件,运行RUN pip3 install DBUtils居然成功了!感谢主!

### 然后制作镜像并启动容器

docker build -t imagename Dockerfilepath
# imagename为给你的程序的镜像名字,Dockerfilepatheg为所在文件夹名称,当前名录为 “.”
# eg:docker build -t A_image .
docker run -it -p 0.0.0.0:9090:9090 -d --name A_container A_image #在容器中运行镜像 -p用来指定端口,-d:以后台方式运行容器,返回容器ID,即以守护进程方式启动 --name:容器名字
docker logs -f --tail 200 A_container  #查看日志,-f:跟踪日志输出  -t:显示时间戳  --tail:仅列出最新的N条容器日志

 

最后如果还是不能访问第三方网址,那么等docker所有容器都不在测试的状态,重新启动docker。 systemctl start docker