摘要:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
一、常用dockerfile参数
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命令
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD 被触发
二、编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。
指定打包内容:
(1)基于centos基础镜像;
(2)指定作者信息;
(3)安装nginx服务,将提供的dest目录(提供默认主页index.html)传到镜像内,并将dest目录内的前端文件复制到nginx的工作目录;
(4)暴露80端口;
(5)设置服务自启动。
(6)验证镜像。
1.编写Dockerfile文件
[root@node compose_nginx]# mkdir nginx
[root@node compose_nginx]# cd nginx/
[root@node nginx]# vim Dockerfile
[root@node nginx]# cat Dockerfile
# centOS 7作为基础镜像
FROM centos:7
# 作者信息
MAINTAINER "zjl <zjl1234@163.com>"
# 安装Nginx
ADD https://nginx.org/download/nginx-1.24.0.tar.gz /usr/local/src
# 复制静态文件
COPY index.html /usr/share/nginx/html/
# 暴露80端口
EXPOSE 80
# 设置Nginx服务自启动
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
2.构建
# 生成镜像nginx:v1.1
[root@node nginx]# docker build -t nginx:v1.1 .
[+] Building 28.0s (9/9) FINISHED docker:default
3.验证镜像
docker run --name web --rm nginx:v1.1 cat /usr/share/nginx/html/index.html
CTYPE html>
<html>
<head>
<title>Welcome to My Website</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is my website.</p>
</body>
</html>
# --nginx:v1.1: 这是要运行的 Docker 镜像的名称和标签。
# cat /usr/share/nginx/html/index.html: 当容器启动时,运行 cat 命令来查看容器内 Nginx 默认主页的内容。/usr/share/nginx/html/index.html 是默认的 Nginx 主页文件的路径。
# --rm: 这个选项告诉 Docker 在容器停止运行后自动删除容器
4.镜像推送到仓库
[root@node ~]# docker tag nginx:v1.1 39.101.73.202:8000/test/nginx:v1.1
[root@node ~]# docker push 39.101.73.202:8000/test/nginx:v1.1
5.查看是否推送成功
三、Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库。具体要求如下:
(1)基于centos:7基础镜像;
(2)指定作者信息;
(3)安装httpd、mysql、mysql-server、php、php-mysql、php-gd;
(4)暴露80和3306端口;
(5)设置服务自启动。
(6)验证镜像。
1.构建Dockerfile文件
[root@node ~]# mkdir LAMP
[root@node ~]# cd LAMP/
[root@node LAMP]# vim Dockerfile
# 基于CentOS 7基础镜像
FROM centos:7
LABEL maintainer="Your Name <your.email@example.com>"
# 安装httpd、mysql、php等软件包
RUN yum install -y httpd mysql mysql-server php php-mysql php-gd && yum clean all
# 暴露80和3306端口
EXPOSE 80 3306
# 设置服务自启动
CMD ["/bin/bash", "-c", "service httpd start && service mysqld start && /bin/bash"
2.镜像推送
[root@node ~]# docker tag lamp:v1.1 39.101.73.202:8000/lamp/nginx:1.1
[root@node ~]# docker push 39.101.73.202:8000/lamp/nginx:1.1