需求描述

简单说,就是创建一个服务型的镜像,即运行基于该镜像创建的容器时,基于该容器自动开启一个服务。具体来说,是创建一个部署了nginxuwsgipythondjango项目代码的镜像,运行基于该镜像创建的容器时,自动开启nginx,uwsgi等服务。简单理解就是在容器内部,通过nginx+uwsgi部署Django项目

实践环境

CentOS Linux release 7.9.2009

实践过程

实践过程1

Django项目代码组织结构

env_setup.sh
#!/bin/bash

yum install -y wget gcc make zlib* openssl-devel sqlite-devel

wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -xvzf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure --prefix=/usr/local/nginx
make && make install
cp -f /opt/DjServer/docker/nginx.conf /usr/local/nginx/conf/nginx.conf
chmod 755 /usr/local/nginx/conf/nginx.conf
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
cd .. && rm -rf nginx-1.10.3* wget http://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
tar -xvzf sqlite-autoconf-3280000.tar.gz
cd sqlite-autoconf-3280000
./configure --prefix=/usr/local/sqlite
make && make install
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
echo "/usr/local/sqlite/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
cd .. && rm -rf sqlite-autoconf-* wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz
tar -xvzf Python-3.6.13.tgz
cd Python-3.6.13
./configure --prefix=/usr/local/python36
make && make install
cd .. && rm -rf Python-3.6.13*
ln -s /usr/local/python36/bin/python3 /usr/bin/python3
ln -s /usr/local/python36/bin/pip3 /usr/bin/pip3
ls
pip3 install -r /opt/DjServer/requirements.txt
ln -s /usr/local/python36/bin/uwsgi /usr/bin/uwsgi
mkdir -p /var/log/uwsgi
start.sh
#!/bin/bash
`uwsgi --ini uwsgi.ini &` && nginx -c /usr/local/nginx/conf/nginx.conf -g "daemon off;"
nginx.conf
worker_processes 16;

events {
worker_connections 65535;
} http {
include mime.types;
default_type application/octet-stream; keepalive_timeout 65;
reset_timedout_connection on; server {
listen 80;
server_name localhost; charset utf-8; #access_log logs/access.log;
access_log off;
error_log logs/error.log; error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} location / {
uwsgi_send_timeout 60;
uwsgi_connect_timeout 60;
uwsgi_read_timeout 600;
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
}
}
requirements.txt
Django==3.0.6
uwsgi==2.0.8

前置准备工作

如下,创建一个干净的目录(例中为myworkspace),用于创建镜像,并将解压后的Django项目代码存放到该目录,然后在该目录下新建并编写dockerfile.dockerignore文件。

# pwd
/root/myworkspace
# ls -a
. .. DjServer dockerfile .dockerignore
dockerfile
FROM centos:7.9.2009

WORKDIR /opt/DjServer
COPY ./DjServer .
RUN chmod 755 ./docker/env_setup.sh \
&& sh ./docker/env_setup.sh \
&& chmod 755 ./docker/start.sh
EXPOSE 80
ENTRYPOINT ["./docker/start.sh"]
.dockerignore
*/__pycache__

创建服务镜像

如下,创建djserver:v1.0镜像

# docker build  -t djserver:v1.0 .
...略
Successfully tagged djserver:v1.0

创建容器

基于上述镜像创建名为dj80的容器,映射宿主主机80端口到容器的80端口,并为容器设置环境变量

# docker run --name dj9003 -p 9003:80 -e hostPort=10.1.66.163:9003 -d -it djserver:v1.0

测试验证

# curl http://10.7.0.236:9003/loadapi/api/v1/ip_forward # 10.7.0.236为容器所在宿主机

实践过程2

Django项目代码组织结构

注意:代码结构中的requirements.txt暂时没用到,对该文件的定位是,存放创建基础镜像时新增requirements.txt文件所包含依赖包除外的其它依赖包。

创建基础镜像前置准备工作

如下,创建一个干净的目录(例中为env_build),用于创建提供软件运行环境的基础镜像,并在该目录下新建并编写dockerfile,新建env_conf目录,然后在env_conf目录下新建env_setup.sh, requirements.txt

# pwd
/root/env_build
# ls -aR
.:
. .. env_conf env_dockerfile ./env_conf:
. .. env_setup.sh requirements.txt
env_dockerfile
FROM centos:7.9.2009
COPY ./env_conf .
RUN chmod 755 env_setup.sh \
&& sh env_setup.sh \
&& rm -f env_setup.sh requirements.txt
env_setup.sh
#!/bin/bash

yum install -y wget gcc make zlib* openssl-devel sqlite-devel

wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -xvzf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure --prefix=/usr/local/nginx
make && make install
cd .. && rm -rf nginx-1.10.3*
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx wget http://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
tar -xvzf sqlite-autoconf-3280000.tar.gz
cd sqlite-autoconf-3280000
./configure --prefix=/usr/local/sqlite
make && make install
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
echo "/usr/local/sqlite/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
cd .. && rm -rf sqlite-autoconf-* wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz
tar -xvzf Python-3.6.13.tgz
cd Python-3.6.13
./configure --prefix=/usr/local/python36
make && make install
cd .. && rm -rf Python-3.6.13*
ln -s /usr/local/python36/bin/python3 /usr/bin/python3
ln -s /usr/local/python36/bin/pip3 /usr/bin/pip3 pip3 install -r requirements.txt
ln -s /usr/local/python36/bin/uwsgi /usr/bin/uwsgi
mkdir -p /var/log/uwsgi
requirements.txt
Django==3.0.6
uwsgi==2.0.8

注意:这里对requirements.txt的定位是,用于存放一定需要安装,并且极少改动(比如更换版本)的软件依赖包

创建基础镜像

如下,创建djbase:v1.0基础镜像,为运行Django项目提供所需的软件运行环境

# docker build --no-cache -t djbase:v1.0 -f env_dockerfile .
...略docker build --no-cache -t djbase:v1.0 -f env_dockerfile .
Successfully tagged djbase:v1.0

创建服务镜像前置准备工作

创建一个干净的目录(例中为server_build),用于创建最终服务镜像,并将解压后的Django项目代码存放到该目录,然后在该目录下新建并编写dockerfile.dockerignore 文件。

# pwd
/root/server_build
# ls -a
. .. DjServer dockerfile .dockerignore
dockerfile
FROM djbase:v1.0

WORKDIR /opt/DjServer
RUN mkdir -p /var/log/uwsgi
COPY ./DjServer/docker/nginx.conf .
RUN mv -f ./nginx.conf /usr/local/nginx/conf/nginx.conf && chmod 755 /usr/local/nginx/conf/nginx.conf
COPY ./DjServer .
RUN chmod 755 ./docker/start.sh
EXPOSE 80
ENTRYPOINT ["./docker/start.sh"]
.dockerignore
*/__pycache__
docker/start.sh
#!/bin/bash
`uwsgi --ini uwsgi.ini &` && nginx -c /usr/local/nginx/conf/nginx.conf -g "daemon off;"
docker/nginx.conf

“实践过程1”

创建服务镜像

如下,创建djserver:v1.0服务镜像

# docker build -t djserver:v1.0 .
...略
Successfully tagged djserver:v1.0

创建容器

基于上述镜像创建名为djserver的容器,映射宿主主机80端口到容器的80端口

# docker run --name dj9003 -p 9003:80 -e hostPort=10.1.66.163:9003 -d -it djserver:v1.0

Docker 基于Dockerfile创建镜像实践的更多相关文章

  1. Docker基于容器创建镜像

    docker commit -m "提交信息" -a "作者信息" imgId imgName

  2. docker——Dockerfile创建镜像

    写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境 ...

  3. docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。

    一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...

  4. Docker 基于已有镜像的容器创建镜像

    Docker 基于已有镜像的容器创建镜像: docker:/root# docker run -it januswel/centos /bin/bash docker exec -it januswe ...

  5. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  6. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

  7. Dockerfile创建镜像

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像. Dockerfile由一行行命令语句组成,并且支持易#开头的注释行. 一般而言Dockerfil ...

  8. 基于Dockerfile创建docker镜像

    0.先创建一个文件夹img mkdir img 1.Linux上新建3个文件 2.文件内容分别写入 (1)Dockerfile中 # 基于的基础镜像centos FROM centos # 维护该镜像 ...

  9. docker基于Dockerfile命令创建支持ssh服务的镜像

    首先,创建一个sshd_centos工作目录: [root@localhost ~]# mkdir sshd_centos [root@localhost ~]# cd sshd_centos [ro ...

  10. Docker实战(六)之使用Dockerfile创建镜像

    Dockervile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义镜像. 1.基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行. 一般而言,Do ...

随机推荐

  1. Nginx的正向代理和反向代理

    1.Nginx代理 (1)Nginx出现的早期就是作为一个高性能的http.反向代理的web服务器. (2)同时它也提供了IMAP/POP3/SMTP服务,也就是电子邮件代理服务器. (3)它的特点就 ...

  2. 全网最全100个AI工具导航网站合集

    随着ChatGPT年前的爆火,人工智能也变成当今最热门的领域之一,它正在改变着我们的生活和工作方式.无论你是想要学习人工智能的基础知识,还是想要利用人工智能来提升你的业务效率和创新能力,都需要找到合适 ...

  3. golang import 导入的四种方式

    1 标准导入: import "package_name" 2 导入别名: import ( alias "package_name" ) 3 匿名导入: _ ...

  4. lodash已死?radash库方法介绍及源码解析 —— 随机方法 + 字符串篇

    前言 大家好,我是阿瓜.一个励志想成为艾弗森的前端瓜 ~ 我们已经分享了 radash 库中数组.对象等相关的方法,大家感兴趣的可以前往主页查看阅读: 或许你最近在某个地方听过或者看过 radash ...

  5. xshell 自动断开连接的解决方法

    1. 问题分析 本文Xshell连接自动断开的原因是SSH配置文件的ClientAliveInterval字段设置的超时断开时间小于Xshell的检查断开连接时间. 2. SSH配置文件中的字段详解 ...

  6. ts的keyof

    keyof 是 TypeScript 中的一种类型操作符,用于获取一个类型的所有键(属性名)作为联合类型.它的语法如下: type KeysOfType = keyof ObjectType; 其中: ...

  7. ETL工具-nifi干货系列 第十四讲 nifi处理器PublishKafka实战教程

    1.kettle的kafka生产者叫kafka producer,nifi中的相应处理器为PublishKafka,如下图所示: 可以很清楚的看到PublishKafka处理器支持多个版本的kafka ...

  8. .net执行oracle查询语句报错“指定的转换无效”解决方案

    问题: .net执行oracle查询语句报错"指定的转换无效",在PL/SQL中正常: SELECT A.ID,SUM(TO_NUMBER(A.MODIFYTIME-A.UPLOA ...

  9. apollo配置json

    #json串原文[{"username":"李小刚","sex":"男"},{"username": ...

  10. 高通Android UEFI中的LCD分析(2):关键的函数

    # 高通Android UEFI中的LCD分析(2):关键的函数 背景 在启动流程分析中,看到了几个经常出现的函数,这里实际分析一下有关的实现.以搞清楚高通做了什么,以及我们能做什么. 重要函数 MD ...