使用Dockerfile创建镜像

实验环境

安装好Docker服务

一、容器镜像分类

1、操作系统类

CentOS、Ubuntu

在dockerhub下载或自行制作

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

1)开启最小化安装的CentOS

2)打包制作CentOS镜像

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

--numeric-owner:以数字形式保存文件的所有者和组信息,而不是名称。这在跨系统打包时非常有用。

--exclude=/proc:排除 /proc 目录。/proc 是一个虚拟文件系统,包含系统运行时的进程信息,不适合打包。

--exclude=/sys:排除 /sys 目录。/sys 是另一个虚拟文件系统,包含内核和设备的运行时信息,也不适合打包。

-c:创建新的归档文件。

-v:显示详细输出,列出正在处理的文件。

-f centos7.tar:指定归档文件名为 centos7.tar。

/:指定要打包的根目录

3)导入制作的镜像

docker import centos7.tar centos7:v1

cat centos7.tar | docker import - centos7:v1

docker images

4)使用制作的镜像开启容器

docker run -it centos7:v1 /bin/bash

yum -y install httpd

启动http服务

/usr/sbin/apachectl

ctrl+p+q

2、应用类

Tomcat、Nginx、MySQL、Redis

下载、制作均可

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

二、利用Dockerfile制作镜像

1、Dockerfile介绍

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

Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令,当需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,然后通过docker build生成我们自定义的容器镜像。

2、Dockerfile指令

(1)构建类指令:用于构建image

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

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

(2)设置类指令:用于设置image的属性

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

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

对应指令说明:

FROM            构建新镜像基于的基础镜像(必须为第一条指令)

RUN              执行命令,通常用于安装软件或运行脚本

COPY             将文件或目录从主机复制到镜像中

ADD              类似 COPY,但支持自动解压 tar 文件和从 URL 下载文件

ENV               设置环境变量

USER             指定运行后续指令的用户

EXPOSE         声明容器运行时监听的端口(容器内打开的端口)

WORKDIR      设置工作目录,后续指令默认在该目录下执行

CMD              指定容器启动时默认执行的命令(可以被 docker run 覆盖)

ENTRYPOINT       指定容器启动时默认执行的命令(不会被 docker run 覆盖,但可以追加参数)

3、Dockerfile指令的详细解释

(1)FROM

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

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

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

(2)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

(3)CMD

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

格式有三种:

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

CMD ["param1","param2"]

CMD command param1 param2

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

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

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

(4)EXPOSE

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

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

例:EXPOSE 80 3306 8080

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

(5)ENV

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

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

例:ENV JAVA_HOME /usr/local/jdkxxxx/

(6)ADD

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

格式:ADD <src> <dest>

<src>可以是一个本地文件或本地压缩文件,还可以是一个url,如果把<src>写成一个url,那么ADD就类似于wget命令

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

(7)COPY

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

格式:COPY <src> <dest>

(8)ENTRYPOINT

ENTRYPOINT与CMD非常类似

相同点:

一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效,都是容器启动时才运行

不同点:

如果用户启动容器时候指定了运行的命令,ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖。

格式有两种:

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

ENTRYPOINT      command param1 param2

(9)VOLUME

VOLUME指令用于把宿主机里的目录与容器里的目录映射指定挂载点,docker宿主机映射的目录为自动生成的。

格式:VOLUME  ["<mountpoint>"]

(10)USER

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

像hadoop需要hadoop用户操作;oracle需要oracle用户操作,可以是用户名或UID

如:

USER daemon

USER 1001

注意:

如果设置了容器以daemon用户去运行,那么RUN,CMD和ENTRYPOINT都会以这个用户去运行;镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖指定的用户

(11)WORKDIR

WORKDIR指令设置工作目录,类似于cd命令,不建议使用RUN cd /root,建议使用WORKDIR

如:

WORKDIR /root

4、Dockerfile基本构成

基础镜像信息                FROM

维护者信息                    MAINTAINER

镜像操作指令                RUN

容器启动时执行指令     CMD

三、Dockerfile生成容器镜像方法

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

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

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

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

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

2、使用Dockerfile生成Nginx容器镜像

mkdir nginxdir

cd nginxdir

echo "nginx is running" > index.html

编写Dockerfile文件

vim Dockerfile

添加:

FROM centos:7

MAINTAINER "lkk"

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

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

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

EXPOSE 80

CMD /usr/sbin/nginx

生成镜像

docker build -t nginx:v1 .

3、使用Dockerfile生成容器镜像优化

(1)减少镜像分层

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

FROM centos:7

MAINTAINER lkk

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

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

RUN yum -y install epel-release

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

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

优化如下:

mkdir /root/phpdir

cd /root/phpdir

将php-5.6.27.tar.gz包上传到/root/phpdir/

进入/root/phpdir目录

vim Dockerfile

添加:

FROM centos:7

MAINTAINER lkk

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 epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget

ADD ./php-5.6.27.tar.gz /

RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 4 && make install

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

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

(2)清理无用数据

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

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

vim Dockerfile

添加粗体部分内容:

FROM centos:7

MAINTAINER lkk

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 epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget && yum clean all && rm -rf /var/cache/yum/*

ADD ./php-5.6.27.tar.gz /

RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 16 && make install && rm -rf /php*

生成镜像

docker build -t php:v1 .

四、通过Dockerfile方式创建tomcat镜像

1、创建目录准备相关文件

mkdir tomcatdir

cd tomcatdir/

echo "tomcat test page" > index.html

上传jdk-8u91-linux-x64.tar.gz包到tomcatdir目录

2、编辑Dockerfile文件

vim Dockerfile

注意安装版本(粗体部分)

添加:

FROM centos:7

MAINTAINER "lkk"

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 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \

    yum -y install wget && \

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

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

    mv apache-tomcat-${VERSION} /usr/local/tomcat && \

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

    mkdir /usr/local/tomcat/webapps/ROOT

ADD ./index.html /usr/local/tomcat/webapps/ROOT/

ADD ./jdk-8u91-linux-x64.tar.gz /

RUN mv /jdk1.8.0_91/ /usr/local/jdk

EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

3、构建镜像

docker build -t tomcat:v1 .

4、创建并启动容器

docker run -d -p 8080:8080 tomcat:v1

docker ps -a

curl 192.168.10.11:8080

为了设计一款能够有效聚合校园生活信息的APP,首先需要从用户的需求出发,详细分析目标用户群体的特点和需求,即XXXX生的日常生活和学习需求。在此基础上,定义APP的核心功能和服务范围,包括但不限于选课指南、考试资源、兼职信息、生活充值等服务。 参考资源链接:[校园生活APP:服务XXXX生的创新创业计划](https://wenku.csdn.net/doc/7ji9n8gsq2?spm=1055.2569.3001.10343) 接下来,进行市场调研,了解同类APP的现状、优缺点以及目标用户对此类APP的使用体验反馈。这一步骤将帮助我们确定产品的差异化特征,并据此制定出创新点和改进方向。 根据调研结果,设计APP的架构和用户界面。架构设计要考虑到数据的高效采集、存储、处理和展示,以及第三方平台的接口对接。用户界面设计则需要注重用户体验,确保操作简便、界面友好。 确定技术路线后,开始APP的开发工作。开发过程中,选择合适的开发工具和框架,如React Native或Flutter等跨平台开发框架,可以快速构建iOS和安卓双端应用。对于数据聚合,可以利用爬虫技术定时从校园网站、合作伙伴网站等来源抓取信息,并存储于服务器。开发中还应考虑到数据的安全性和隐私保护措施。 对于信息的更新及时性与准确性,可以设立后台管理系统,由专业团队负责日常的信息维护和更新,同时设置用户反馈机制,鼓励用户上报错误信息或提出建议。利用机器学习等技术优化信息分类和匹配准确性。 测试阶段,进行全面的系统测试、性能测试和用户测试,确保APP的稳定性和易用性。在APP上线后,进行持续的监控和迭代更新,根据用户反馈不断优化功能和提升服务质量。 总结来说,开发一款校园生活APP需要深入理解用户需求,合理规划产品功能,采用合适的开发技术和架构,并且注重后期的运营和维护。为了深入了解如何将这些步骤具体实现,建议参考《校园生活APP:服务XXXX生的创新创业计划》。这份文档不仅提供了产品规划的全面视角,还包括市场分析和运营策略,是解决当前问题的有力支持。 参考资源链接:[校园生活APP:服务XXXX生的创新创业计划](https://wenku.csdn.net/doc/7ji9n8gsq2?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值