需求描述

简单说,就是创建一个服务型的镜像,即运行基于该镜像创建的容器时,基于该容器自动开启一个服务。具体来说,是创建一个部署了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. Java 对象的揭秘

    前言 作为一个 Java 程序员,我们在开发者最多的操作要属创建对象了.那么你了解对象多少?它是如何创建?如何存储布局以及如何使用的?本文将对 Java 对象进行揭秘,以及讲解如何使用 JOL 查看对 ...

  2. 使用 CompeletedFuture 实现异步调用

    在我们平时写的项目中,异步调用是一个比较重要的优化手段,在 Java 中,提供了 CompletedFuture 供我们使用,具体实现如下: 例子 假如现在有一个需求,我需要去淘宝.天猫和京东去搜索某 ...

  3. MQ的相关概念

    MQ的相关概念 什么是MQ ​ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下 ...

  4. 将手机声音通过蓝牙输入到WIN10电脑-安卓手机投屏直播无声音

    安卓手机投屏无声音,斗鱼,虎牙,直播无声音.可以用本方案,前提是电脑要有蓝牙功能,没有蓝牙,可以购买一个USB蓝牙适配器(不建义买CSR芯片的,CSR驱动会导致office 和远程桌面有问题). 操作 ...

  5. 基于Web3.0的区块链图片上传

    开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点 什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了) 需求:开发一个基于Python的Web 3.0图片上传系统.这个系 ...

  6. MinIO 图片转文件的分界线RELEASE.2022-05-26T05-48-41Z

    前言:本人想用MinIO存储文件,但是不想最新版本Mete文件,于是各种寻找于是终于找到办法了,原来是官方版本更新导致的.需要我们去寻找相应的版本. 1.官网下载网站 https://dl.min.i ...

  7. requests的使用

    准备工作 安装request库 pip install request 实例引入 get方法实现GET请求,返回一个Response对象,存放在变量r中,分别输出响应的类型.状态码.响应体的类型.内容 ...

  8. RHEL8.1---离线升级gcc

    升级gcc到gcc9.1.0 下载离线包.放到/opt下 [root@172-18-251-35 opt]# wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc ...

  9. Freertos学习:在Posix环境仿真FreeRTOS

    --- title: rtos-freertos-在Posix环境仿真FreeRTOS date: 2020-06-11 16:22:34 categories: tags: - freertos - ...

  10. V4L2视频采集操作流程和接口说明

    背景: V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和底层V4L2驱动接口. <WAV文件格式分析> 一般操作流程(视频设备): 1.打开设备 ...