Pycharm 使用 Docker 配置 Django + My
2019-08-11 本文已影响0人
墨墨粑粑331
一、系统环境
- 操作系统:deepin 15.10.2 桌面版 64位
- Pycharm:PyCharm Professional 2019.1.2(必须是专业版,社区版不提供远程服务)
- Docker:Docker CE 18.09.6
二、镜像准备
- 系统用户加入 docker 组,这样不用
sudo
也能运行 docker 指令了,同时避免系统用户运行 Pycharm 连接 Docker 时的权限问题
sudo usermod -aG docker [USER] # 重启系统后生效
- 拉取镜像
docker pull python:latest
docker pull mysql:5.7
- 创建 docker 容器
# 在本地创建 mysql 容器需要挂载的目录
mkdir -p /my/mysql/conf
mkdir -p /my/mysql/data
mkdir -p /my/mysql/logs
# 在本地 /my/mysql/conf 目录下配置 mysqld.cnf 文件
vi mysqld.cnf
# 输入以下内容,并保存退出
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
# 创建 mysql 容器
docker run --name mysql \
-v /my/mysql/conf:/etc/mysql/mysql.conf.d \
-v /my/mysql/data:/var/lib/mysql \
-v /my/mysql/logs:/logs \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
# 创建 python 容器
docker run --name python -p 8000:8000 -p 8022:22 --link=mysql:mysql -it python /bin/bash
# --name 指定容器名,名称自定义,如果不指定会自动命名
# -i 以交互模式运行容器;-t 分配一个伪终端,即命令行,通常组合使用 -it
# -p 指定端口映射,将主机端口映射到容器内的端口,一定要留一个端口映射到 22 端口,因为 SFTP 默认使用 22 端口
# -e 设置环境变量参数,此处设置 mysql 的 root 密码
# -d 以后台运行,即守护式运行容器
# --link 实现 python 容器与 mysql 容器的通信,格式:--link=[容器名]:[别名],相当于更改 python 容器的 /etc/hosts 配置文件
# 创建 python 容器时,建议不要使用 -v 挂载主机目录到容器目录,不然在用 Pycharm 开发项目过程中会遇到比较头疼的权限问题,目前我没有较好的解决办法,路过的朋友可以留言提供思路和方法
# 创建 mysql 容器时,-v 挂载数据库的配置(conf)、数据(data)和日志(logs)文件
- 配置 SSH 服务(python 容器内)
# 更换 apt 源(根据镜像的 Linux 系统情况进行配置),不然下载安装会很慢
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 下载安装 openssh-server
apt update
apt install -y openssh-server
# 下载安装 sudo,不然用 Pycharm 创建 Django 项目时会报错
apt install -y sudo
# 设置 root 用户密码
echo 'root:[passwd]' | chpasswd # passwd 为你想设置密码
# 修改配置文件
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # 注意在 PermitRootLogin 前加 #,因为 sshd_config 文件里该参数是被注释的
sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
echo "export VISIBLE=now" >> /etc/profile
# 重启 SSH 激活配置
service ssh restart
# 创建项目目录,为后续本地项目目录与容器内项目目录的映射
mkdir /mysite
# 创建 pip 源配置文件的目录,为后续更换 pip 源准备
mkdir /root/.pip
# 退出 python 容器,在本地编辑并拷贝 pip.conf 源配置文件至容器内
vi pip.conf
# 输入以下内容,并保存退出
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
# 将 pip.conf 文件拷贝至容器
docker cp pip.conf python:/root/.pip
# 进入 python 容器,升级 pip
docker exec -it python /bin/bash
pip install -U pip
以上操作可以编辑 Dockerfile 文件,执行docker build -f [Dockerfile 文件路径] -t [镜像名]:[标签] [命令执行上下文]
指令生成新的镜像
FROM python
MAINTAINER xxxxxxxxx@qq.com
ENV MYPATH /mysite
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt update
RUN apt install -y sudo
RUN apt install -y openssh-server
RUN echo 'root:root' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN echo "export VISIBLE=now" >> /etc/profile
RUN mkdir $MYPATH
RUN mkdir /root/.pip
COPY pip.conf /root/.pip
RUN pip install -U pip
WORKDIR $MYPATH
CMD ["/bin/bash"]
执行以下指令生成新的镜像,-f [Dockerfile 文件路径] -t [镜像名]:[标签] 参数根据自己情况设定
docker build -f dockerfile -t lnn/python:1.0 .
最后别忘了创建容器,并进入容器内执行service ssh restart
- 创建数据库(mysql 容器内)
# 进入 mysql 容器终端
docker exec -it mysql /bin/bash
# 创建数据库
mysql -uroot -p # 输入密码登录 mysql
create database [db name]; # 为后续 django 项目准备
# 顺便查看以下字符集是否设置成功
show variables like "char%";
# 出现以下配置表示成功
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
三、PyCharm 配置部署环境
-
File > New Project
-
File > Settings > Project Interpreter,项目解释器界面如下图所示,此时已经完成远程解释器的本地化:
-
本地测试启动 Django 服务
在浏览器打开:127.0.0.1:8000
- Tools > Start SSH session,可以在 Docker 环境中执行命令
- 点击底端的 Python Console,使用远程 Docker 环境中的 Python
- Tools > Deployment > Upload/Download,实现主机与容器间的数据上传/下传
- 配置 django 项目 settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sms', # sms 为之前在 mysql 容器中创建的数据库
'HOST': 'mysql', # mysql 为之前创建 python 容器时,--link 设置的 mysql 容器 ip 的别名
'USER': 'root',
'PASSWORD': 'root',
'PORT': '3306',
}
}
可以尝试进行数据迁移测试配置是否成功,测试前别忘了pip install mysqlclient
,并在__init__.py
文件中import MySQLdb
四、需要注意的问题
docker 容器停止后,容器内的 SSH 服务也会相应停止,容器重启后需要进到容器内重启 ssh 服务:
service ssh restart