Dockerfile主要用在Docker中,构建镜像。

Dockerfile是由一行一行指令组成的,支持以#开头的行为注释的行。

一般而言,Dockerfile主体内容分为两个部分:基础镜像信息(必须)、其他指令。

在构建镜像之前,必须基于Docker一个基础环境(基础镜像)。

FROM

FROM指令必须是Dockerfile中的第一个指令,而且FROM指令有且只有一个,主要用来指定一个构建镜像的基础环境。

  1. [root@kubernetes linux]# vim Dockerfile
  2. [root@kubernetes linux]# cat Dockerfile
  3. FROM python:3.6

MAINTAINER

指定维护者信息。没有实际作用,主要是用来指定构建该镜像的作者信息。

[root@kubernetes linux]# cat Dockerfile 
FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN

构建镜像时执行命令。

[root@kubernetes linux]# cat Dockerfile 
FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 构建镜像
[root@kubernetes linux]# docker build -t django:v1 .

CMD

设置Docker镜像启动时默认执行的命令。

[root@kubernetes linux]# cat Dockerfile 
FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

CMD python manage.py runserver 0.0.0.0:8080

ENTRYPOINT

设置Docker镜像启动命令,如果设置了ENTRYPOINT,则CMD将会变成它的参数。

FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

ADD ./  /opt/

VOLUME /tmp

WORKDIR /opt

EXPOSE 8080 

ENTRYPOINT ["python"]

CMD ["manage.py", "runserver", "0.0.0.0:8080"]

WORKDIR

指定Docker容器的工作目录。也就是说docker容器启动时,默认执行命令的目录。

[root@kubernetes linux]# cat Dockerfile 
FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

WORKDIR /opt

CMD python manage.py runserver 0.0.0.0:8080

[root@kubernetes linux]# docker run -d -v /root/django/linux/:/opt -p 8081:8080 django:v3

EXPOST

expost是Dockerfile中指定默认端口号。

[root@kubernetes linux]# cat Dockerfile 
FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

WORKDIR /opt

EXPOSE 8080 8081 8082 8083/udp

CMD python manage.py runserver 0.0.0.0:8080

ADD

将宿主主机中的内容或者互联网下载的内容放置于镜像中。支持自动解压(注意:ADD只支持解压tar类型的压缩包)。

FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

ADD ./  /opt/

ADD http://106.13.81.75/Navicat15.exe  /tmp/

WORKDIR /opt

EXPOSE 8080 8081 8082 8083/udp

CMD python manage.py runserver 0.0.0.0:8080

COPY

将宿主主机中的内容复制到镜像中。不支持互联网下载,也不支持自动解压。

FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

COPY etcd-v3.4.14-linux-amd64.tar.gz  /tmp/

WORKDIR /opt

EXPOSE 8080

CMD python manage.py runserver 0.0.0.0:8080

VOLUME

指定容器需要挂载的目录(注意:如果我们启动容器时,使用了-v参数则直接挂载,如果没有使用,则会指定一个默认的挂载)

FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

ADD ./  /opt/

VOLUME /tmp

WORKDIR /opt

EXPOSE 8080 

CMD python manage.py runserver 0.0.0.0:8080

ENV

指定该镜像启动容器中的环境变量。

FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

ADD ./  /opt/

VOLUME /tmp

ENV DJANGO_VERSION=123456

WORKDIR /opt

EXPOSE 8080 

ENTRYPOINT ["python"]

CMD ["manage.py", "runserver", "0.0.0.0:8080"]

ARG

设置构建镜像临时参数。

[root@kubernetes django]# cat Dockerfile 
FROM python:3.6 

ARG package=django

RUN pip install $package


[root@kubernetes django]# docker build --build-arg=package=pymysql  -t django:v17 .

ONBUILD

Docker构建触发器。主要是当该镜像作为基础镜像时触发。

[root@kubernetes django]# cat Dockerfile 
FROM  django:v19 

ARG package=django

RUN pip install $package

ONBUILD RUN rm -rf /opt

案例:使用Nginx代理Django

1、Django

  • Dockerfile ```dockerfile FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple/

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

RUN mkdir /opt/linux

ADD ./linux /opt/linux/

EXPOSE 8000

WORKDIR /opt/linux

CMD [“uwsgi”, “—ini”, “myweb.ini”] FROM python:3.6

MAINTAINER shanhe shanhe@123.com xxxxxxx

RUN pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple/

RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

ADD ./linux/ /opt/

EXPOSE 8080

WORKDIR /opt

CMD [“uwsgi”, “—ini”, “myweb.ini”]


- myweb.ini
```properties
[uwsgi]
# 端口号
socket            = :8000
# 指定项目的目录
chdir           = /opt/linux
# wsgi文件路径
wsgi-file       = linux/wsgi.py
# 模块wsgi路径
module          = linux.wsgi
# 是否开启master进程
master          = true
# 工作进程的最大数目
processes       = 4
# 结束后是否清理文件
vacuum          = true
  • 构建镜像

    docker build -t django:v20 .
    
  • 启动镜像

    docker run -d --name django django:v20
    

    2、Nginx

  • 配置文件 ```nginx server { listen 80; server_name py.test.com; location / { include uwsgi_params; uwsgi_pass django:8000; uwsgi_read_timeout 2; uwsgi_param UWSGI_SCRIPT linux.wsgi; uwsgi_param UWSGI_CHDIR /opt/linux; index index.html index.htm; client_max_body_size 35m; } }


- Dockerfile
```dockerfile
FROM nginx

ADD default.conf /etc/nginx/conf.d/

EXPOSE 80 443

CMD nginx -g 'daemon off;'
  • 构建镜像

    docker build -t nginx:v20 .
    
  • 创建网桥

    docker network create chenyang1
    
  • 绑定容器

    docker network connect chenyang1 django
    
  • 创建容器

    docker run -d --name nginx --network chenyang1 nginx:v20
    

    3、测试结果

    image.png