怎么做网站链接外贸网站 服务器
docker容器中
做镜像是重要的技能。
docker commit只能制作比较简单的镜像,
要制作比较完善的镜像,
自定义程度比较高的,
就需要用到dockerfile
dockerfile可以回溯历史
动态生成镜像。
FROM是基础镜像
CMD是在容器创建的时候默认的启动命令
CMD是一个数组,是有固定的格式
每个参数是数组里面的元素
/bin/ls   ==>  CMD ["/bin/ls"]
/bin/ls -l -a  ==>  CMD  ["/bin/ls","-l","-a"]
 #   ${ENTRYPOINT}  是命令
#   ${@-${CMD}}   是参数
#   ${@} 是所有的参数选项之和
#   $1是第一个参数 
#   $2 是第二个参数
#   ...
#   $n 是第n个参数
#   $@ 是所有的参数之和
#   ${@-} 代表前面的变量没有设置
 ~]# echo  ${AA} ~]# echo  ${AA-abc}
abc
#   减号"-"后面代表,前面没有设置的时候,用这个参数
 ~]# AA=123
 ~]# echo  ${AA-abc}
123
#   如果AA设置了,就用设置的值
 ~]# unset AA
 ~]# echo  ${AA-abc}
abc
#   如果把AA设置的值删了,就用减号后面的值了
#   所以
#   ${@-${CMD}的意思就是,如果设置参数了,就用参数,如果没有设置,就用CMD
#   这个CMD就是默认的启动参数,如果没有设置,就用CMD写的命令来启动
#   ENTRYPOINT是,如果设置了,那么CMD就变成选项了。
#   ENTRYPOINT一旦设置了就必须执行
~]# cat  img1 
#!/bin/bash
CMD="/bin/ls -l"
ENTRYPOINT="echo"
${ENTRYPOINT} ${@-${CMD}}
~]# ./img1
/bin/ls -l
 ~]# ./img1  id
id
#  ENTRYPOINT设置成了echo命令,后面的CMD就变成了参数,被输出到屏幕
#  所以ENTRYPOINT设置了就必须执行
~]# cat myimg/Dockerfile 
FROM  mylinux:latest
ENTRYPOINT ["echo"]
CMD ["/bin/ls", "-l"]
# FROM ENTRYPOINT CMD这三个指令是dockerfile里面的核心指令
 文件扩展名为
.tar
.tar.gz
.tar.bz2
.tar.xz
.tar.tgz
这些类型的文件
ADD指令会把这些文件包解压
COPY指令不会解压这些文件包
做镜像的时候,所有的文件都要放在做镜像的那个目录里面,也就是Dockerfile所在的目录里
|   指令  |   说明  | 
|   FROM  |   指定基础镜像  | 
|   ENTRYPOINT  |   默认容器的启动命令  | 
|   CMD  |   有ENTRYPOINT时,CMD是启动参数;没有ENTRYPOINT时,CMD是启动命令; 可以容易被docker run 命令覆盖参数,比如:docker run myimage echo "Good!"  | 
|   ADD  |   把文件拷贝到容器内,并自动解压;容器联网,可下载文件比如 ADD http://www.abc.com/abc.tar /tmp/  | 
|   COPY  |   把文件拷贝到容器内,不解压;容器联网,不能下载  | 
|   RUN  |   在容器内执行命令,可以写多条,比如RUN touch file1RUN yum -y install nginx  | 
|   USER  |   在容器内切换用户,相当于sudo -u user  | 
|   ENV  |   设置环境变量,某些指令需要环境变量才能正确执行,比如etcdctl export ETCDCTL_API=3  | 
|   WORKDIR  |   指定工作目录,有些任务需要,比如ansible、编译./configure  | 
|   EXPOSE  |   对外声明容器将要使用的端口号和协议,方便健康检测程序进行检测  | 
WORKDIR的用法,比如
RUN touch  f1
WORKDIR /tmp
RUN touch f2     # 在/tmp目录下创建f2文件
#通过Dockerfile里面的WORKDIR,也可以知悉软件装在哪了,比如源码编译安装的nginx, WORKDIR /usr/local/nginx
 ENTRYPOINT和CMD的单独用法,和结合用法:
-  
只使用
CMD:CMD指定的命令将作为容器启动时的命令。- 如果用户没有通过 
docker run指定其他命令,那么CMD指定的命令将被执行。 
 -  
只使用
ENTRYPOINT:ENTRYPOINT指定的命令将作为容器启动时的主程序。- 如果用户没有通过 
docker run指定其他命令,那么ENTRYPOINT指定的命令将被执行。 - 当你想定义一个不可轻易覆盖的主程序时,使用 
ENTRYPOINT。 - 例如,一个数据库容器可能总是需要运行数据库服务,不允许用户轻易改变这一点。
 ENTRYPOINT不容易被覆盖,除非使用--entrypoint显式指定。
 -  
结合使用
ENTRYPOINT和CMD:CMD指定的内容将成为ENTRYPOINT指定命令的参数。- 如果用户通过 
docker run指定其他命令,这些命令将覆盖CMD指定的参数。 
 
# apache镜像,用Dockerfile制作示例:
httpd]# cat Dockerfile 
FROM mylinux:latest
RUN  dnf -y  install  httpd php  && dnf clean all
RUN  sed  -ri -e 's,^Load,#&,'  -e  's,^#(.*mod_mpm_prefork.so)$,\1,'  /etc/httpd/conf.modules.d/00-mpm.conf
ADD  myweb.tar.gz  /var/www/html/
ENV  LANG=C
WORKDIR  /var/www/html
EXPOSE 80/tcp
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]docker build  -t  httpd:latest  httpd/  