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