# 设置基本的镜像,后续命令都以这个镜像为基础 FROM centos_lamp:v1 # 作者信息 MAINTAINER JFEDU.NET # RUN命令会在上面指定的镜像里执行任何命令 RUN yum install pcre-devel -y RUN yum install httpd httpd-devel –y RUN echo “<h1>The Test Page JFEDU</h1>” >>/var/www/html/index.html #暴露ssh端口80 EXPOSE 80 #启动httpd CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
Docker镜像制作的方法主要有两种:
1)Docker commit|export 将新容器提交至Images列表;
2)编写Dockerfile,build 新的镜像至镜像列表;
Dockerfile语法命令详解:
Dockerfile是一个镜像的表示,也是一个镜像的原材料,可以根据Dockerfile来描述构建镜像,并自动构建一个容器。
FROM 指定所创建镜像的基础镜像; MAINTAINER 指定维护者信息; RUN 运行命令; CMD 指定启动容器时默认执行的命令; LABEL 指定生成镜像的元数据标签信息; EXPOSE 声明镜像内服务所监听的端口; ENV 指定环境变量; ADD 赋值指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下 COPY 赋值本地主机的<scr>路径下的内容到容器中的<dest>路径下;一般情况下推荐使用COPY而不是ADD; ENTRYPOINT 指定镜像的默认入口; VOLUME 创建数据挂载点; USER 指定运行容器时的用户名或UID; WORKDIR 配置工作目录; ARG 指定镜像内使用的参数(例如版本号信息等); ONBUILD 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令; STOPSIGNAL 容器退出的信号; HEALTHCHECK 如何进行健康检查; SHELL 指定使用SHELL时的默认SHELL类型;
Dockerfile制作规范及技术
1) 精简镜像用途:尽量让每个镜像的用途都比较集中、单一,避免构造大而复杂、多功能的镜像;
2)选用合适的基础镜像:过大的基础镜像会造成构建出臃肿的镜像,一般推荐比较小巧的镜像作为基础镜像;
3) 提供详细的注释和维护者信息: Dockerfile也是一种代码,需要考虑方便后续扩展和他人使用;
4) 正确使用版本号:使用明确的具体数字信息的版本号信息,而非latest,可以避免无法确认具体版本号,统一环境;
5) 减少镜像层数:减少镜像层数建议尽量合并RUN指令,可以将多条RUN指令的内容通过&&连接;
6) 及时删除临时和缓存文件:这样可以避免构造的镜像过于臃肿,并且这些缓存文件并没有实际用途;
7) 提高生产速度:合理使用缓存、减少目录下的使用文件,使用.dockeringore文件等;
8) 调整合理的指令顺序:在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性;
9) 减少外部源的干扰:如果确实要从外部引入数据,需要制定持久的地址,并带有版本信息,让他人可以重复使用而不出错。
# 设置基本的镜像,后续命令都以这个镜像为基础 FROM centos:v1 # 作者信息 MAINTAINER JFEDU.NET # RUN命令会在上面指定的镜像里执行任何命令 RUN yum install passwd openssl openssh-server -y RUN echo '123456' | passwd --stdin root RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh # 暴露ssh端口22 EXPOSE 22 # 设定运行镜像时的默认命令:输出ip,并以daemon方式启动sshd CMD ip addr ls eth0 | awk '{print $2}' | egrep -o '([0-9]+\.){3}[0-9]+';/usr/sbin/sshd -D
基于Dockerfile来创建生成镜像,命令如下:
docker build -t centos:ssh - < Dockerfile
docker build -t centos:ssh
案例: 基于Dockerfile开启
Apache 80端口,并远程连接服务器,dockerfile内容如下:
# 设置基本的镜像,后续命令都以这个镜像为基础 FROM centos_lamp:v1 # 作者信息 MAINTAINER JFEDU.NET # RUN命令会在上面指定的镜像里执行任何命令 RUN yum install pcre-devel -y RUN yum install httpd httpd-devel –y RUN echo “<h1>The Test Page JFEDU</h1>” >>/var/www/html/index.html #暴露ssh端口80 EXPOSE 80 #启动httpd CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]