项目部署时用到了docker,以下分享了我在实践中使用的指令,和对docker一些个人的理解(※和字体加重部分)
本文选择使用网易的镜像源:https://c.163.com/hub#/m/home/
服务器环境nginx+uwsgi+django+celery+supervisor
1,常用指令:
-拉取镜像到本地库:docker pull hub.c.163.com/public/centos:6.7-tools
-新建Dockerfile文件(内容见2)
-依据Dockerfile去建立定制的镜像:docker build -t myproject/ubuntu:16.04 . (Dockerfile所在路径)
-镜像操作方法:
1,查看所有镜像:docker images
2,查找镜像:docker search image_name
3,删除镜像:docker rmi image_name
-容器的操作方法:
1,运行容器(其实是新建一个容器):docker run -d -it -p 80:80 -v /host_path:/container_path wlxy_quant_p/ubuntu:16.04(-p -v 可指定多个)
※虽然容器有持久化(停止后数据不丢失),但是建议容器中所用数据不要保存在容器中,将所有data和配置目录都要外挂到宿主机上
2,查看所有容器:docker ps -a (不加参数就是查看正在运行的容器)
3,删除所有容器:docker rm `docker ps -a -q` (删除单个容器:docker rm Name/ID )
4,停止、启动、杀死一个容器 :docker stop/start/kill Name/ID
5,容器中取日志:docker logs Name/ID
6,列出容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的:docker diff Name/ID
7,显示一个运行的容器里面的进程信息 :docker top Name/ID
8,从容器里面拷贝文件/目录到本地一个路径 :docker cp Name/ID:/container_path to_path
9,进入正在运行的容器:docker exec -it ID /bin/bash
10,将容器导出为镜像:docker commit ID image_name
2,Dockerfile内容
※我之前的对于镜像和容器的理解有误,其实镜像相当于类,而容器相当于对象,对象可以变更和添加自己的属性等
※所以个人认为镜像主要做一些通用内容安装和配置,比如python服务器镜像都需要安装web框架等其他通用的库,不用像下面这样把所有配置全部做到镜像里
※以下部分指令是可以在容器运行后再进入容器执行
FROM hub.c.163.com/public/ubuntu:16.04-tools #源镜像 MAINTAINER adam.ding , [email protected]126.com COPY requirements.txt /tmp/ #拷贝python需要安装文件 RUN apt-get update && apt-get -y install python3-pip libmysqlclient-dev python3-dev #python3-pip网易源没有 RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list RUN apt-get update && apt-get install -y nginx redis-server git #下载一些基础服务 RUN mkdir /root/.pip #home目录 COPY pip.conf /root/.pip #拷贝更改的源配置文件 RUN pip3 install --upgrade pip RUN pip3 install matplotlib #此处不能放入requirement 必须分别安装 RUN pip3 install numpy COPY nginx-start.conf /etc/supervisor/conf.d #拷贝nginx配置文件 RUN pip3 install pandas==0.17.1 RUN pip3 install zipline==1.0.2 COPY uwsgi.ini /usr/local/etc/#拷贝uwsgi配置文件 RUN pip3 install uwsgi COPY vue-dist /usr/local/src/dzh/#将打包好的vue项目文件夹拷贝到指定目录 RUN pip3 install --requirement /tmp/requirements.txt RUN mkdir /usr/local/src/dzh WORKDIR /usr/local/src/dzh #切换到目录 RUN git clone https://username:[email protected]/xx.git WORKDIR /usr/local/src/dzh/squant_tools RUN python3 setup.py build_ext --inplace#安装系统 WORKDIR /etc/nginx/sites-enabled/ RUN mv default default.bb #将默认读取配置文件改名 COPY nginx.conf . WORKDIR /usr/local/src/dzh/simple_login RUN python3 setup.py install COPY squant_tools.conf /etc/supervisor/conf.d CMD supervisord /etc/supervisor/supervisord.conf
ENV FC_SERVER server.xx.com.cn #配置环境变量
3,部分其他文件的配置
uwsgi.ini内容: [uwsgi] http-socket = :8000 plugin = python3 wsgi-file = /usr/local/src/dzh/squant_tools/quant/wsgi.py chdir= /usr/local/src/dzh/squant_tools module = quant.wsgi processes = 4 master=True vacuum=True 使用supervisor启动以下进程 squant_tools.conf内容: [program:squant_tools] command = uwsgi /usr/local/etc/uwsgi.ini stopsignal=KILL autostart=true autorestart=true stdout_logfile=/usr/local/etc/supervisor_stdout.log stderr_logfile=/usr/local/etc/supervisor_stderr.log redirect_stderr=true nginx-start.conf内容: [program:nginx] command = service nginx start process_name=%(program_name)s numprocs=4 ; 启动几个进程 autostart=true ; 随着supervisord的启动而启动 autorestart=true ; 自动重启。。当然要选上了 startretries=10 ; 启动失败时的最多重试次数 stopsignal=KILL ; 用来杀死进程的信号 stopwaitsecs=10 ; 发送SIGKILL前的等待时间 redirect_stderr=true ; 重定向stderr到stdout requirements.txt内容: django mysqlclient psycopg2 cython pymssql celery django-cors-headers click cn-stock-holidays redis zipline_cn_databundle