20230310--Jenkins+Gogs自动远程Docker环境部署django项目(生产)

0.说明

1.Jenkins必要插件、配置、Job创建、Gogs配置等参考测试环境步骤

2.生产环境Django项目一般nginx+uwsgi+django部署;

3.项目容器介绍
容器1:Django+uwsgi作为核心应用程序,处理客户端的请求;
容器2:Nginx反向代理服务并处理静态资源请求。

4.流水线处理过程参考框架图如下:
1)用户向Gogs推送(push)代码,webhook触发jenkins中项目job;
2)项目job,从Gogs中拉取代码并通过Publish Over SSH传送至Docker服务器;SSH远程通过Docker-compose build两个容器,并启动两个容器。


1.Publish Over SSH远程执行过程

#删除nginx容器
docker inspect local_cmdb_nginx_1 -f '{{.Name}}' > /dev/null
if [ $? -eq 0 ] ;
then
    echo "docker local_cmdb_nginx_1 exist" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
    docker rm -f  local_cmdb_nginx_1
else
    echo "docker local_cmdb_nginx_1 don't exist" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
fi

#删除django容器
docker inspect local_cmdb_django_1 -f '{{.Name}}' > /dev/null
if [ $? -eq 0 ] ;
then
    echo "docker local_cmdb_django_1 exist" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
    docker rm -f  local_cmdb_django_1
else
    echo "docker local_cmdb_nginx_1 don't exist" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
fi

# 由于向Docker容器中拷贝文件会影响递归结构,所以需要将项目目录先压缩
cd /root/
ll local_cmdb
if [ $? -ne 0 ]; then
    echo " project push succeed" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
fi
tar -czvf local_cmdb.tar.gz local_cmdb
echo `pwd`
cd /root/local_cmdb
mv -f /root/local_cmdb.tar.gz ./

#构建容器
docker-compose build
if [ $? -ne 0 ]; then
    echo " container build failed" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
fi

#启动容器
docker-compose up -d
if [ $? -ne 0 ]; then
    echo " container up failed" `date +%Y%m%d%H%M%S`>> /var/log/jenkins.tmp
fi

2.Docker-compose部署项目

项目大致的目录结构
├── config
│ ├── nginx.conf nginx配置文件
├── docker-compose.yml compose yml文件
├── Dockerfile_django django+uwsgi容器Dockerfile
├── Dockerfile_nginx nginx容器Dockerfile
├── local_cmdb
│ ├── local_cmdb.ini uwsgi配置文件

1)docker-compose.yml文件
version: "2.3"

networks:  #两个容器自定义网络(默认桥接),不适用lins通信
  nginx_network:
    driver: bridge
  django_network:
    driver: bridge

services:  #build两个容器服务
  django:
    build:
      context: .                      #指定Dockerfile文件目录
      dockerfile: Dockerfile_django   #指定Dockerfile文件名称
    ports:                            #指定容器端口映射
      - "8000:8000"
    expose:                           #暴露容器端口
      - "8000"
#    volumes:
    networks:                         #挂在容器网络
      - django_network
#    depends_on:
    restart: always
    tty: true
    stdin_open: true

  nginx:
    build:
      context: .
      dockerfile: Dockerfile_nginx
    ports:
      - "80:80"
    expose:
      - "80"
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
      - ./static:/root/local_cmdb/static
    networks:
      - nginx_network
    depends_on:
      - django
    restart: always
2)Django+Uwsgi容器Dockerfile
#基础镜像
FROM almalinux
#作者
MAINTAINER luorf
#安装python39等必要组件
RUN yum install -y python39 gcc python39-devel mysql-devel && yum clean all && rm -rf /var/cache/yum/*
#添加项目包
ADD local_cmdb.tar.gz /root/
#配置Python环境
RUN ln -s /usr/bin/python3.9 /usr/bin/python && ln -s /usr/bin/pip3.9 /usr/bin/pip 
#安装uwsgi
RUN pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
#安装项目需要Python组件
RUN pip install -r /root/local_cmdb/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#暴露端口
EXPOSE 8000
#uwsgi启动项目
ENTRYPOINT /usr/local/bin/uwsgi -i /root/local_cmdb/local_cmdb/local_cmdb.ini

uwsgi配置文件local_cmdb.ini

[uwsgi]
master=true
chdir=/root/local_cmdb
module=local_cmdb.wsgi
py-autoreload=1
lazy-apps=true  
socket=0.0.0.0:8000            #socket IP为0.0.0.0,不能是127.0.0.1
processes=4
buffer-size=32768
#daemonize=uwsgi.log
logto=/root/local_cmdb/local_cmdb/uwsgi.log
log-maxsize = 5000000
vacuum = true
disable-logging = true
3)Nginx容器Dockerfile
#基础镜像
FROM nginx
#作者
MAINTAINER luorf
#拷贝项目需要的nginx配置文件
COPY config/nginx.conf /etc/nginx/nginx.conf
#暴露80端口
EXPOSE 80
#启动nginx服务
CMD ["nginx", "-g", "daemon off;"]

nginx配置文件

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream django_web{
        ip_hash;
        server 172.26.37.126:8000;        #IP为django容器宿主机IP
    }

    server {
        listen       80;
        charset utf-8;
        location /static {
               alias /root/local_cmdb/static;
        }
    
        location / {
            include /etc/nginx/uwsgi_params;
            uwsgi_pass django_web;
        }
    
        error_page 404 /404.html;
            location = /40x.html {
        }
    
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

3.测试

提交代码

提交修改

# git add .
# git commit -m "docker.django.uwsgi.nginx"
# git push origin master

gogs自动推送确认:略

jenkins脚本执行确认:略

远程Docker服务器镜像制作成功,容器启动正常,django web访问及利用正常

# docker image ls|grep local_cmdb
local_cmdb_django                       latest    155ecb1fda8c   About a minute ago   622MB
local_cmdb_nginx                        latest    889dd5e2066a   13 hours ago         141MB
# docker ps |grep local_cmdb
0448073ebae8   local_cmdb_nginx                    "/docker-entrypoint.…"   2 minutes ago   Up About a minute                  0.0.0.0:80->80/tcp, :::80->80/tcp           local_cmdb_nginx_1
31cba33003bd   local_cmdb_django                   "/bin/sh -c '/usr/lo…"   2 minutes ago   Up 2 minutes                       0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   local_cmdb_django_1

# curl -I http://172.26.37.126/admin

)

自动发布成功。

参考URL

https://www.jianshu.com/p/787565c8f7e2
https://blog.csdn.net/weixin_42134789/article/details/115878467
https://blog.csdn.net/weixin_43810267/article/details/119883350
https://www.jianshu.com/p/e7f185c0e7e8
https://www.cnblogs.com/Dxd-python/p/10642132.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容