2. 配置docker、git环境与项目创建
购买云服务器后,配置ssh,详细可见Linux基础课
ssh root@公网IP
添加用户,分配sudo权限
Host django_server
HostName 47.120.35.99
User django_lesson
#密码:django
免密登录:ssh-copy-id django_server
镜像传到服务器里:scp /var/lib/acwing/docker/images/django_lesson_1_0.tar django_server:
进入云服务器ssh django_server
,将tar文件导入到docker镜像环境里docker load -i django_lesson_1_0.tar
,利用这个镜像生成上课用的容器docker run -p 20000:22 -p 8000:8000 --name django_server -itd django_lesson:1.0
(后面镜像可以自动补全表示代码没出问题)
- 8000端口和20000端口都需要在云服务器平台的安全组里面进行配置
通过docker attach django_server
命令进入自己的容器,不用根用户,需要自己创建用户adduser django
设置密码:django
,给我们创建的用户添加sudo权限:usermod -aG sudo django
,挂起当前容器:ctrl+P + ctrl+q
,在云服务器窗口输入:ssh django@localhost -p 20000
,如果出现新的界面表示可以正常登录。退出到ac Terminal窗口vim .ssh/config
,设置ac Terminal进入容器的别名并设置免密登录,ssh-copy-id django
:
Host django
HostName 47.120.35.99
User django
Port 20000
#密码:django
以后想开发项目的时候直接在ac terminal里面输入ssh django
进入容器进行开发。
- 同步一些配置:
scp .bashrc .vimrc .tmux.conf django:
查看django版本:django-admin --version
创建一个django项目:django-admin startproject acapp
django@d5bdea784e4b:~$ tree .
.
`-- acapp
|-- acapp
| |-- __init__.py
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py
进入acapp/用git维护起来:
git init
ssh-keygen
cd .ssh/
cat id_rsa.pub
在云端git.acwing.com上创建一个项目,并把id_rsa.pub的内容加入到【偏好设置】的【ssh密钥】里面
cd acapp
tmux
进入tmux进行操作
按照【命令行指引】设置git全局设置,将本地的内容上传云端:
git status
git add .
git status
git commit -m "start project"
vim README.md
内容为:“一个伟大的史诗级巨作!”
git status
git add .
git commit -m "add readme"
git remote add origin git@git.acwing.com:DrinkWater/django_lesson.git
git push
git push --ser-upstream origin master
跑项目要在tmux里面跑
修改settings.py:
ag “字符串”,搜索字符串位置
将阿里云的公网IP(字符串)写入ALLOWED_HOSTS里面
运行代码:python3 manage.py runserver 0.0.0.0:8000
python3 manage.py migrate
同步数据库修改
python3 manage.py runserver 0.0.0.0:8000
输入公网IP:8000
可查看django初始化页面
git status一下,__pycache__
的内容不上传到云端(云端只放核心关键代码)
vim .gitignore
里面写:**/__pycache__
git status
git add .
git status
git commit -m "modify allowedhosts"
git push
云端刷新一下,发现修改已经提交
挂起当前tmux(按下ctrl + a后手指松开,然后按d:挂起当前session,该tmux用来运行django后台/控制台)再开一个新的tmux来写程序
创建一个app:python3 manage.py startapp app的名字
例如:python3 manage.py startapp game
ls一下会多一个game文件夹
admin.py是管理员页面能看到的数据库,models.py用来定义自己网站的各种数据库表, views.py是写函数的。
git status
git add .
git commit -m "start app game"
git push
在公网IP:8000/admin网页下就能看到管理员页面了
创建管理员账号:
python3 manage.py createsuperuser
输入账号密码(都是django)
cd game/
ls
touch urls.py
mkdir templates
vim views.py
vim urls.py
#urls.py示例
from django.urls import path
from game.views import index
urlpatterns = [
path("",index,name="index"),
]
实现一个简单的函数进行测试
修改urls.py后要将新增的url(路由)加入到总url:acapp/acapp下的urls.py里面
可以自己用html字符串试一下页面效果
最后记得git 到云端
vim .gitignore
#添加*.swp
git status
git add .
git commit -m "write my first page"
git push
遇到的问题
1.docker load -i django_lesson_1_0.tar
命令出现permission denied
django_lesson@iZf8zfb58x30baryz5h5viZ:~$ docker load -i django_lesson_1_0.tar
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/load?quiet=0": dial unix /var/run/docker.sock: connect: permission denied
解决方案:
sudo chown root:docker /var/run/docker.sock # 修改docker.sock权限为root:docker
sudo groupadd docker # 添加docker用户组
sudo gpasswd -a $USER docker # 将当前用户添加至docker用户组
newgrp docker # 更新docker用户组
2.docker run -p 20000:22 8000:8000 --name django_server -itd django_lesson:1.0
出现如下错误
Unable to find image '8000:8000' locally
docker: Error response from daemon: pull access denied for 8000, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
解决方案:8000端口那里前面少加了-p
3.第二次运行python3 manage.py runserver 0.0.0.0:8000
出现Error: That port is already in use
解决方案:退出当前tmux,输入:
ps aux | grep -i manage
kill -9 PID
知识补充
include
路由中的 include()
方法非常的常用。它的作用是把 url
的剩余部分发配到另一个 URLconfs
处理,以免单个路由文件过于庞大和凌乱。
通常我们在根路由中使用它:
# root/urls.py
from django.urls import path, include
path('post/', include('post.urls', namespace='post')),
后端在匹配到 post/
后,继续在 post
模块的 urls.py
中处理剩下的部分:
# post/urls.py
...
path('john/', some_view, name='user')
它两配合起来就可以匹配类似这样的地址:
'/post/john/'
另外,你可能注意到了参数 namespace
(应用程序命名空间)和 name
(实例命名空间)这两兄弟了,他们是地址反向解析用的,比如在模板中:
{% url 'post:user' %}
或者在视图中:
reverse('post:user')
这样多级命名的好处是你可以在不同的 app 中重复的命名,它们是互不影响的。
Docker临时端口映射方法
在群里看到有些小伙伴run容器的时候没有映射端口号,所以给出这个方法来临时映射端口号
方法
- 利用docker ps命令查看[HTML_REMOVED](容器id)
- 查看容器IP:
docker inspect <container_id> | grep IPAddress
- 宿主机配置iptables:
iptables -t nat -A DOCKER -p tcp --dport <host_port> -j DNAT --to-destination <container_ip>:<docker_port>
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source <container_ip> --destination <container_ip> --dport <docker_port>
iptables -A DOCKER -j ACCEPT -p tcp --destination <container_ip> --dport <docker_port>
- 查看是否映射成功:
iptables -t nat -nvL
例如
将容器内22端口映射到宿主机20000端口
172.17.0.2 ---> container_ip
20000 ---> host_port
22 ---> docker_port
iptables -t nat -A DOCKER -p tcp --dport 20000 -j DNAT --to-destination 172.17.0.2:22
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source 172.17.0.2 --destination 172.17.0.2 --dport 22
iptables -A DOCKER -j ACCEPT -p tcp --destination 172.17.0.2 --dport 22
iptables -t nat -nvL(查看是否映射成功)
注:如果报错在命令前面加上sudo提升一下权限
只要容器不停,端口映射就一直存在,如果容器停止了,start之后再执行一遍上述命令即可
实际写了差不多两小时才完成本节课实践