Django 应用容器化实战

28 篇文章 1 订阅
16 篇文章 0 订阅


1. 项目介绍

2. 编写 Dockerfile

#This is django Dockerfile
#version 1.0

#Base images 基础镜像
FROM centos:centos7.5.1804

#MAINTAINER 维护者信息
LABEL maintainer="www.baidu.com"

#ENV 设置环境变量
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8

#RUN 执行以下命令
RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo && rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install python36 python3-devel gcc pcre-devel zlib-devel make net-tools nginx

#工作目录
WORKDIR /opt/myblog

#拷贝文件至工作目录
COPY . .

#拷贝nginx配置文件
COPY myblog.conf /etc/nginx

#安装依赖的插件
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt

RUN chmod +x run.sh && rm -rf ~/.cache/pip

#EXPOSE 映射端口
EXPOSE 8002

#容器启动时执行命令
CMD ["./run.sh"]

执行构建

docker build . -t myblog:v1 -f Dockerfile

3. 运行 Mysql

docker run -d -p 3306:3306 --name mysql -v /opt/mysql:/var/lib/mysql -e MYSQL_DATABASE=myblog -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

查看数据库

docker exec -ti mysql bash
# / mysql -uroot -p123456
# / show databases;
# navicator 连接测试

4. 启动 Django 应用

docker run -d -p 8002:8002 --name myblog -e MYSQL_HOST=192.168.10.20 -e MYSQL_USER=root -e MYSQL_PASSWD=123456 myblog:v1
docker ps -a

#migrate
docker exec -it myblog bash
python3 manager.py makemigrations
python3 manager.py migrate
python3 manager.py createsuperuser

#创建超级用户(上一步已经做过)
docker exec -it myblog python3 manager.py createsuperuser

#收集静态文件
docker exec -it myblog python3 manage.py collectstatic
[root@c7-1 ~/python-demo]#docker exec -it myblog bash
[root@aab0fe5113ee myblog]# python3 manage.py makemigrations
No changes detected
[root@aab0fe5113ee myblog]# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK
[root@aab0fe5113ee myblog]# python3 manage.py createsuperuser
用户名 (leave blank to use 'root'): admin
电子邮件地址: admin@admin.cm
Password: 
Password (again): 
密码跟 电子邮件地址 太相似了。
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
[root@aab0fe5113ee myblog]# exit
exit

5. 访问

访问:http://192.168.10.20:8002/admin
在这里插入图片描述
在这里插入图片描述

6. 修改 Mysql 字符编码,重构 Mysql 镜像

查看 Mysql 默认编码

[root@c7-1 ~/python-demo]#docker exec -it mysql bash
root@83dfaba6b346:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

dockerfiles/mysql/my.cnf

$ cat my.cnf
[mysqld]
user=root
character-set-server=utf8
lower_case_table_names=1

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

dockerfile/mysql/Dockerfile

FROM mysql:5.7
COPY my.cnf /etc/mysql/my.cnf
$ docker build . -t mysql:5.7-utf8
$ docker tag mysql:5.7-utf8 192.168.10.20:5000/mysql:5.7-utf8	#打标签,推送仓库,非必须
$ docker push 192.168.10.20:5000/mysql:5.7-utf8

#删除旧的 mysql 容器,使用新镜像启动,不用再次初始化
docker rm -f mysql
rm -rf /opt/mysql/mysql-data/*
docker run -d -p 3306:3306 --name mysql -v /opt/mysql/mysql-data/:/var/lib/mysql -e MYSQL_DATABASE=myblog -e MYSQL_ROOT_PASSWORD=123456 192.168.10.20:5000/mysql:5.7-utf8

#重新 migrate
$ docker exec -it myblog bash
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser

完整过程

[root@c7-1 ~/python-demo]#cd ..
[root@c7-1 ~]#ls
python-demo
[root@c7-1 ~]#mkdir mysql
[root@c7-1 ~]#cd mysql/
[root@c7-1 ~/mysql]#vim my.cnf
[root@c7-1 ~/mysql]#cat my.cnf 
[mysqld]
user=root
character-set-server=utf8
lower_case_table_names=1

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[root@c7-1 ~/mysql]#vim Dockerfile
[root@c7-1 ~/mysql]#cat Dockerfile
FROM mysql:5.7
COPY my.cnf /etc/mysql/my.cnf
[root@c7-1 ~/mysql]#ll
总用量 8
-rw-r--r-- 1 root root  45 1月  13 00:15 Dockerfile
-rw-r--r-- 1 root root 211 1月  13 00:14 my.cnf
[root@c7-1 ~/mysql]#docker build . -t mysql:5.7-utf8
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM mysql:5.7
 ---> c20987f18b13
Step 2/2 : COPY my.cnf /etc/mysql/my.cnf
 ---> 5918f08308dd
Successfully built 5918f08308dd
Successfully tagged mysql:5.7-utf8
[root@c7-1 ~/mysql]#docker ps |grep registry
[root@c7-1 ~/mysql]#docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
aab0fe5113ee   myblog:v1   "./run.sh"               36 minutes ago   Up 36 minutes   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp              myblog
83dfaba6b346   mysql:5.7   "docker-entrypoint.s…"   43 minutes ago   Up 43 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@c7-1 ~/mysql]#docker rm -f mysql
mysql
[root@c7-1 ~/mysql]#docker ps -a
CONTAINER ID   IMAGE       COMMAND      CREATED          STATUS          PORTS                                       NAMES
aab0fe5113ee   myblog:v1   "./run.sh"   36 minutes ago   Up 36 minutes   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp   myblog
[root@c7-1 ~/mysql]#cd /opt/
[root@c7-1 /opt]#ls
containerd  mysql  rh
[root@c7-1 /opt]#rm -rf mysql/
[root@c7-1 /opt]#docker images
REPOSITORY   TAG              IMAGE ID       CREATED          SIZE
mysql        5.7-utf8         5918f08308dd   9 minutes ago    448MB
myblog       v1               0c80578b43a2   52 minutes ago   569MB
mysql        5.7              c20987f18b13   3 weeks ago      448MB
centos       centos7.5.1804   cf49811e3cdb   2 years ago      200MB
[root@c7-1 /opt]#docker run -d -p 3306:3306 --name mysql -v /opt/mysql/mysql-data/:/var/lib/mysql -e MYSQL_DATABASE=myblog -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7-utf8
38facfabc0d521bbdeecc15ef6eb6b0ad7d9ec0a813fad3918ad8323e394548a
[root@c7-1 /opt]#docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED              STATUS              PORTS                                                  NAMES
38facfabc0d5   mysql:5.7-utf8   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
aab0fe5113ee   myblog:v1        "./run.sh"               45 minutes ago       Up 45 minutes       0.0.0.0:8002->8002/tcp, :::8002->8002/tcp              myblog
[root@c7-1 /opt]#docker exec -it myblog bash
[root@aab0fe5113ee myblog]# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK
[root@aab0fe5113ee myblog]# python3 manage.py createsuperuser
用户名 (leave blank to use 'root'): admin
电子邮件地址: admin@admin.cm             
Password: 
Password (again): 
密码跟 电子邮件地址 太相似了。
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
[root@aab0fe5113ee myblog]# exit
exit

重新访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. K8S 部署测试

[root@master ~]# kubectl create namespace demo
namespace/demo created
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   12d
demo              Active   5s
kube-node-lease   Active   12d
kube-public       Active   12d
kube-system       Active   12d
[root@master ~]# ls
mysql  python-demo
[root@master ~]# mkdir demo
[root@master ~]# ls
demo  mysql  python-demo
[root@master ~]# cd demo/
[root@master ~/demo]# vi pod.yaml
[root@master ~/demo]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myblog
  namespace: demo
  labels:
    component: myblog
spec:
  volumes: 
  - name: mysql-data
    hostPath: 
      path: /opt/mysql/data
  nodeSelector:   		#使用节点选择器将 Pod 调度到指定 label 的节点
    component: mysql
  containers:
  - name: myblog
    image: 192.168.10.100:5000/myblog:v1
    env:
    - name: MYSQL_HOST  #指定 root 用户的用户名
      value: "127.0.0.1"
    - name: MYSQL_PASSWD
      value: "123456"
    ports:
    - containerPort: 8002
  - name: mysql
    image: 192.168.10.100:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    - name: MYSQL_DATABASE
      value: "myblog"
    volumeMounts:
    - name: mysql-data
      mountPath: /var/lib/mysql
#---------------------------------------------------#
[root@master ~/demo]# kubectl apply -f pod.yaml 
pod/myblog created
[root@master ~/demo]# kubectl get pod -n demo -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
myblog   0/2     Pending   0          4s    <none>   <none>   <none>           <none>
[root@master ~/demo]# kubectl -n demo describe pod myblog	#调度失败,因为节点不满足node selector
......
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  46s (x2 over 46s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.
[root@master ~/demo]# kubectl label node node01 component=mysql		#为节点打标签
node/node01 labeled
[root@master ~/demo]# kubectl delete -f pod.yaml 
pod "myblog" deleted
[root@master ~/demo]# kubectl apply -f pod.yaml 
pod/myblog created
[root@master ~/demo]# kubectl get pod -n demo -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
myblog   2/2     Running   0          3s    10.244.1.7   node01   <none>           <none>
[root@master ~/demo]# curl 10.244.1.7:8002/blog/index/
......

8. Pod 的数据持久化

若删除了 Pod,由于 mysql 的数据都在容器内部,会造成数据丢失,因此需要数据进行持久化。
我们先前定点使用 hostpath 挂载,nodeSelector 定点,这样的话数据容易丢失,常用的数据持久化方法为 PV/PVC。

参考:https://blog.csdn.net/shenyuanhaojie/article/details/122052862?spm=1001.2014.3001.5501#2__MySQL_338

最近的三年多时间,随着容器技术的火爆及Kubernetes成为容器编排管理的标准,国内外厂商均已开始了全面拥抱Kubernetes的转型, 无数中小型企业已经落地 Kubernetes,或正走在容器的道路上 。 第一章介绍docker的前世今生,了 解docker的实现原理,以Django项目为例,教大家如何编写最佳的Dockerfile实现构业务镜像的制作。通过本章的学习,大家会知道docker的概念及基本操作,并学会构建自己的业务镜像,并通过抓包的方式掌握Docker最常用的bridge网络模式的通信。 第二章本章学习kubernetes的架构及工作流程,重点介绍如本章学习kubernetes的架构及工作流程,重点介绍如断的滚动更新,通过服务发现来实现集群内部的服务间访问,并通过ingress- -nginx实现外部使用域名访问集群内部的服务。同时介绍基于EFK如何搭建Kubernetes集群的日志收集系统。学完本章,我们的Django demo项目已经可以运行在k8s集群中,同时我们可以使用域名进行服务的访问。第三章本章基于k8s集群部署gitlab、sonarQube、 Jenkins等工具,并把上述工具集成到Jenkins中,以Django项目为例,通过多分支流水线及Jenkinsfle实现项目代码提交到不同的仓库分支,实现自动代码扫描、单元测试、docker容器构建、k8s服务的自动部署。第四章由于公司内部项目众多,大量的项目使用同一套流程做CICD,那么势必会存在大量的重复代码,因此本章主要通过使用groovy实现Jenkins的sharedL ibrary的开发,以提取项目在CICD实践过程中的公共逻辑,提供一系列的流程的接口供公司内各项目调用,开发完成后,还是以Django的demo项目为例,进行Jenkinsfle的改造,最后仅需通过简单的Jenkinsfle的配置,即可优雅的完成CICD流程的整个过程,此方式已在大型企业内部落地应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值