Dockerfile

Dockerfile镜像制作

docker中, 镜像是容器的基础,每次执行docker run的时候都会指定哪个基本镜像作为容器运行的基础。我们之前的docker的操作都是使用来自dockerhub提供的官方镜像,直接使用这些镜像只能满足一定的基本需求,当基础镜像无法满足我们的业务需求时,就得使用Dockerfile自己定制这些镜像了。

Dockerfile是提供开发者用于定制自定义镜像的配置文件。所以我们需要掌握Dockerfile文件的基本语法。

镜像的定制就类似小时候学画画的水彩画一样,水彩画是一层一层的涂抹上去的,而镜像的定制则是编写定制每一层所添加的配置、文件等命令信息。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条用于自定义镜像的指令(Instruction),这些指令每一条就构建一层,因此每一条指令的内容,就是告诉docker该如何构建每一层的镜像内容。
注意:每一层指令执行结束以后就会隔离打开一层。所以Dockerfile中的命令层级如果越多,则构建生成的镜像就越大,也就越臃肿,所以我们应该在学习完Dockerfile的语法以后,尽量采用最少的指令来定制镜像。

基本指令

FROM参数

一般写在Dockerfile的首行,指定基础镜像,一个Dockerfile中只有一个FROM

FROM elasticsearch # 制作base image(基础镜像),尽量使用官方的image作为base image FROM centos:8 # 以centos为基础镜像,进行二次构建镜像 
FROM ubuntu:20.04 # 带有tag的基础镜像
LABEL参数

等价于MAINTAINER,用于设置当前dockerfile镜像的作者相关信息。

FROM elasticsearch ​ 
LABEL version="1.0.0"     # 容器元信息,帮助信息,Metadata,类似于代码注释 
LABEL maintainer="649641514@qq.com"
RUN参数

RUN参数是一个万能指令,用于指定镜像内部执行系统命令, 对于复杂的RUN命令,避免不必要的分层,多条命令用反斜线换行,或者使用&& 组合成一条命令!

RUN apt update && apt install -y vim \
         Python-dev && # 反斜线表示命令没有结束,仅仅换行       
        /bin/bash -c "source $HOME/.bashrc;echo $HOME"

WORKDIR参数

设置镜像启动以后的容器默认工作目录,相当于linux的cd命令

WORKDIR /ect # 相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd WORKDIR /home/demo # 如果没有就自动创建 
RUN pwd       # 打印结果应该是/home/demo
ADD参数

复制解压,把宿主机的一个文件,添加到容器空间内,相当于 docker的cp

ADD /opt/django/manage.py /opt/  # 把宿主机的/opt/django/manage.py放到容器空间内的/opt/目录下 
ADD /opt/python3.8.12.tar.gz /opt/  # ADD的解压文件作用,将宿主机的/opt/下的python3.6.tar.gz解压到容器内的/opt/目录下
COPY参数

拷贝指令,功能与ADD类似,但是没有解压过程,只有单纯复制,也相当于 docker的cp。

将宿主机的文件, 拷贝到容器内,但是没有解压缩的命令,尽量使用COPY,不要使用ADD

COPY /opt/django/manage.py /opt/ # 把宿主机的/opt/django/manage.py放到容器空间内的/opt/目录下

注意:ADD与COPY的区别:

  1. 如果不是复制压缩包到容器内部,优先使用COPY命令

  2. ADD除了COPY功能还有解压功能

  3. 添加远程网络文件/目录使用RUN curl或RUN wget

ENV参数

设置docker容器内部的系统环境变量,相当于 docker -e

ENV MYSQL_VERSION 5.6 # 设置一个mysql常量,这个${MYSQL_VERSION}类似于全局常量 
RUN yum install -y mysql-server="${MYSQL_VERSION}"  # 如果版本号有变更,则只需要改这个常量就可以了
CMD参数

Dockerfile的结尾运行命令,类似RUN ,但是参数值是一个数组/列表,使用中括号括起来。

CMD ["sh", "run.sh"]

使用 Dockerfile之前,先切换成国内docker镜像源

mkdir -p /etc/docker sudo vim /etc/docker/daemon.json ​ ​ 
{    "registry-mirrors" : 
[        "https://registry.docker-cn.com",                "https://docker.mirrors.ustc.edu.cn",        
        "http://hub-mirror.c.163.com",       
         "https://cr.console.aliyun.com/"   ] }

案例:使用Dockerfile封装Django镜像

在/home下建立了docker目录,在这个目录下准备好要构建镜像的文件和源码包。

mkdir /home/docker && cd /home/docker
# 创建镜像制作配置文件,
touch Dockerfile
# 创建一个shell脚本,用于后面启动django项目的。
touch run.sh
# docker官方提供的ubuntu镜像,里面源地址过时了,所以我们提供一个新的到容器内部
touch sources.list
sudo cp /etc/apt/sources.list ./

下载一个django-3.2.5的源码包

wget -O Django-3.2.5.tar.gz https://gitee.com/mirrors/django/repository/archive/3.2.5?format=tar.gz

编写Dockerfile构建镜像的配置文件

注意:Dockerfile中不能出现命令以外的任何注释。以下是注释版本(正式使用时请删除全部的注释):

vim Dockerfile

# 指定当前定制镜像的基础镜像以及版本号
FROM ubuntu:20.04
# 指定镜像的描述信息[版本号、作者]
LABEL version="1.0.0"
LABEL maintainer="649641514@qq.com"

# 从镜像外复制并解压到镜像内部
ADD Django-3.2.5.tar.gz /opt/
# 设置当前定制镜像的镜像源
COPY /etc/apt/sources.list  /etc/apt/sources.list
# 运行终端命令,安装python3以及相关工具包
RUN apt update &&  apt install -y python3 python3-pip
# 切换工作目录
WORKDIR /opt/
# 改目录名
RUN mv django-3.2.5 django
# 切换工作目录
WORKDIR /opt/django
# 安装django框架
RUN python3 setup.py install
# 切换工作目录
WORKDIR /opt
# 创建一个django项目
RUN django-admin.py startproject djdemo
# 从镜像外界复制一个run.sh启动脚本到django项目根目录下
COPY run.sh /opt/djdemo/run.sh

# 切换工作目录
WORKDIR /opt/djdemo
# 替换django配置文件settings.py的ALLOWED_HOSTS配置项,允许客户端通过任何地址访问django项目并设置django的启动脚本的权限为755
RUN sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['\*'\]/g" /opt/djdemo/djdemo/settings.py && chmod 755 run.sh
# 开放镜像的端口8000
EXPOSE 8000
# CMD就是RUN,用于在结尾执行终端命令
CMD ["/bin/sh","run.sh"]

编写run.sh

vim run.sh
python3 manage.py runserver 0.0.0.0:8000

Docker构建镜像

# docker build -t 镜像名:镜像版本 Dockerfile所在路径
sudo docker build -t djdemo:3.2.5 .
docker images

构建完成后,可以看到生成一个新镜像。

此时后台启动镜像,并把容器8000端口映射到物理机的8008端口。

docker run -d -p 8008:8000 --name=django1 djdemo:3.2.5

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值