有三种方式可以构建镜像:
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端口,看是否成功。
通过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端口是否正常。
到此为止实验结束~