Dockerfile学习
-
Dockerfile简介
Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来
-
Dockerfile作用
1、找一个镜像: ubuntu 2、创建一个容器: docker run ubuntu 3、进入容器: docker exec -it 容器 命令 4、操作: 各种应用配置 .... 5、构造新镜像: docker commit
-
Dockerfile使用准则
1.大: 首字母必须大写D 2.空: 尽量将Dockerfile放在空目录中。 3.单: 每个容器尽量只有一个功能。 4.少: 执行的命令越少越好。
-
具体操作(快速入门)
-
准备环境
# 创建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 ./
-
定制文件
# 构建一个基于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
-
-
基础指令详解
-
FROM
# 格式: FROM <image> FROM <image>:<tag>。 # 解释: # FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
-
MAINTAINER
# 格式: # MAINTAINER <name> # 解释:指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
-
RUM
# 格式: RUN <command> (shell模式) RUN["executable", "param1", "param2"]。 (exec 模式) # 解释:表示当前镜像构建时候运行的命令 注释: shell模式:类似于 /bin/bash -c command 举例: RUN echo hello exec 模式:类似于 RUN ["/bin/bash", "-c", "command"] 举例: RUN ["echo", "hello"]
-
EXPOSE
# 格式:EXPOSE <port> [<port>...] # 解释:设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
-
ENTRYPOINT
# 格式: # ENTRYPOINT ["executable", "param1","param2"] (exec 模式) # ENTRYPOINT command param1 param2 (shell模式) # 解释:每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
-
-
文件编辑指令详解
-
ADD
# 格式: ADD <src>... <dest> ADD ["<src>",... "<dest>"] # 解释:将指定的 <src> 文件复制到容器文件系统中的 <dest> # src 指的是宿主机,dest 指的是容器 # 如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
-
COPY
# 格式: COPY <src>... <dest> COPY ["<src>",... "<dest>"] # 解释:单纯复制文件场景,Docker推荐使用COPY
-
VOLUME
# 格式: VOLUME ["/data"] # 解释:VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。 # 举例: VOLUME ["/var/lib/tomcat7/webapps/"]
-
实践
# ADD 拷贝普通文件 ADD ["sources.list","/etc/apt/sources.list"] # ADD 拷贝压缩文件 ADD ["linshi.tar.gz","/nihao/"] # COPY 增加文件 COPY index.html /var/www/html/ # 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME VOLUME ["/data/"]
-
-
环境指令详解
-
ENV
# 格式: ENV <key> <value> ENV <key>=<value> ... # 解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
-
WORKDIR
# 格式: WORKDIR /path/to/workdir (shell 模式) # 解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd,可以多次切换(相当于cd命令), 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如 #举例: WORKDIR /a WORKDIR b WORKDIR c RUN pwd # 则最终路径为 /a/b/c。
-
实践
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV ENV NIHAO=helloworld # 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR WORKDIR /nihao/xlz/ RUN ["touch","xlz.txt"]
-
-
Dockerfile构建过程
从基础镜像1运行一个容器A 遇到一条Dockerfile指令,都对容器A做一次修改操作 执行完毕一条命令,提交生成一个新镜像2 再基于新的镜像2运行一个容器B 遇到一条Dockerfile指令,都对容器B做一次修改操作 执行完毕一条命令,提交生成一个新镜像3
构建历史:
查看构建过程查看
docker history
清理构建缓存:
docker system prune docker system prune --volumes
-
Dockerfile案例实践
-
环境分析
1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。 因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的源。 2、软件安装,涉及到了各种软件 3、软件运行涉及到了软件的运行目录 4、项目访问,涉及到端口
-
关键点分析
1、增加文件,使用 ADD 或者 COPY 指令 2、安装软件,使用 RUN 指令 3、命令运行,使用 WORKDIR 指令 4、项目端口,使用 EXPOSE 指令 5、容器运行,使用 ENTRYPOINT
-
定制方案
1、基于ubuntu-ssh基础镜像进行操作 2、安装环境基本软件 3、定制命令工作目录,并增加文件 4、开放端口 5、执行项目
-
Dockerfile定制
# 进入标准目录 mkdir /docker/images/django -p cd /docker/images/django # 第一版dockerfile内容 # 构建一个基于ubuntu的docker定制镜像 # 基础镜像 FROM ubuntu-ssh # 镜像作者 MAINTAINER President.Wang 000000@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 xlz # 创建应用 WORKDIR /data/server/xlz RUN python3 manage.py startapp test1 RUN sed -i "/staticfiles/a\ 'test1'," xlz/settings.py # 配置应用 COPY views.py /data/server/xlz/test1/ RUN sed -i '/t p/a\from test1.views import *' xlz/urls.py RUN sed -i "/\]/i\ path('hello/', hello)," xlz/urls.py # 启动项目 RUN sed -i "s#S = \[\]#S = \['*'\]#" xlz/settings.py # 对外端口 EXPOSE 8000 # 运行项目 ENTRYPOINT ["python3","manage.py","runserver","0.0.0.0:8000"]
-
效果查看
# 构建镜像 docker build -t ubuntu-django . # 运行镜像 docker run -p 8000:8000 -d ubuntu-django
-
-
应用
# 启动运行基本系统 FROM ubuntu # 安装环境 ADD ./requeriments.text /home # 进入/home WORKDIR /home # 安装 RUN apt-get update && apt-get install python3-pip && pip install django==1.11.11 RUM pip install -r requeriments.text # 导入项目文件 ADD ./meiduo_mall /home/meiduo_mall # 进入/home/meiduo_mall WORKDIR /home/meiduo_mall # 指定对外开发 EXPOSE 8001 ENRYPOINT uwsgi --ini uwsgi.ini