> 文章列表 > Dockerfile

Dockerfile

Dockerfile

文章目录

    • 1.Dockerfile简介
    • 2.Dockerfile入门
    • 3.Dockerfile指令详解
    • 4.Dockerfile构建过程
    • 5.Dockerfile案例实践

1.Dockerfile简介

Dockerfile使用命令:

#构建镜像命令格式:docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
#  -t   指定构建后的镜像信息,
# /opt/dockerfile/nginx/   则代表Dockerfile存放位置,如果是当前目录,则用.(点)表示
docker build -t nginx:v0.2 /opt/dockerfile/nginx/

2.Dockerfile入门

这一节,我们从环境、文件、构建、效果这四个方面来速的使用Dockerfile来创建一个定制化的镜像:ssh。

准备环境

#创建Dockerfile专用目录
mkdir /docker/images/ssh -p
cd /docker/images/ssh
#创建秘钥认证
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
cp /etc/apt/sources.list ./

定制文件

创建Dockerfile文件

# 构建一个基于ubuntu的ssh定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 执行命令
# 增加软件源
ADD sources.list /etc/apt/sources.list
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
#构建镜像
docker build -t ubuntu-ssh .
#使用新镜像启动一个容器,查看效果
docker run -d -p 10086:22 ubuntu-ssh
#容器检查
docker ps
docker port c03d146b64d4
#ssh查看效果
ssh 192.168.8.14 -p 10086

3.Dockerfile指令详解

这一节,我们来学习五个基础指令

基础指令

FROM格式:

#FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
FROM <image>
FROM <image>:<tag>

MAINTAINER格式:

#指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
MAINTAINER <name>

RUN格式:

每一行的RUN命令都会产生一层image layer, 导致镜像的臃肿

#表示当前镜像构建时候运行的命令
# RUN echo hello  
RUN <command>           # shell模式:类似于 /bin/bash -c command
# RUN ["echo", "hello"]
RUN ["executable", "param1", "param2"]   # exec 模式:RUN ["/bin/bash", "-c", "command"]

EXPOSE格式:

#设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配
EXPOSE <port> [<port>...]

ENTRYPOINT格式:

entrypoint用于设置执行的命令,cmd传递参数

#每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT ["executable", "param1","param2"]     #exec 模式
ENTRYPOINT command param1 param2                 #shell模式

CMD

容器启动命令CMD,容器启动时默认执行的命令, 启动容器时指定了其它命令,则CMD命令会被忽略

EXEC格式

建议使用exec的列表格式可以使用env环境变量

USER

尽量使用非root用户

目录文件编辑指令

ADD格式:

ADD和COPY目标目录不存在都会自动创建,ADD自动去解压缩文件

ADD <src>... <dest> #将指定的<src>文件复制到容器文件系统中的<dest> 
ADD ["<src>",... "<dest>"] #src指的是宿主机,dest指的是容器

COPY格式:

#单纯复制文件场景,Docker推荐使用COPY 
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

VOLUME格式:

#VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
#通过VOLUME指令创建的挂载点,无法指定主机上对应的目录,是自动生成的
VOLUME ["/data"]

环境设置指令

ENV格式:

ENV设置的变量可以保存在image中和容器中

 #设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定ENV <key> <value>ENV <key>=<value>

WORKDIR格式:

#切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录.相当于cd可以多次切换(相当于cd命令),
WORKDIR /path/to/workdir         #shell 模式

ARG 格式

可以在镜像build的时候动态修改value, 通过 --build-arg

4.Dockerfile构建过程

构建历史

docker history <镜像名> 

构建缓存

我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存

全部不使用缓存

#构建时不适用缓存
docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
#部分使用缓存,dockerfile中指定REFRESH_DATE环境变量
#只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
ENV REFRESH_DATE 2018-01-12

部分使用缓存

# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER xxxqq.com
# 创建构建刷新时间
ENV REFRESH_DATE 2018-11-02
# 执行命令

清理缓存

docker system prune
docker system prune --volumes

5.Dockerfile案例实践

这一节,我们从环境分析、关键点分析、定制方案、Dockerfile实践这三个方面来学习

Dockerfile定制

进入标准目录

mkdir /docker/images/django -p
cd /docker/images/django

第一版dockerfile内容

# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu-ssh
# 镜像作者
MAINTAINER XXX@qq.com
# 执行命令
RUN apt-get install python3-pip -y
# 增加文件
ADD Django-2.1.2.tar.gz /data/softs/
WORKDIR /data/softs/Django-2.1.2
RUN python3 setup.py install
# 创建项目
WORKDIR /data/server
RUN django-admin startproject itcast
# 创建应用
WORKDIR /data/server/itcast
RUN python3 manage.py startapp test1
RUN sed -i "/staticfiles/a\\  'test1'," itcast/settings.py
# 配置应用
COPY views.py /data/server/itcast/test1/
RUN sed -i '/t p/a\\from test1.views import *' itcast/urls.py
RUN sed -i "/\\]/i\\  path('hello/', hello)," itcast/urls.py
# 启动项目
RUN sed -i "s#S = \\[\\]#S = \\['*'\\]#" itcast/settings.py
# 对外端口
EXPOSE 8000
# 运行项目
ENTRYPOINT ["python3","manage.py","runserver","0.0.0.0:8000"]

把Django-2.1.2.tar.gz和views.py文件放到这个目录中

效果查看

构建镜像

docker build -t ubuntu-django

运行镜像

docker run -p 8000:8000 -d ubuntu-django