使用Dockerfile创建镜像

  • 容器镜像分类

  1. 操作系统类

CentOSUbuntu

在dockerhub下载或自行制作

演示:把操作系统的文件系统打包生成镜像

  1. 最小化安装Centos

  1. 打包制作Centos镜像

可以进一步删除不需要的软件或文件

tar  --numeric-owner  --exclude=/proc  --exclude=/sys   -cvf  centos7u9.tar  /

  1. 复制到Docker宿主机,导入即可使用

docker  import  centos7u9.tar  centos7u9:v1

cat 文件名 | docker import - 镜像名

docker images

docker run -it centos7u9:v1 /bin/bash

yum -y install httpd

/usr/share/sbin/apachectl

Ctrl-p+q

2、应用类

TomcatNginxMySQLRedis

下载、制作均可

为满足不同环境需求,我们经常自己制作

二、利用Dockerfile制作镜像

  1. DockerFile介绍

Dockerfile是一种能够被Docker程序解释的脚本

Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令

当需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,

然后通过docker build生成我们自定义的容器镜像。

  1. Dockerfile指令
    1. 构建类指令:用于构建image

其指定的操作不会运行在image的容器上执行

如:FROM、MAINTAINER、RUN、ENV、ADD、COPY

    1. 设置类指令:用于设置image的属性

其指定的操作将运行image的容器中执行

如:CMD、ENTRYPOINT、USER、EXPOSE、WORKDIR、VOLUME

对应的指令说明如下:

FROM 构建新镜像基于的基础镜像

RUN 构建镜像时运行的Shell命令

COPY 拷贝文件或目录到镜像中

ADD 拷贝文件或目录到镜像中可以解压压缩包并拷贝

ENV 设置环境变量

USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户程序用户

EXPOSE 声明容器运行的服务端口容器内打开的端口

WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录同cd

CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效

ENTRYPOINT  与CMD类似,容器运行时强制执行

  1. Dockerfile指令的详细解释

    1. FROM:

FROM指令用于指定其后构建新镜像所使用的基础镜像。

FROM指令必是Dockerfile文件中的首条命令。

FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。

格式:FROM <image>:<tag>

例:FROM centos:latest

    1. RUN指令

RUN指令用于在构建镜像中执行命令,有以下两种格式:

shell格式

格式: RUN <命令>

例: RUN echo 'test' > /var/www/html/index.html

exec格式

格式: RUN ["可执行文件", "参数1", "参数2"]

例: RUN ["/bin/bash", "-c", "echo test > /var/www/html/index.html"]

注意:

按优化的角度来当有多条要执行的命令

不要使用多条RUN,尽量使用&&符号与\符号连接成一行

因为多条RUN命令会让镜像建立多层

        例如:

RUN yum install httpd httpd-devel -y

RUN echo test > /var/www/html/index.html

可以改成

RUN yum install httpd httpd-devel -y && echo test > /var/www/html/index.html

或者改成

RUN yum install httpd httpd-devel -y  \

    && echo test > /var/www/html/index.html

    1. CMD

CMD不同于RUNCMD用于指定在容器启动时所要执行的命令

而RUN用于指定镜像构建时所要执行的命令。

格式有三种:

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD command param1 param2

    每个Dockerfile只能有一条CMD命令如果指定了多条命令,只有最后一条会被执行 如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。

什么是启动容器时指定运行的命令?

# docker run -d -p 80:80 镜像名 运行的命令

    1. EXPOSE

EXPOSE指令用于指定容器在运行时监听的端口;

格式:EXPOSE <port> [<port>...]

例:EXPOSE 80 3306 8080

     上述运行的端口还需要使用docker run运行容器时通过-p参数映射到宿主机的端口。

    1. ENV

ENV指令用于指定一个环境变量。

格式:ENV <key> <value> 或者 ENV <key>=<value>

例:ENV JAVA_HOME /usr/local/jdkxxxx/

    1. ADD

ADD指令用于把宿主机上的文件拷贝到镜像中。

格式::ADD <src> <dest>

<src>可以是一个本地文件或本地压缩文件,还可以是一个url,

如果把<src>写成一个url,那么ADD就类似于wget命令

<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径

    1. COPY

COPY指令与ADD指令类似,但COPY的源文件只能是本地文件或目录;

格式:COPY <src> <dest>

    1. ENTRYPOINT

ENTRYPOINT与CMD非常类似。

        相同点:

一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效

都是容器启动时才运行

        不同点:

如果用户启动容器时候指定了运行的命令

ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖。

格式有两种:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2

    1. VOLUME

        VOLUME指令用于把宿主机里的目录与容器里的目录映射

只指定挂载点,docker宿主机映射的目录为自动生成的。

格式:VOLUME  ["<mountpoint>"]

    1. USER

USER指令设置启动容器的用户,即程序用户

像hadoop需要hadoop用户操作;oracle需要oracle用户操作

可以是用户名或UID

如:

USER daemon

USER 1001

         注意:

如果设置了容器以daemon用户去运行,那么RUN,CMD和ENTRYPOINT都会以这个用户去运行;

镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖指定的用户

    1.  WORKDIR

         WORKDIR指令设置工作目录,类似于cd命令

不建议使用RUN cd /root ,建议使用WORKDIR

如:

WORKDIR /root

  1. Dockerfile基本构成:

基础镜像信息 FROM

维护者信息 MAINTAINER

镜像操作指令 RUN

容器启动时执行指令 CMD

三、Dockerfile生成容器镜像方法

  1. 使用Dockerfile生成容器镜像步骤

第一步:创建一个文件夹(目录)

第二步:在文件夹(目录)中创建Dockerfile文件及其它文件

第三步:使用docker build命令构建镜像

第四步:使用构建的镜像启动容器

  1. 使用Dockerfile生成Nginx容器镜像

mkdir nginxdir

cd nginxdir

echo "nginx's running" >> index.html

编写Dockerfile文件

vim Dockerfile

FROM centos:7

MAINTAINER "zyjy@163.com"

RUN yum -y install wget

RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

RUN yum -y install nginx

ADD index.html /usr/share/nginx/html/

RUN echo "daemon off;" >> /etc/nginx/nginx.conf #关闭nginx守护进程模式

EXPOSE 80 #容器内打开的端口

CMD /usr/sbin/nginx #运行容器时,保持前台运行nginx

生成镜像:

格式:docker  build  -t  新镜像名:标签  .

docker  build  -t  nginx:v1  .

  1. 使用Dockerfile生成容器镜像优化

    1. 减少镜像分层

Dockerfile中包含多种指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令时,不建议每次安装都使用一条单独的RUN命令,可以把能够合并安装指令合并为一条,这样就可以减少镜像分层。

FROM centos:7

MAINTAINER zyjy@163.com

RUN yum install epel-release -y

RUN yum install gcc gcc-c++ make libxml2 libxml2-devel wget  -y

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz

RUN tar zxf php-5.6.36.tar.gz

RUN cd php-5.6.36

RUN ./configure --prefix=/usr/local/php

RUN make -j 4

RUN make install

优化如下:

FROM centos:7

MAINTAINER zyjy@163.com

RUN yum install epel-release -y && \

    yum install  gcc gcc-c++ make  libxml2 libxml2-devel wget -y

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \

    tar zxf php-5.6.36.tar.gz && \

    cd php-5.6.36 && \

    ./configure --prefix=/usr/local/php && \

    make -j 4 && make install

-j(表示 job 的数目)参数可以对项目在进行并行编译。

make -j 4,让make 最多允许 4 个编译命令同时执行,这样可以更有效的利用 CPU 资源。在多核 CPU 上,适当的进行并行编译还是可以明显提高编译速度的,但并行的任务不宜太多,一般是以 CPU 的核心数目的两倍为宜

    1. 清理无用数据

一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。

把生成容器镜像过程中部署的应用软件包做删除处理

FROM centos:7

MAINTAINER www.test.com

RUN yum install epel-release -y && \

    yum install -y gcc gcc-c++ make gd-devel libxml2 libxml2-devel \

    libcurl-devel libjpeg-devel libpng-devel openssl-devel \

    libmcrypt-devel libxslt-devel libtidy-devel autoconf \

    iproute net-tools telnet wget curl && \

    yum clean all && \

    rm -rf /var/cache/yum/*

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \

    tar zxf php-5.6.36.tar.gz && \

    cd php-5.6.36 && \

    ./configure --prefix=/usr/local/php \

    make -j 4 && make install && \

    cd / && rm -rf php*

  • 通过Dockerfile方式创建tomcat镜像

    1. 创建目录,准备相关文件

mkdir  tomcatdir

cd  tomcatdir

echo  tomcat test page  >  index.html

    1. 编辑Dockerfile文件

vim  Dockerfile

FROM centos:7

MAINTAINER "zyjy"

ENV VERSION=9.0.99

ENV JAVA_HOME=/usr/local/jdk

ENV TOMCAT_HOME=/usr/local/tomcat

ENV PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$PATH

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

RUN rm -rf /etc/yum.repos.d/* \

    && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \

    && yum -y install wget \

    && wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-9/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz \

    && tar xf apache-tomcat-${VERSION}.tar.gz \

    && mv apache-tomcat-${VERSION} $TOMCAT_HOME \

    && rm -rf apache-tomcat-${VERSION}.tar.gz $TOMCAT_HOME/webapps/* \

    && mkdir $TOMCAT_HOME/webapps/ROOT \

    && yum -y remove wget \

    && yum clean all

COPY ./index.html $TOMCAT_HOME/webapps/ROOT/

COPY ./jdk1.8.0_91 $JAVA_HOME

EXPOSE 8080

CMD ["catalina.sh", "run"]

然后把相关的jdk软件包拖到root/tomcatdir/

然后在解压到当前目录

tar -zxf jdk-8u91-linux-x64.tar.gz

    1. 构建镜像

docker  build  -t  tomcat:v1  .

然后查看镜像

docker images

    1. 创建并启动容器

docker run -itd -p 8080:8080 tomcat:v1 /bin/bash

然后在进入这个容器开启tomcat

docker exec -it 79916a46e25b /bin/bash

/usr/local/tomcat/bin/startup.sh

然后在访问页面:http://192.168.8.33:8080/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值