- 容器镜像分类
- 操作系统类:
CentOS、Ubuntu
在dockerhub下载或自行制作
演示:把操作系统的文件系统打包生成镜像
- 最小化安装Centos
- 打包制作Centos镜像
可以进一步删除不需要的软件或文件
tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7u9.tar /
- 复制到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、应用类:
Tomcat、Nginx、MySQL、Redis
下载、制作均可
为满足不同环境需求,我们经常自己制作
二、利用Dockerfile制作镜像
- DockerFile介绍
Dockerfile是一种能够被Docker程序解释的脚本,
Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令
当需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,
然后通过docker build生成我们自定义的容器镜像。
- Dockerfile指令
- 构建类指令:用于构建image
其指定的操作不会运行在image的容器上执行
如:FROM、MAINTAINER、RUN、ENV、ADD、COPY
-
- 设置类指令:用于设置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类似,容器运行时强制执行
- Dockerfile指令的详细解释
-
- FROM:
FROM指令用于指定其后构建新镜像所使用的基础镜像。
FROM指令必是Dockerfile文件中的首条命令。
FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。
格式:FROM <image>:<tag>
例:FROM centos:latest
-
- 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
-
- 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 镜像名 运行的命令
-
- EXPOSE
EXPOSE指令用于指定容器在运行时监听的端口;
格式:EXPOSE <port> [<port>...]
例:EXPOSE 80 3306 8080
上述运行的端口还需要使用docker run运行容器时通过-p参数映射到宿主机的端口。
-
- ENV
ENV指令用于指定一个环境变量。
格式:ENV <key> <value> 或者 ENV <key>=<value>
例:ENV JAVA_HOME /usr/local/jdkxxxx/
-
- ADD
ADD指令用于把宿主机上的文件拷贝到镜像中。
格式::ADD <src> <dest>
<src>可以是一个本地文件或本地压缩文件,还可以是一个url,
如果把<src>写成一个url,那么ADD就类似于wget命令
<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
-
- COPY
COPY指令与ADD指令类似,但COPY的源文件只能是本地文件或目录;
格式:COPY <src> <dest>
-
- ENTRYPOINT
ENTRYPOINT与CMD非常类似。
相同点:
一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效
都是容器启动时才运行
不同点:
如果用户启动容器时候指定了运行的命令
ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖。
格式有两种:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
-
- VOLUME
VOLUME指令用于把宿主机里的目录与容器里的目录映射
只指定挂载点,docker宿主机映射的目录为自动生成的。
格式:VOLUME ["<mountpoint>"]
-
- USER
USER指令设置启动容器的用户,即程序用户
像hadoop需要hadoop用户操作;oracle需要oracle用户操作
可以是用户名或UID
如:
USER daemon
USER 1001
注意:
如果设置了容器以daemon用户去运行,那么RUN,CMD和ENTRYPOINT都会以这个用户去运行;
镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖指定的用户
-
- WORKDIR
WORKDIR指令设置工作目录,类似于cd命令
不建议使用RUN cd /root ,建议使用WORKDIR
如:
WORKDIR /root
- Dockerfile基本构成:
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN
容器启动时执行指令 CMD
三、Dockerfile生成容器镜像方法
- 使用Dockerfile生成容器镜像步骤
第一步:创建一个文件夹(目录)
第二步:在文件夹(目录)中创建Dockerfile文件及其它文件
第三步:使用docker build命令构建镜像
第四步:使用构建的镜像启动容器
- 使用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 .
- 使用Dockerfile生成容器镜像优化
-
- 减少镜像分层
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 的核心数目的两倍为宜
-
- 清理无用数据
一次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镜像
-
- 创建目录,准备相关文件
mkdir tomcatdir
cd tomcatdir
echo “tomcat test page” > index.html
-
- 编辑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
-
- 构建镜像
docker build -t tomcat:v1 .
然后查看镜像
docker images
-
- 创建并启动容器
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/