# 设置基本的镜像,后续命令都以这个镜像为基础
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"]