概述

很多情况下我们需要自定制镜像,如果自定制过程中需要下载配置很多包,而且这些包之间还有依赖关系,那么如果我们手动去操作的话就会很麻烦,正确的做法是把操作的命令封装到一个文件里,然后直接执行这个文件就行了,docker提供了这个文件,就是Dockerfile,下面我们用Dockerfile来自定制一个运行在centos环境下的django镜像

## 定制过程


### 1.下载centos镜像
```linux
docker pull centos

<br>
### 2. 下载django-2.1.7源码包与阿里云扩展源epel.repo文件
在/opt目录下建立一个docker目录,切换到docker目录,下载django源码包与epel.repo文件
```linux
wget https://media.djangoproject.com/releases/2.1/Django-2.1.7.tar.gz
wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

### 3. 创建空的Dockerfile和run.sh文件
Dockerfile是存放创建镜像过程中所需命令的文件,run.sh是执行Django的bash脚本

创建好之后/opt/docker目录下的文件应该如下

[root@localhost docker]# ls
Django-2.1.7.tar.gz Dockerfile epel.repo run.sh

### 4. 编写Dockerfile

这一步是这篇博客的重点

FROM centos                                    # 指定base image
MAINTAINER robin # 作者名字 ADD epel.repo /etc/yum.repos.d # 将当前目录的epel.repo文件拷贝到容器的/etc/yum.repos.d目录下
RUN yum update -y # 运行命令 RUN yum install -y python36
RUN yum install -y python36-pip
RUN pip3 install setuptools
ADD Django-2.1.7.tar.gz /opt/ WORKDIR /opt/ # 进入/opt目录
RUN mv Django-2.1.7 django # 运行命令mv WORKDIR /opt/django # 进入/opt/django目录
RUN python3 setup.py install WORKDIR /opt
RUN django-admin.py startproject myproject ADD run.sh /opt/qishi3dj/run.sh
WORKDIR /opt/qishi3dj
RUN chmod 777 run.sh # 更改run.sh的权限
EXPOSE 9090 # 声明容器端口
CMD ["/bin/sh","run.sh"] # 容器启动时默认执行的命令

### 5. 编写run.sh
```linux
python3 manage.py runserver 0.0.0.0:8000


<br> ## 生成镜像 生成镜像使用build命令 ```linux
docker build -t robin/django-217 .

## 启动容器

后台启动容器,将宿主机的9090端口映射到容器的8000端口

docker run -d -p 9090:8000  robin/django-217

## 进入容器
查看容器运行状态,找到容器id

docker ps

以交互模式进入容器

docker exec -it xxx /bin/bash

查看运行的进程,可以看到

UID         PID   PPID  C STIME TTY          TIME CMD
root 1 0 0 15:43 ? 00:00:00 /bin/sh run.sh
root 6 1 0 15:43 ? 00:00:00 python3 manage.py runserver 0.0.0.0:8000
root 28 6 4 15:48 ? 00:03:00 /usr/bin/python3 manage.py runserver 0.0.0.0:8000
root 36 0 0 16:56 pts/0 00:00:00 /bin/bash
root 49 36 0 16:56 pts/0 00:00:00 ps -ef

## 使用

修改settings.py的ALLOWHOSTS=["*"]

访问192.168.1.111:9090

## 导出镜像
```
docker save -o centos_django217.tar.gz robin/django-217
```
-o 指定地址和文件名
robin/django-217为镜像名

[root@localhost docker]# ls
centos_django217.tar.gz Django-2.1.7.tar.gz Dockerfile epel.repo run.sh

docker自定制镜像的更多相关文章

  1. Docker Dockerfile 定制镜像(转)

    转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...

  2. 【Docker自定制镜像之Dockerfile】

    镜像的定制,就是定制每一层所添加的配置.文件,如果可以把每一层修改.安装.构建.操作的命令都写入到一个脚本中,用脚本来构建.定制镜像,这个脚本就是Dockerfile Dockerfile是一个文本文 ...

  3. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像  镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...

  4. Docker - 定制镜像

    Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...

  5. Docker入门之--定制镜像

    1. 首先定制一个Web 服务器为例 1.1 启动镜像 执行下面命令 docker run --name webserver -d -p 80:80 nginx 1.2 查看容器和镜像状态 然后执行下 ...

  6. docker之常用命令、自定制镜像、公(私)仓库的上传和下载

    一.docker命令 1.参数和命令汇总 1. 参数 Options: --config=~/.docker Location of client config files #客户端配置文件的位置 - ...

  7. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  8. Docker定制镜像

    定制镜像 除了使用定制好的镜像外,我们也可以通过定制实现符合自己环境的镜像. 在docker里面通过build方法来生成镜像,在生成镜像之前,我们需要一个Dockerfile脚本,脚本中包含的是一条一 ...

  9. Docker上定制CentOS7镜像

    原文:Docker上定制CentOS7镜像 前言: 环境:centos7.5 64 位 正文: 第一步:下载centos7镜像 docker pull centos 第二步:建立centos7的容器 ...

随机推荐

  1. Jenkins 配置GitLab插件和Git插件

    本文演示如何在安装完Jenkins之后,配置GitLab插件和Git插件. 1 安装插件 浏览器登录Jenkins Web UI,点击系统管理,再点击管理插件,切换到可选插件,分别搜索GitLab P ...

  2. Not on FX application thread; currentThread = AWT-EventQueue-0的解决方法

    swing awt跑javafx报了这问题 Not on FX application thread; currentThread = AWT-EventQueue-0 解决方法 Platform.r ...

  3. QLabel class

    Help on class QLabel in module PyQt5.QtWidgets: class QLabel(QFrame)  |  QLabel(parent: QWidget = No ...

  4. Couchbase入门——环境搭建以及HelloWorld

    一.引言 NoSQL(Not Only SQL),火了很久了,一直没空研究.最近手上一个项目对Cache有一定的要求,借此机会对NoSQL入门一下.支持NoSQL的数据库系统有很多,  比如Redis ...

  5. arale-cookie 使用

    https://www.npmjs.com/package/arale-cookie  arale-cookie 使用 define(function() { var Cookie = require ...

  6. js中对象引用出现的问题

    先看一个特别不符合直觉的代码 <script type="text/javascript"> var a = [1,2,3,4]; var b = [1,2,3,4]; ...

  7. Java中的String,StringBuilder,StringBuffer

    String被final修饰,不可变,每次更改其实是重新创建了一个对象.StringBuilder,StringBuffer是可变的. StringBuffer是线程安全的,StringBuilder ...

  8. mysql-笔记 隔离级别、事务

    1 隔离级别:低级别的隔离通常可以执行更高的并发,系统 开销也更低 2 Read uncommitted:事务可以读取未提交的数据,脏读,应少用 3 read committed:不可重复读,事务只能 ...

  9. 利用ir.sequence自动生成序列号

    利用ir.sequence自动生成序列号 什么是序列号 可以这么理解,我有一个产品序号,编码的前缀是SOP,后缀是0001~9999的序号,没生成一个产品就自动流水加一,序列号不会重复,odoo中的i ...

  10. 《JAVA与模式》之工厂方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...