Dockerfile相似于咱们学习过的脚本,将咱们在上面学到的docker镜像,使用自动化的方式实现出来。html
记得网上有一个最佳实践,能够🔍搜索一下。python
构建镜像命令格式:nginx
docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
复制代码
构建样例:web
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
复制代码
建立 Dockerfile 专用目录:docker
建立秘钥认证:shell
准备软件源:django
cp /etc/apt/source.list ./
复制代码
注意:咱们要清除 docker 相关的配置,只留下原始的软件源。 给出一份 source.list 以下:ubuntu
# 默认注释了源码镜像以提升 apt update 速度,若有须要可自行取消注释
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial main main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
复制代码
建立 Dockerfile 文件:vim
# 构建一个基于 ubuntu 的 ssh 定制镜像
# 基础镜像
FROM ubuntu
# 镜像做者
MAINTAINER ruiyang0715@gmail.com
# 执行命令
# 增长软件源
ADD sources.list /etc/apt/sources.list
#安装ssh服务
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
#启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
复制代码
这时候的文件夹以下:segmentfault
构建镜像:
docker build -t ubuntu-ssh .
复制代码
使用新镜像启动一个容器,查看效果:
查看端口:
ssh 查看效果:
格式:
FROM <image>
FROM <image>:<tag>
复制代码
解释:
FROM 是 Dockerfile里的第一条并且只能是除了首行注释以外的第一条指令。
格式:
MAINTAINER <name>
复制代码
解释:
指定该 dockerfile 文件的维护者信息。相似咱们在 docker commit 时候使用-a 参数指定的信息
格式:
RUN <command>
RUN["executable", "param1", "param2"]
复制代码
解释: shell模式:相似于 /bin/bash-ccommand 举例: RUN echo hello exec 模式:相似于 RUN ["/bin/bash", "-c", "command"] 举例: RUN ["echo", "hello"]
格式:
EXPOSE <port> [<port>...]
复制代码
解释: 设置 Docker 容器对外暴露的端口号,Docker 为了安全,不会自动对外打开端口,若是须要外部提供访问,还须要启动容 器时增长-p 或者-P 参数对容器的端口进行分配。
格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
复制代码
解释: 每一个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
复制代码
解释:
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
复制代码
解释: 单纯复制文件场景,Docker 推荐使用 COPY
格式:
VOLUME ["/data"]
复制代码
解释:
首先在当前目录下面建立一个用于测试的压缩文件:
而后建立一个测试的单个文件 index.html
在 Dockerfile 中添加拷贝文件的命令:
# 构建一个基于 ubuntu 的 ssh 定制镜像
# 基础镜像
FROM ubuntu
# 镜像做者
MAINTAINER ruiyang0715@gmail.com
# 执行命令
# 增长软件源
ADD sources.list /etc/apt/sources.list
#安装ssh服务
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 增长文件
ADD ["sources.list","/etc/apt/sources.list"]
# 增长压缩文件
ADD ["hello.tar.gz", "/hello/"]
# 使用 COPY 增长一个文件
RUN mkdir -p /var/www/html
COPY index.html /var/www/html/
# 在容器中建立一个挂载点
VOLUME ['/data/']
# 对外端口
EXPOSE 22
#启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
复制代码
格式:
ENV <key> <value>
ENV <key>=<value> ...
复制代码
解释: 设置环境变量,能够在 RUN 以前使用,而后 RUN 命令时调用,容器启动时这些环境变量都会被指定。
格式:
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 NAME=furuiyang
复制代码
Dockerfile:
# 基础镜像
FROM ubuntu
# 镜像做者
MAINTAINER ruiyang0715@gmail.com
# 增长软件源
ADD sources.list /etc/apt/sources.list
# 安装ssh服务
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
# 取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 设置环境变量
ENV NAME=furuiyang
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 增长文件
ADD ["sources.list","/etc/apt/sources.list"]
# 对外端口
EXPOSE 22
# 启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
复制代码
从新生成镜像,开启容器运行:
docker build -t ubuntu-ssh .
docker run -d -p 10086:22 ubuntu-ssh
ssh 172.18.222.137 -p 10086
复制代码
进入使用 env 命令查看环境变量是否被设置上。
(这里有个问题就是我ssh进入就没有可是exec进入才可看到被设置的 NAME 环境变量)
构建过程当中,建立了不少镜像,这些中间镜像,咱们能够直接使用来启动容器,经过查看容器效果,从侧面能看到咱们每次构建的效果。提供了镜像调试的能力
咱们能够经过docker history <镜像名> 来查看整个构建过程所产生的镜像
查看 ubuntu-ssh 的整个构建过程当中建立的镜像:
使用中间镜像来启动容器:
docker run -d -p 10087:22 0ca50222ff8c
复制代码
拓展: 执行的步骤越多越好呢?仍是越少越好?
咱们的第一次构建会很慢,可是以后的构建都会变快,由于利用到了构建的缓存。
不使用构建缓存的两种作法: 所有不用缓存:
docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
复制代码
部分使用缓存:在 Dockerfile 中使用
# 建立构建刷新时间
ENV REFRESH_DATE 2019-08-30
复制代码
只要构建的时间不变,那么就用缓存,时间一旦改变,就不用缓存了。
查看构建过程的历史:
docker history [镜像名]
复制代码
清理构建缓存:
docker system prune
docker system prune --volumes
复制代码
技术关键点:
流程:
docker run -d -p 10086:22 --name django ubuntu-ssh
复制代码
# mkdir /data/{server,softs} -p
# cd data/softs
# scp root@192.168.8.14:/data/softs/Django-2.1.2.tar.gz ./
复制代码
注: scp 适用于 ssh 链接方式。若使用 exec 模式,能够在启动容器的时候 使用 -v 将项目文件挂载进来。 (TODO)
安装基本的依赖软件:
apt-get install python3-pip python-dev build-essential -y
复制代码
安装 Django 软件:
cd /data/softs
tar xf Django-2.1.2.tar.gz cd Django-2.1.2
python3 setup.py install
复制代码
略
设置访问主机:
# vim itcast/settings.py
...
ALLOWED_HOSTS = ['*']
复制代码
启动项目:
python3 manage.py runserver 172.17.0.2:8000
复制代码
注意: 要提早使用 ifconfig 来检查一下当前容器的 ip,以方便接下来的测试。
在宿主机, 查看容器的ip地址
docker inspect django
复制代码
浏览器、或curl查看效果:
172.17.0.2:8000/hello/
复制代码
这一章节须要后续修改完善,实际的部署不彻底是这样的,只是一个部署的初级版本。