本系列的前两篇文章,咱们曾经学习了 Docker 的装置步骤,通过理论的例子,学习了 Docker 和宿主机操作系统文件目录相互隔离的实现原理,以及 Docker Volume 的工作原理:
- Docker 实战教程之从入门到进步 (一)
- Docker 实战教程之从入门到进步 (二)
本文持续通过实战来学习如何编辑 Docker 镜像以及如何应用 Dockerfile 自制镜像。
- 练习 1:Docker 镜像提交命令 commit 的工作原理和应用办法
在本地创立一个容器后,能够根据这个容器创立本地镜像,并可把这个镜像推送到 Docker hub 中,以便在网络上下载应用。
上面咱们来入手实际。
docker pull nginx:1.15.3
用命令行启动一个容器:
docker run -d -p 1080:80 –name jerry-nginx nginx:1.15.3
拜访 url localhost:1080,能看到 Nginx 的默认首页:
进入容器的 shell:
docker exec -it jerry-nginx /bin/bash
查看这个 nginx 镜像默认的首页:
我想在容器里应用 wget,所以先装置:
apt-get update && apt-get -y install wget
应用 wget 命令下载一个图片文件和一个 html 文件到 Nginx 服务器寄存网页的地位:
wget --no-check-certificate -O /usr/share/nginx/html/evil.jpg https://github.com/raw/slvi/docker-k8s-training/master/docker/res/evil.jpg
wget --no-check-certificate -O /usr/share/nginx/html/index.html https://github.com/raw/slvi/docker-k8s-training/master/docker/res/evil.html
从新刷新页面,咱们当初看到的页面曾经变成了 wget 下载下来的页面:
咱们当初心愿把这个容器里发现的批改固化下来,以便其他人能够应用。
docker commit jerry-nginx jerry-modify-nginx:1.0
sha256:7e243a7b4c0796e3a787fe963224fdf1fe81d9fe9b283f6f3e4f17e1defa0c96
应用命令将 1.0 设置成 latest tag:
docker tag jerry-modify-nginx:1.0 jerry-modify-nginx:latest
用 docker stop jerry-nginx
把旧的容器停掉,再启动批改后的容器 jerry-modify-nginx
:
docker history
命名查看这个新镜像的历史:
执行命令给这个新的镜像打上标签:
docker tag jerry-modify-nginx:latest registry.ingress.shcw46.k8s-train.k8s-hana.ondemand.com/jerry-modify-nginx:760d7ca6
把打上标签的镜像 push 到远端:
docker push registry.ingress.shcw46.k8s-train.k8s-hana.ondemand.com/jerry-modify-nginx:760d7ca6
这样网络上的其余开发人员就能够应用这个批改了 Nginx 首页的 Docker 镜像了。
- 练习 2:创立一个反对 SSL 的 Nginx 镜像
什么是 dockerfile?简略的说就是一个文本格式的脚本文件,其内蕴含了一条条的指令 (Instruction),每一条指令负责形容镜像的以后层(Layer) 如何构建。
上面通过一个具体的例子来学习 dockerfile 的写法。
新建一个 dbuild 文件夹,创立一个自定义的 Nginx 首页,逻辑很简略,显示一个自定义的图片文件 train.jpg.
我想基于规范的 Nginx 镜像做一些批改,让 Nginx 反对 SSL。SSL(Secure Sockets Layer 安全套接层), 及其继任者传输层平安(Transport Layer Security,TLS) 是为网络通信提供平安及数据完整性的一种平安协定。
TLS 与 SSL 在传输层对网络连接进行加密。
为此我首先须要创立一个针对 SSL 的配置文件。
cat << '__EOF' > ssl.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
__EOF
应用如下命令创立 nginx.key
和 nginx.crt
文件:
openssl req -x509 -nodes -newkey rsa:4096 -keyout nginx.key -out nginx.crt -days 365 -subj “/CN=$(hostname)”
所有就绪之后,上面就应该创立 dockerfile 了:
FROM nginx:stable
# copy the custom website into the image
COPY train.jpg /usr/share/nginx/html/
COPY index.html /usr/share/nginx/html/
# copy the SSL configuration file into the image
COPY ssl.conf /etc/nginx/conf.d/ssl.conf
# download the SSL key and certificate into the image
COPY nginx.key /etc/nginx/ssl/nginx.key
COPY nginx.crt /etc/nginx/ssl/nginx.crt
# expose the https port
EXPOSE 443
所有 dockerfile 的文件,第一行指令必然是 FROM XXXX
.
FROM 的作用是指定基准镜像。该 dockerfile 以 FROM 前面指定的镜像为根底,在其上进行定制。
在 Docker Store
上有很多高质量的官网镜像,次要分为以下三大类:
- 开箱即用的服务类的镜像,比方网络服务器 nginx,也有数据库服务器诸如 redis、mongo、mysql 等;
- 不便开发、构建、运行各种语言利用的镜像,如 node、openjdk、python 等。
- 绝对前两大类更为根底的操作系统镜像,如 ubuntu、debian、centos 等。
当然您如果不违心基于这些官网已有镜像开始镜像构建,而是想从头开始,这也是能够的。
Docker 存在一个非凡的镜像,名为 scratch
. 它是一个虚构的概念,示意一个空白的镜像。
间接应用 FROM scratch
会让镜像体积更加玲珑。
接下来的一系列 ·copy· 指令都很好了解。
dockerfile 开发结束之后,执行命令:
docker build -t jerry-nginx:1.0 .
意思是基于当前目录开始构建镜像,留神开端的 .
必不可少,代表“当前目录”。
通过 docker build
执行输入的日志能够察看到外面每一行的指令被逐行执行:
最初一行日志提醒标签为 jerry-nginx:1.0
的镜像被胜利构建。
用上面的命令基于刚刚制作好的镜像运行一个容器:
docker run -d -p 443:443 -p 1082:80 jerry-nginx:1.0
基于 http 协定拜访没有问题:
http://localhost:1082
基于 https 拜访也能失常工作:
https://localhost:443
至此,这个反对 SSL 的 Nginx 镜像制作胜利。
总结
本文通过两个实战练习,别离介绍了如何基于规范的 Nginx 镜像,批改其默认首页,以及制作一个反对 SSL 的 Nginx 镜像的步骤,从理论例子解释了 Dockerfile 的工作原理。
本系列前两篇文章的链接:
- Docker 实战教程之从入门到进步 (一)
- Docker 实战教程之从入门到进步 (二)