有三种方式可以构建镜像:
1.基于已有的容器构建,通过docker commit命令手动提交,来创建镜像,不推荐这种方式
2.基于本地模板导入
3.通过Dockerfile构建

第一种方式:

docker commit [options] container [REPOSITORY[:TAG]]
OPTIONS: 
        -a, --author=''作者信息
        -c, --change list 来自于dockerfile的一些指令
        -m, --message='' 提交信息
        -p, --pause=true 提交时暂停容器运行

下面演示如何使用该命令创建镜像

[root@k8s ~]# docker run -it --name web1 -p 8000:80 nginx /bin/bash
root@2c04ee056ab5:/# vim /etc/nginx/nginx.conf
bash: vim: command not found
没有vim,我装一个vim
root@2c04ee056ab5:/# apt update
root@66f749f0a0ba:/# apt install -y vim
root@66f749f0a0ba:~# which vim
/usr/bin/vim

# commit提交的时候,需要指定容器id

[root@k8s ~]# docker commit -a "taokey" -m "apt install vim" 66f749f0a0ba web_dev:1.0.1
sha256:9e943de3c11bfa3965806990631be0c2f039f7e3ce9c7b54d315a2b6b626c248

[root@k8s ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
web_dev                  1.0.1               9e943de3c11b        14 seconds ago      184MB

1. docker run -ti centos /bin/bash 
2. echo okok > ok.txt .    记住容器id bf217db342d6
3. docker commit -m 'add a new file' -a 'taoyake' bf217db342d6 web-2.1.19
 将会返回新的镜像id  sha256:067e8bffb4a47d9f2f337b1a967b37e8778b1e66b2a4bce37708680bb1246309
4. docker images 可以看到新创建的 web-2.1.19 镜像

第二种方式:
镜像基于已有模板镜像,通过save和load导出导入;

导出镜像实例:
docker save -o nginx.tar nginx:latest

docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)

导入镜像示例:
docker load -i nginx.tar

docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息

测试:

[root@k8s ~]# docker save -o nginx.tar nginx_dev:1.0.1
[root@k8s ~]# du -sh nginx.tar
525M    nginx.tar

# 把nginx.tar导入
[root@k8s ~]# docker rmi 90fc0f742b1d
[root@k8s ~]# docker load -i nginx.tar
[root@k8s ~]# docker images|grep nginx_dev
nginx_dev                1.0.1               90fc0f742b1d        24 hours ago        534MB

第三种方式:编写DockerFile构建镜像

    DockerFile是一种可以被Docker程序解释的脚本。Dockerfile由一行行命令语句组成,并且支持用“#”开头作为注释。一般情况下:Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令。

下边介绍一下常用的Dockerfile指令:

"#" 为注释,等于shell脚本的中#

FROM centos:7.6.1810 # 在整个dockerfile文件中,除了注释之外的第一行,要是from,用于指定父镜像

MAINTAINER  # 镜像的作者信息

LABEL # 设置镜像的属性标签

ADD  # 用于添加宿主机本地的文件、目录、压缩等资源到镜像里边,会自动解压tag.gz,gzip,bzip2以及 xz格式的压缩包,会自动复制并解压到 <目标路径>。
ADD的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

COPY # 用于添加宿主机本地的文件、目录、压缩等资源到镜像里边,不会自动解压任何压缩包
这里可以是通配符表达式,其通配符规则要满足 Go的filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用提前创建,路径不存在,会自动创建。

ENV  # 指令用以定义镜像的环境变量

EXPOSE 

    1. 指定容器在运行时监听的端口

    2. 在构建容器时通过 -P (大写的P)可以随机映射端口。(如果EXPOSE没有指定端口,那么使用 -P 参数无效)

 

通过dockerfile构建一个nginx镜像

[root@k8s-master ~]# cd /data/dev/
[root@k8s-master dev]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@k8s-master dev]# tar -zxvf nginx-1.18.0.tar.gz
[root@k8s-master dev]# cat index.html
<h1>Hello Taoyake !</h1>
[root@k8s-master dev]# tar -zcvf status.tar.gz index.html

修改nginx配置文件

[root@k8s-master dev]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /data/web/html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /n56 {
            proxy_pass http://127.0.0.1:8080;
        }

    }
}



看下我写的nginx镜像dockerfile内容:

[root@k8s-master dev]# cat nginx.DockerFile
#centos nginx image

FROM centos:7.9.2009

LABEL MAINTAINET="taoyake"

RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools htop iotop

ADD nginx-1.18.0.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx && make && make install
RUN mkdir -p /data/web/html
ADD nginx.conf /apps/nginx/conf/nginx.conf
ADD status.tar.gz /data/web/html


CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]

 

开始构建nginx镜像

使用docker build 来构建镜像,

参数:-f [指定要使用的Dockerfile路径] -t [镜像的名字及标签,通常name:tag]

[root@k8s-master dev]# docker build -f nginx.DockerFile -t nginx_dev:1.0.1 .

前台运行构建好的nginx_dev:1.0.1 镜像:

[root@k8s-master dev]# docker run -it --rm -p 80:80 nginx_dev:1.0.1

访问宿主机的80端口,看是否成功。

第四天(2)-基于dockerfile构建nginx镜像、tomcat镜像_docker镜像

 

通过dockerfile构建一个tomcat镜像。

镜像包括:jdk1.8.0_181 + apache-tomcat-9.0.53

看下dockerfile内容:

[root@k8s-node02 data]# cat tomcat.dockerfile
#centos nginx image

FROM centos:7.9.2009

LABEL MAINTAINET="taoyake"

RUN yum install -y vim wget curl gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools htop iotop
RUN mkdir /data
RUN wget https://repo.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz && tar -zxvf jdk-8u181-linux-x64.tar.gz -C /data/
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz && tar -zxvf apache-tomcat-9.0.53.tar.gz -C /data/
RUN cd /data/ && ln -s apache-tomcat-9.0.53 tomcat
COPY profile /etc/profile

ENV JAVA_HOME=/data/jdk1.8.0_181
ENV JRE_HOME=/data/jdk1.8.0_181/jre
ENV PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
ENV CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

EXPOSE 8080
CMD ["/data/tomcat/bin/catalina.sh", "run"]
[root@k8s-node02 data]# docker run -it --rm -p 8080:8080 tomcat_dev:1.0.3
Using CATALINA_BASE:   /data/tomcat
Using CATALINA_HOME:   /data/tomcat
Using CATALINA_TMPDIR: /data/tomcat/temp
Using JRE_HOME:        /data/jdk1.8.0_181/jre
Using CLASSPATH:       /data/tomcat/bin/bootstrap.jar:/data/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
12-Sep-2021 16:17:00.018 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.53
12-Sep-2021 16:17:00.022 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 6 2021 19:09:00 UTC
12-Sep-2021 16:17:00.037 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.53.0
12-Sep-2021 16:17:00.037 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
12-Sep-2021 16:17:00.037 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-957.el7.x86_64
中间省略部分日志信息...
12-Sep-2021 16:17:01.375 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/data/apache-tomcat-9.0.53/webapps/manager]
12-Sep-2021 16:17:01.403 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/apache-tomcat-9.0.53/webapps/manager] has finished in [29] ms
12-Sep-2021 16:17:01.409 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
12-Sep-2021 16:17:01.425 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [793] milliseconds

 

用浏览器访问一下宿主机的8080端口是否正常。

第四天(2)-基于dockerfile构建nginx镜像、tomcat镜像_tomcat_02

 

到此为止实验结束~