【云原生】创建容器的方法

1)基于现有镜像的创建 

先使用现有镜像创建容器   docker   run

 再进入容器进行内容更新 docker exec

最后提交成新的镜像   docker commit

【云原生】创建容器的方法_第1张图片

2)基于模板创建

可以从本地容器导出模板文件   docker export

或者从网上下载现成的模板文件   http://openvz.org/Download/template/precreated

 

再将模板文件导入成镜像  docker    import

3)dockerfile 构建

 【云原生】创建容器的方法_第2张图片

 

dockerfile 指令

FROM 指定基础镜像,dockerfile构建镜像的第一个指令

MAINTAINER  指定镜像维护人信息

RUN  指定linux命令,可以多个命令用;或&&连接 使用

ENV  设置镜像环境变量

EXPOSE  暴露容器端口

VOLUME 指定容器的匿名数据卷

ADD/COPY  复制本地文件/目录到镜像中

ADD 和 COPY 的区别
COPY只能复制本地文件/目录到镜像中
ADD不光可以复制本地文件/目录到镜像中,还可以通过URL下载文件复制到镜像中,还能将本地tar压缩包解压后复制到镜像中。(URL下载和tar包解压特性不能一起使用)

 USER  指定容器的运行用户

WORKDIR  指定容器的工作目录

AGR  指定构建镜像时传入的参数  docker run --build-arg  变量=值

CMD/ENTRYPOINT 指定容器启动时执行的命令

ENTRYPOINT 和 CMD 的区别
ENTRYPOINT 指定的容器启动时运行命令优先级更高,如果 ENTRYPOINT 和 CMD 同时存在,那么 CMD 指定内容将作为 ENTRYPOINT 指定的命令的选项或参数去使用

容器启动时运行的命令优先级 
docker run --entrypoint 命令  >  镜像里的 ENTRYPOINT ["命令"] >  docker run ... 命令 >  镜像里的 CMD ["命令"]
 

如何缩小镜像的体积大小?

1、尽可能的使用体积小的额基础镜像

2、尽可能减少Dockerfile文件中的指令数量

3、构建镜像步骤最后添加清空系统和应用程序 的缓存的命令

4、使用多级构建        FROM AS 别名  COPY --from 别名

dockerfile实例

【云原生】创建容器的方法_第3张图片

 

docker build -t apache:centos7 .

【云原生】创建容器的方法_第4张图片

 如果想要实时更新数据,可以用逻辑卷挂载到容器

docker run -itd -p 1314:80 -v index.html:/var/www/html/

 

镜像容量过大的解决方案 

  1. 基础镜像尽量使用轻量级最小化的镜像。
  2. Dockerfile中尽量把RUN指令合并在一起,减少镜像的层数(因为每一个RUN指令就是一个镜像层)。
  3. 多级构建(拿Dockerfile构建好的镜像再构建一次)。

针对上面的镜像的创建进行基础镜像的进行多阶级构建 :

vim Dockerfile
#基层镜像
FROM centos:7 AS first
#镜像作者信息描述
MAINTAINER this is apache image 
#指定的Linu执行脚本
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
#将源码编译的安装包安放到容器中并进行解压
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
#进行源码编译安装
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util && cd /opt/httpd-2.4.29 && ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make -j 4 && make install
#二阶段构建
FROM centos:7
#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源
COPY --from=first  /usr/local/httpd  /usr/local/httpd
#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包
RUN yum install -y pcre pcre-devel expat-devel perl
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
 
docker build -t apache2:centos7 .

总结

Dockerfile结构大致分为四个部分:基础镜像信息(用from指定)、维护者信息(maintainer、镜像操作指令和容器启动时执行指令。

1、第一行必须使用FROM指令指明所基于的镜像名称;
2、之后使用MAINTAINER 指令说明维护该镜像的用户信息;
3、然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运行一条指令,都会给基础镜像添加新的一层。(多条命令可以使用 ; 或 && 合并成一条命令,减少镜像的层数)
4、最后使用CMD或者ENTRYPOINT指令指定启动容器时要运行的命令操作。
 

你可能感兴趣的:(云原生,docker,容器)