根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目

目录:

1安装docker
2根据dockerfile requirement生成一个镜像
进入镜像 check镜像是否符合要求
3.在原有的镜像上添加功能
3.1利用dockerfile
3.2 进入镜像安装 之后commit
4 编写 docker-compose.yml
5 利用docker-compose 让主机里的代码使用该镜像运行
6 makemigrations和 makemigrate
7 浏览器通过外(公)网访问

1 安装 docker

先明确如果要在自己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 -> 去开启虚拟化)
根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目_第1张图片

开启虚拟化重启后,进入任务管理器看虚拟化是否已启用。
2
然后再是进入电脑的控制面板->程序->启用或关闭Windows功能->把Hyper-v勾上,启用后电脑会重启,后面就可以下载并安装Docker for Windows了。
根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目_第2张图片

Ps: Windows: 不建议系统是家庭版的用户 强行增加hyper-v,容易引起docker和虚拟机混乱。
Runtimeerror: 当pip和apt-get的时候遇到连接不上网络,urllib3 runtimeerror相关问题,建议换源 具体可上网查询 pip换源
给大家一个宝贝,DockerDesktop在官网下载实在太慢,太慢了,这里给出 docker Windows 的百度云资源链接
链接:https://pan.baidu.com/s/1KiEsAzz1gbeIhmZhfnSIYg
提取码:rmn8

2根据dockerfile requirement生成一个镜像

$ 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-loader
1.3.1
django-registration3.0.1
django-widget-tweaks
1.4.5
django2.2.10
djangorestframework
3.11.0
fasteners0.15
monotonic
1.5 # via fasteners
pillow7.0.0
psycopg2-binary
2.8.4
pytz2019.3 # via django
six
1.13.0 # via fasteners
sqlparse0.3.0 # via django
xlrd
1.2.0
Faker4.0.2
Pillow
7.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的

成功之后:看到这个
根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目_第3张图片

现在进入你的镜像看看,这里说的不对,不是进入镜像,是进入一个用了你镜像的容器。镜像是一个静态的概念。

$docker run -it python36:Django /bin/bash 

进入之后

$Python
>>import Django

没有报错的话 镜像制作完成
根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目_第4张图片
然后按 Ctrl-D 从这个容器里面退出来

3 如果你突然要在老的镜像上添加一些包

方法一:
更改你的dockerfile
$vim dockerfile
FROM python36:Django
RUN pip install numpy

$ docker build –t python36:Django .
你可以用一个新的名字 新的tag做一个新镜像
也可以用一样的名字 覆盖老镜像
同上你可以进入镜像 python输入import numpy查看是否安装成功

4 docker compose

然后利用 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

5 在镜像里运行你的项目:

写好compose之后

$ docker-compose up

这里你也可以分开up
可以先

docker-compose up -d db

docker-compose up -d web

拉起来跑。
如果你想终止你的代码:

$docker-compose down

6 makemigrations migrate

然后你会发现没有 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

7 使用浏览器访问你的网页

注意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(黄色荧光笔)
根据dockerfile创建属于自己的镜像,利用dockercompose 运行django postgresql项目_第5张图片
顺便 是需要设置的才能外网浏览
具体查看这个博文:
阿里云服务器专有网络直接分配公网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

你可能感兴趣的:(docker,python)