1安装docker
2根据dockerfile requirement生成一个镜像
进入镜像 check镜像是否符合要求
3.在原有的镜像上添加功能
3.1利用dockerfile
3.2 进入镜像安装 之后commit
4 编写 docker-compose.yml
5 利用docker-compose 让主机里的代码使用该镜像运行
6 makemigrations和 makemigrate
7 浏览器通过外(公)网访问
先明确如果要在自己windows上来封装容器就下docker desktop。然后你可以本地做好容器commit到docker hub,在服务器上pull你自己做好的image就可以了。
直接上阿里云服务器封装就直接上服务器安装。给个传送门,讲的很清楚。
https://www.jianshu.com/p/f02d63ee98e0
如果还是没懂,具体怎么开始部署,那可以看我这个blog,我们从安装xshell开始
https://blog.csdn.net/weixin_41147129/article/details/104920735
win安装 docker desktop
安装前提:
1 那么首先检查电脑的虚拟化开启了没有:进入任务管理器(ctrl+alt+delete),点击性能->cpu ,查看虚拟化是否已启用,如果虚拟化是已禁用,那么你需要重启电脑进入bios开启虚拟化(我们的发的笔记本cpu都是支持虚拟化的,重启时进入bios按esc -> 再按f12 -> 去开启虚拟化)
开启虚拟化重启后,进入任务管理器看虚拟化是否已启用。
2
然后再是进入电脑的控制面板->程序->启用或关闭Windows功能->把Hyper-v勾上,启用后电脑会重启,后面就可以下载并安装Docker for Windows了。
Ps: Windows: 不建议系统是家庭版的用户 强行增加hyper-v,容易引起docker和虚拟机混乱。
Runtimeerror: 当pip和apt-get的时候遇到连接不上网络,urllib3 runtimeerror相关问题,建议换源 具体可上网查询 pip换源
给大家一个宝贝,DockerDesktop在官网下载实在太慢,太慢了,这里给出 docker Windows 的百度云资源链接
链接:https://pan.baidu.com/s/1KiEsAzz1gbeIhmZhfnSIYg
提取码:rmn8
$ docker images
看现有镜像
$ docker ps
查看现有容器
$Vim requirement.txt
#你需要在python里面装的包都可以放在requirement里面
requirment :
Django
zmq
django-registration
stripe
mysql
apscheduler==2.1.2
opencv-python
$vim dockerfile
Dockerfile:(这个文件名是固定的)
FROM python:3.6
#3.6不用声明系统是ubuntu还是Windows ,python36可以跨平台
ENV PYTHONUNBUFFERED 1
RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -yq install sqlite3 && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#如果是centos这两句就不用跑了,这两句是ubuntu的
#run后面是你要安装的东西 可以理解为在镜像里面run了这个指令
#可以把需要安装的包全部声明在requirement.txt里面也可以 run 一个个安装
RUN mkdir /code
#在你的镜像里创造一个文件夹
WORKDIR /code
#把镜像的工作地址设置为那个文件夹
ADD requirements.txt /code/
#把主机上的 requirement.txt添加到刚刚创立的文件夹里面
RUN pip install -r requirements.txt #运行根据requirement.txt安装
ADD . /code/
#把当前目录的内容添加到code文件夹里
这和上面的内容是一样的,上面是为了方便你看。
FROM python:3.6
#3.6不用声明系统是ubuntu还是Windows ,python36可以跨平台
ENV PYTHONUNBUFFERED 1
RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -yq install sqlite3 &&
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#如果是centos这两句就不用跑了,这两句是ubuntu的
#run后面是你要安装的东西 可以理解为在镜像里面run了这个指令
#可以把需要安装的包全部声明在requirement.txt里面也可以 run 一个个安装
RUN mkdir /code
#在你的镜像里创造一个文件夹
WORKDIR /code
#把镜像的工作地址设置为那个文件夹
ADD requirements.txt /code/
#把主机上的 requirement.txt添加到刚刚创立的文件夹里面
RUN pip install -r requirements.txt #运行根据requirement.txt安装
ADD . /code/
#把当前目录的内容添加到code文件夹里
requirement.txt:
我也po一下我都的requirement.txt给大家做个参考
confusable-homoglyphs==3.2.0 # via django-registration
django-friendly-tag-loader==1.3.1
django-registration==3.0.1
django-widget-tweaks==1.4.5
django==2.2.10
djangorestframework==3.11.0
fasteners==0.15
monotonic==1.5 # via fasteners
pillow==7.0.0
psycopg2-binary==2.8.4
pytz==2019.3 # via django
six==1.13.0 # via fasteners
sqlparse==0.3.0 # via django
xlrd==1.2.0
Faker==4.0.2
Pillow==7.0.0
requests==2.18.4
同样的这里上下两块内容是一样的 放在代码框里面看的清楚一点。
confusable-homoglyphs3.2.0 # via django-registration
django-friendly-tag-loader1.3.1
django-registration3.0.1
django-widget-tweaks1.4.5
django2.2.10
djangorestframework3.11.0
fasteners0.15
monotonic1.5 # via fasteners
pillow7.0.0
psycopg2-binary2.8.4
pytz2019.3 # via django
six1.13.0 # via fasteners
sqlparse0.3.0 # via django
xlrd1.2.0
Faker4.0.2
Pillow7.0.0
requests==2.18.4
Dockerfile和requirement都准备好了就可以
跑起来之后 如果有任何版本不合适的警告,参考这个
https://www.cnblogs.com/tangguo123/p/9940186.html
具体怎么进入自己的容器进行上面的操作,继续往下看。
$ docker build -t NAME:TAG .
比如名字叫 python36 Tag叫 Django:
docker build –t python36:Django不设置的话 默认是latest
报错0:
如果你看到这个报错
“docker build” requires exactly 1 argument.
原因是因为(少了一个 ‘.’ , ‘.’ 代表当前路径):
注意看 后面 有个点 看到了嘛 . 这个点
报错1: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决办法
先装个systemctl yum install systemctl
再reload restart一下
$ systemctl daemon-reload
$ sudo service docker restart
$ sudo service docker status
$ sudo docker run xxxxx
报错2:
error pulling image configuration: Get https://registry-1.docker.io/v2/library/python/blobs/sha256:1daf62e8cab5d8625509ff004e1a9d545bba4adb41dc4d2acdff2481da7f46d4: net/http: TLS handshake timeout
一般的原因是无法连接到 docker hub
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
然后restart一下
service docker restart
我又艰辛起来了,如果你不小心装坏了要删掉镜像,这里给出几个指令
docker images
查看镜像
docker ps
查看 容器
要先删容器 再删镜像 ,删掉的容器必须是stop的
docker start 容器id //启动一个或多个已经被停止的容器
docker stop 容器id //停止一个运行中的容器
docker restart 容器id //重启容器
docker rm 容器id
doccker rmi 镜像id
报错3:
也不是报错 就是如果他build的非常慢 就走国内镜像 在dockerfile里加入
RUN sed -i "s/archive.ubuntu./mirrors.aliyun./g" /etc/apt/sources.list
RUN sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list
RUN sed -i "s/security.debian.org/mirrors.aliyun.com\/debian-security/g" /etc/apt/sources.list
如果你是centos不要加最后一行debian的
现在进入你的镜像看看,这里说的不对,不是进入镜像,是进入一个用了你镜像的容器。镜像是一个静态的概念。
$docker run -it python36:Django /bin/bash
进入之后
$Python
>>import Django
没有报错的话 镜像制作完成
然后按 Ctrl-D 从这个容器里面退出来
方法一:
更改你的dockerfile
$vim dockerfile
FROM python36:Django
RUN pip install numpy
$ docker build –t python36:Django .
你可以用一个新的名字 新的tag做一个新镜像
也可以用一样的名字 覆盖老镜像
同上你可以进入镜像 python输入import numpy查看是否安装成功
然后利用 doker-compose.yml 文件调用镜像
version: '3'
services:
db:
restart: always
image: postgres
privileged: true
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: 123456
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- /home/server/pg_data/data:/var/lib/postgresql/data/pgdata
web:
image: python36:Django
# your image you want to use
working_dir: /code
command: python ./imagetagger/manage.py runserver 0.0.0.0:8000
# This port needs to be the same of ports below.
volumes:
- .:/code
# modify django_eve to your folder name. This folder stores the code.
ports:
- "8000:8000"
depends_on:
- db
# your server port.
restart: always
注意缩进,注意缩进,注意缩进。重要的事情说三次。
db部分: 以下是说明,不要复制粘贴
ports: - 5432:5432
POSTGRES_PASSWORD: 123456一会要在django setting里面写的端口密码
- image: postgres dockerhub直接拿来用
web部分:
web的image那边就是我们刚刚做好的 镜像,直接拿来用。
working_dir: /code 这个是dockerfile里面make的那个dir 我们拿来存放自己的项目代码
command: python ./imagetagger/manage.py runserver 0.0.0.0:8000 这是执行的命令,注意manage.py 和 compose.yml的相对位置'
还有一种一发入魂的写法,就是先不做镜像,直接跑compose compose会去找你的dockerfile 然后build一个镜像出来,比如下面这种 build 后面有个 点 .
我没详细写,有兴趣的可以自己操作。
db:
image: postgres
web:
build: .
command: python ./imagetagger/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
写好compose之后
$ docker-compose up
这里你也可以分开up
可以先
docker-compose up -d db
再
docker-compose up -d web
拉起来跑。
如果你想终止你的代码:
$docker-compose down
然后你会发现没有 migrate,compose up之后会有提示。那我们把这个容器关了。docker-compose down
现在来说怎么migrate。
首先你要保证 你的db容器是开启状态
可以docker ps -a 查看他的status,不可以是exit状态。
然后 如果没开,就docker-compose up -d db
然后进入你的web容器
sudo docker exec -it 59ec15bc1a57 /bin/bash
那个数字是你的web容器id
进去之后,cd到manage.py所在的路径
然后 运行
python manage.py makemigrations
python manage.py migrate
注意ipconfig查出来的是 内网ip只有在局域网内可以访问,需要给别的用户用,需要公网ip,查看方式有以下几个。
curl https://ip.cn
{“ip”: “XXX.XXX.XXX”, “country”: “上海市”, “city”: “阿里云”}
curl cip.cc
IP : XXX.XXX.XXX
地址 : 中国 上海
运营商 : 阿里云/电信/联通/移动/铁通/教育网
数据二 : 浙江省杭州市 | 阿里云BGP数据中心
数据三 : 中国上海上海市 | 阿里云
URL : http://www.cip.cc/XXX.XXX.XXX
curl myip.ipip.net
当前 IP:XXX.XXX.XXX 来自于:中国 上海 上海 阿里云/电
最简单的方法登录阿里云的控制台,去查看公网ip(黄色荧光笔)
顺便 是需要设置的才能外网浏览
具体查看这个博文:
阿里云服务器专有网络直接分配公网ip后如何被外网访问
https://www.jianshu.com/p/418948535e41
补充:
在服务器里难免身不由己 需要用命令行操控下数据库
所以 这里po一些 常用的 postgresql操作指令:
https://www.iteye.com/blog/rssnet-2074179
https://www.jianshu.com/p/af6b210fe562
当然方式是一样的
docker ps - a 找到数据库容器id 然后进入,如果提示容器没开 那就自己start一下。在执行语句 进入容器
sudo docker exec -it 59ec15bc1a57 /bin/bash