注意:指令是顺序执行的,不区分大小写,但是默认使用大写字母,第一个非注释行指令必须是FROM,
0、基于基础容器手工制作镜像
0.1 基于容器制作镜像(Aliyun ECS)
1)启动基础镜像容器
docker run -it —name=”centos_c1” centos
2)安装所需要的软件包,并启动测试
mv /etc/yum.repos.d/*.reop /tmp
配置本地的yum源
cat > /etc/yum.repos.d/ftp.repo <
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enabled=1
gpgcheck=0
EOF
yum clean all && yum makcache && yum install -y openssh-server
/etc/init.d/sshd start —->重要:ssh第一次启动时,需要生成密钥,生成pam验证配置文件
/etc/init.d/sshd stop
3)镜像的制作
docker commit centos_c1 scxiang/centos6_sshd:v1
4)基于新镜像启动容器实现,centos6+sshd的功能
docker container run -d —name=centos_sshd -p 2222:22 scxiang/centos6_sshd:v1 /usr/sbin/sshd -D
0.2 构建企业网站定制镜像(centos6.9_sshd_lamp_bbs)
1)启动基础镜像容器
[root@docker ~]# docker container rm -f docker ps -a -q
[root@docker ~]# mkdir -p /opt/vol/{mysql,html}
[root@docker ~]# docker run -it —name=”centos_c1_bbs” -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos6.9
2)优化yum源并安装软件
mv /etc/yum.repos.d/.repo /tmp
echo -e “[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\ngpgcheck=0”>/etc/yum.repos.d/ftp.repo
yum makecache fast && yum install openssh-server httpd mysql-server mysql php php-mysql -y
3)软件初始化
/etc/init.d/sshd start
/etc/init.d/sshd stop
echo “abc123..” | passwd root —stdin
4)mysql的初始化
[root@8247baf75b26 /]# /etc/init.d/mysqld start
mysql> grant all on . to root@’%’ identified by ‘abc123..’;
mysql> grant all on . to discuz@’%’ identified by ‘abc123..’;
mysql> create database discuz charset utf8;
5)apache初始化
[root@8247baf75b26 /]# /etc/init.d/httpd start
6)制作LAMP第一版基础镜像
[root@docker ~]# docker commit 8247baf75b26 scxiang/centos_lamp:v1
7)根据第一版镜像,启动新容器
[root@docker ~]# docker run -it —name=”scxiang_centos_bbs_v2” -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 scxiang/centos_lamp:v1
[root@406c1aa7effb /]# /etc/init.d/mysqld start
[root@406c1aa7effb /]# /etc/init.d/httpd start
8)测试php功能
vim /var/www/html/index.php
<?php
phpinfo();
?>
9)安装bbs论坛
上传bbs代码到宿主机/opt/vol/html并解压
安装
10)制作LAMP+bbs第二版镜像
[root@docker ~]# docker commit scxiang_centos_bbs_v2 scxiang/centos6.9_sshd_lamp_bbs:v1
11)创建启动脚本
cd /opt/vol/html
vim init.sh
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod 777 init.sh
12)启动容器,映射端口,挂载数据卷,自动启多服务
[root@docker ~]# docker container run -d —name=”centos_lamp_bbs” -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 22222:22 -p 8080:80 -p 33060:3306 scxiang/centos6.9_sshd_lamp_bbs:v1 /var/www/html/init.sh
*CentOS7镜像在安装好ssh之后,在需要手工添加证书
[root@docker ~]# docker run -it —name=”centos_c1” centos:6.9
yum install -y openssh-server
mkdri /var/run/sshd
echo ‘UseDNS no’ >>/etc/ssh/sshd_config
sed -i -e ‘/pam_loginuid.so/d’ /etc/pam.d/sshd
echo ‘root:abc123..’ | chpasswd
/usr/bin/ssh-keygen -A
[root@docker ~]# docker commit centos7.5_c1 scxiang/centos7.5_ssh
[root@docker ~]# docker container run -d -p 2222:22 —name=”centos_sshd” 70fbdf064eb0 /usr/sbin/sshd -D
Dockerfile示例
# CentoS6.9_sshd_LAMPFROM centos:6.9RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\ngpgcheck=0">/etc/yum.repos.d/ftp.repo && yum makecache fast && yum install openssh-server httpd mysql-server mysql php php-mysql -yRUN /etc/init.d/sshd start %% echo "abc123.." | passwd root --stdin && /etc/init.d/mysqld start && /etc/init.d/httpd start#RUN mysql -e "grant all on *.* to root@'%' identified by 'abc123..';grant all on *.* to discuz@'%' identified by 'abc123..';create database discuz charset utf8;"COPY init.sh /COPY index.php /var/www/htmlADD bbs.tar.gz /var/www/htmlADD http://nginx.org/download/nginx-1.18.0.tar.gz /var/www/htmlEXPOSE 22EXPOSE 80EXPOSE 3306#CMD ["/bin/bash","/init.sh"]ENTRYPOINT ["/bin/bash","/init.sh"][root@docker centos6.9_sshd_lamp]# docker build -t scxiang/centos6.9_bbs_dkf:v1 ./[root@docker centos6.9_sshd_lamp]# docker run -it --name="centos_c1_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html 2199b8eb8390
一、FROM指令
FROM指令是最重要的一个,且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程执行基准镜像,后续的指令运行于此基准镜像所提供的运行环境,在实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker bulid会在docker主机上查找执行的镜像文件,在其不存在时,则会从DockerHub Registry上拉取所需的镜像文件,如果找不到指定的镜像文件,docker build会返回一个错误信息
语法:
FROM
FROM
可选项:MAINTANIER已经被遗弃,现在使用LABEL
二、MAINTAINER指令
用于让Dockerfile制作者提供本人的详细信息,Dockerfile并不限制MAINTAINER指令可在出现的位置,但推荐将其放置于FROM指令之后
语法:
MAINTAINER
MAINTAINER “Evn Evn@scxiang.com“
三、LABEL指令
同MAINTAINER指令用法一样,用于为镜像添加元数据信息
语法:
LABEL
四、COPY指令
用于从Docker主机复制文件至创建的新映像文件
语法:
COPY
COPY [“
注意:在路径中有空白字符时,通常使用第二种格式
文件复制准则:
如果
如果指定了多个
如果
实例1:
构建目录
Dockerfile
# Description:test imageFROM busybox:latestMAINTAINER "Evn.xiang"# LABEL mainrainer="Evn.xiang"ENV DOC_ROOT=/data/web/html/ \WEB_SERVER_PACKAGE="nginx-1.15.2.tar.gz"COPY index.html ${DOC_ROOT:-/data/web/html/} #复制index.html复制到DOC_ROOT目录下,不存在此目录时复制到/data/web/html目录下COPY yum.repos.d /etc/yum.repos.d/ #将yum.repos.d目录下的文件复制/etc/yum.repos.d/
构建状态
构建的镜像
运行容器查看结果,可见在Dockerfile构建时已经将index.html文件拷贝到容器的该目录下
# docker run —name testdockerfile1 —rm testdockerfile:v0.1-1 cat /data/web/html/index.html
五、ADD指令
ADD指令类似于COPY指令,ADD支持对TAR格式文件进行解压和对URL路径指向的文件进行下载
语法:
ADD
ADD [“
操作准则
1、同COPY指令
2、如果
3、如果
4、如果
六、WORKDIR指令
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
语法
WORKDIR
1、在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径
2、另外,WORKDIR也可调用由ENV指定定义的变量
例如:
WORKDIR /var/log
WORKDIR $STATEPATH
实例2:
构建目录:
Dockerfile
# Description:test imageFROM busybox:latestMAINTAINER "Evn.xiang"# LABEL mainrainer="Evn.xiang"ENV DOC_ROOT=/data/web/html/ \WEB_SERVER_PACKAGE="nginx-1.15.2.tar.gz"ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/xsc/#ADD nginx-1.18.0.tar.gz /usr/local/srcWORKDIR /usr/localADD nginx-1.18.0.tar.gz ./src
构建状态
构建的镜像
运行的容器
# docker run —name testdockerfile1 —rm testdockerfile:v0.1-2 ls /usr/local/xsc /usr/local/src
七、VOLUME指令
用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷
语法
VOLUME
VOLUME [“
如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂在完成后将此前的所有文件复制到新挂载的卷中
八、EXPOSE指令
用于为容器打开指定要监听的端口以实现与外部通信
语法
EXPOSE
EXPOSE指令可一次指定多个端口,列如
EXPOSE 11211/udp 11211/tcp
九、ENV指令
1、用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV,ADD,COPY等)所调用
2、调用格式为$variable_name或${variable_name}
语法
ENV
ENV
3、第一种格式中,
4、第二种格式可用一次设置多个变量,每个变量为一个”
5、定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
十、RUN指令
用于指定docker build过程中运行的程序,其可以是任何命令
语法
RUN
RUN [“
●第一种格式中,
●第二种语法格式中的参数是一个JSON格式的数组,其中
●RUN I”/bin/bash”, “-c”, “
实例3
构建目录
Dockerfile
# Description:test imageFROM busybox:latestMAINTAINER "Evn.xiang"ENV DOC_ROOT=/data/web/html/ \WEB_SERVER_PACKAGE="nginx-1.15.2.tar.gz"VOLUME /data/mysql/EXPOSE 80/tcpADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/xsc/RUN cd /usr/local/xsc && \tar -xf ${WEB_SERVER_PACKAGE} && \ls /usr/local/xsc
十一、cmd指令
●类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
●RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时
●CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
●在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效
●Syntax
●CMD
●CMD “
●CMD [“
●前两种语法格式的意义同RUN
●第三种则用于为ENTRYPOINT指令提供默认参数
实例4
构建目录
Dockerfile
FROM busyboxLABEL maintainer="xiangshihchuan" app="httpd"ENV WEB_DOC_ROOT="/data/web/html/"RUN mkdir -p ${WEB_DOC_ROOT} && \echo "<h1>busybox httpd server.</h1>" >${WEB_DOC_ROOT}/index.html#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}CMD ["/bin/sh","-c","/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]
十二、ENTRYPOINT指令
●类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
●与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令 行参数会被当作参数传递给ENTRYPOINT指定的程序
●不过,docker run命令的—entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
●语法
●ENTRYPOINT
●ENTRYPOINT l”
●docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用
●Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
json数组中需要使用双引号,单引号会报错
FROM busyboxLABEL maintainer="xiangshihchuan" app="httpd"ENV WEB_DOC_ROOT="/data/web/html/"RUN mkdir -p ${WEB_DOC_ROOT} && \echo "<h1>busybox httpd server.</h1>" >${WEB_DOC_ROOT}/index.html#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}#CMD ["/bin/sh","-c","/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
FROM nginx:alpineLABEL maintainer="xiangshichuan"ENV NGX_DOC_ROOT='/data/web/html/'ADD index.html ${NGX_DOC_ROOT}ADD entrypoint.sh /bin/EXPOSE 80/tcpHEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT}:-80/CMD ["/usr/sbin/nginx","-g","daemon off;"]ENTRYPOINT ["/bin/entrypoint.sh"]
#!/bin/shcat > /etc/nginx/conf.d/www.conf <<EOF{server_name $HOSTNAME;listen ${IP:-0.0.0.0}:${PORT:-80};root ${NGX_DOC_ROOT:-/usr/share/nginx/html};}EOFexec "$@"
十三、USER指令
●用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID
●跌认情况下,container的运行身份为root用户
●Syntax
●USER
●需要注意的是,
十四、HEALTHCHECK
HEALTHCHECK指令告诉容器引擎怎么去检测容器去测试是否依然正常工作
语法:包含两种语法格式
HEALTHCHECK [OPTIONS] CMD command (检测容器健康通过一个容器内部命令)
HEALTHCHECK NONE(禁用从基础镜像继承任何健康检测)
OPTIONS:
—inerval=DURATION (default:30s)
—timeout=DURATION(default:30s)
—start-period=DURATION(default:0s)
—retries=N(default:3)
命令退出状态返回值展示了容器的状态,可能值有
0:成功-容器是健康
1:不健康-容器没有正确工作
2:保留代码,不使用此代码
例如:
HEALTHCHECK —internel=5m —timeout=3s CMD curl -f http://localhost/ || exit 1
十五、SHELL指令
SHELL指令可以修改shell终端默认使用shell
linux默认的shell是[“/bin/sh”,”-c”],windows默认是[“cmd”,”/S”,”/C”]
在Dockerfile中SHELL指令必须是JSON格式
语法:SHELL [“executable”,”parameters”]
SHELL指令可以出现多次
每个SHELL指令覆盖所有以前的SHELL指令,并影响所有随后的指令。
十六、STOPSIGNAL指令
十七、ARG指令
十八、ONBUILD指令
用于在Dockerfile中定义一个触发器,ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是:这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令
语法
ONBUILD
实例









