容器学习Day11-docker commit构建容器镜像

系列文章目录

容器学习Day01-初识容器

容器学习Day02-VMware Workstation安装Ubuntu

容器学习Day03-Ubuntu常用命令(一)

容器学习Day04-Ubuntu常用命令(二)

容器学习Day05-Ubuntu常用命令(三)

容器学习Day06-Ubuntu常用命令(四)

容器学习Day07-Docker基础(一)

容器学习Day08-Docker基础(二)

容器学习Day09-理解容器镜像

容器学习Day10-搭建私有镜像仓库

容器学习Day11-docker commit构建容器镜像

容器学习Day12-使用Dockerfile构建容器镜像

容器学习Day13-Docker容器网络

容器学习Day14-Docker容器存储

容器学习Day15-Docker容器底层实现技术

容器学习Day16-Docker Compose容器编排


文章目录

前言

一、docker commit 构建镜像

1、基于OS基础镜像构建

2、基于厂商提供的基础镜像构建

二、docker commit 构建镜像的缺点

总结

前言

       前面了解了镜像仓库的搭建,那么该如何构建自己的容器镜像呢,今天重点来了解一下。


       大家可以通过公共镜像仓库拉取镜像使用,但往往拉取的镜像都没办法直接满足我们的使用需求,一般都需要构建自己的容器镜像。构建容器镜像通常有两种方法, 一是可以修改正在运行的容器,然后使用 docker commit 命令生成新的镜像,二是可以通过 Dockerfile 文件来构建镜像。

一、docker commit 构建镜像

       使用 docker commit 构建镜像,可以先找一个合适的基础镜像,使用基础镜像运行一个容器,然后根据自己的需求对这个容器进行修改,修改好之后,使用 docker commit 命令生成新的镜像。最常用的基础镜像就是各个 Linux 发行版的镜像。

       如何构建一个支持 https 的 apache 镜像,我们下面来研究一下。

       首先要有ssl证书,测试使用自签名证书即可。

###创建ssl证书。
root@docker:/docker# mkdir certs
root@docker:/docker# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/myapp.key -addext "subjectAltName = DNS:www.myapp.com" -x509 -days 3650 -out certs/myapp.crt
.+............+...+...+..+.+......+.....+....+.........+..+.+.....+....+.....+....+...........+.+..+.+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..........+...+...+.....+.+.....+.+..............+.........+......+...+.......+.....+.+.....+...+....+...+.........+.......................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+......+....+..............+.+..................+.....+................+...............................................+....+.....+......+....+.......................................+...........+...................+..+...+......+....+..............+......+.+......+..+.+............+.........+.........+.........+..+...+.......+......+.....+.............+......+...+......+......+..................+.....+.............+............+............+.........+.........+...+..+.......+...+..+....+......+.........+..+..................+.......+.....+....+..............+......+.+........+....+......+.........+..+...+.+......+........+......+.........+.............+..+.+.....+....+.....+......+....+..+......+...+............+............+...+............+................+............+..+.+.........+..+.+..+.......+......+...+.................+.......+.....+.+..+...+.+...+........+.........+............................+...........+....+...+...+.........+.................+...+..........+......+.........+..+....+.....+......+.+..+.......+...+..+......+...+.+.....+....+............+...+..+.......+.....................+..+..........+..............+.........+......+.+........+....................................+....+............+.....+...+.+.........+...........+......+............+.......+...........+.......+........+.......+..+....+..+...+....+...+...+..............+.............+.....+..........+.....+..........+..............+...+...+.......+..+......+.......+............+...+.................+.....................+...+.+...+...........+....+..+....+......+..............+.......+.........+...+...+.........+..............+......+...+...+....+...+..+.+.....+.............+...............+......+...+...+...+..+............+............+.........+......+.+..+......+..........+.........+...+..+............+...+..........+...+.....+...+....+...+..+...........................+.+.....+..........+.....+.........+...+...+.......+.......................+...+......+.+..+.+..............+.+.........+............+...+.................+.+.....+......................+......+............+...............+...+.........+..+.........+....+...........+......+........................+.+...+...............+...+........+.......+..+.......+........+......+.+....................+..........+...+......+..............+.+.....+....+..+..................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
........+.+..+......+......+...+.+.........+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+....+...+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+.+...+............+..+...+....+...+............+......+............+..+.............+.....+...............+..........+......+.....+.+.....+.+...............+..+............+.........+.......+..+............+....+.....+...................+.....+.......+......+.....+...+.+...+........+.......+..+....+...........+......+....+...+..+......+...+....+...............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DH
Organizational Unit Name (eg, section) []:DH
Common Name (e.g. server FQDN or YOUR name) []:www.myapp.com
Email Address []:
root@docker:/docker# 

       后面来试着构建镜像。

1、基于OS基础镜像构建

  • 拉取一个OS基础镜像并运行一个容器

       选择自己熟悉的发行版 Linux 即可,这里我们使用 CentOS 镜像。

###拉取centos基础镜像。
root@docker:~# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

###查看拉取的镜像。
root@docker:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   15 months ago   231MB

###运行一个容器,我们想配置https应用,通过-p参数映射一个端口,比如默认的443端口,当然也可以使用其他端口。
root@docker:~# docker run -itd -p 443:443 centos
e0b673c9fd3f643ee6d82f2f07bc085d792ef112a07bf774b67d01c70f29ddfc
root@docker:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS                                   NAMES
e0b673c9fd3f   centos    "/bin/bash"   7 seconds ago   Up 6 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp   hopeful_khayyam

###进入到容器。
root@docker:~# docker exec -it e0b673c9fd3f bash
[root@e0b673c9fd3f /]#

###尝试yum,会失败。
[root@e0b673c9fd3f /]# yum makecache
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                                                                                                                         80  B/s |  38  B     00:00    
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

###删除系统带的repo,更换为阿里源。
[root@e0b673c9fd3f /]# rm -rf /etc/yum.repos.d/CentOS-Linux-*
[root@e0b673c9fd3f /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2495  100  2495    0     0   9450      0 --:--:-- --:--:-- --:--:--  9450
[root@e0b673c9fd3f /]# yum makecache
Failed to set locale, defaulting to C.UTF-8
CentOS-8.5.2111 - Base - mirrors.aliyun.com                                                                                                                                       248 kB/s | 4.6 MB     00:18    
CentOS-8.5.2111 - Extras - mirrors.aliyun.com                                                                                                                                      35 kB/s |  10 kB     00:00    
CentOS-8.5.2111 - AppStream - mirrors.aliyun.com                                                                                                                                  166 kB/s | 8.4 MB     00:52    
Last metadata expiration check: 0:00:01 ago on Sun Dec 11 01:20:52 2022.
Metadata cache created.
  •  根据需要修改容器

       根据自己情况,可以选择不同的方式安装apache,yum安装或源码安装等。

###安装httpd。
[root@e0b673c9fd3f /]# yum install -y httpd

###安装ssl支持模块。
[root@e0b673c9fd3f /]# yum install -y mod_ssl

###将证书拷贝到容器内部,在宿主机上执行docker cp命令,实验环境宿主机生成证书的位置是/docker/certs,将证书目录拷贝到容器中的/etc/httpd/conf/,当然也可以是其他目录,和配置文件对应即可。
root@docker:/docker# docker cp /docker/certs e0b673c9fd3f:/etc/httpd/conf

###查看拷贝到容器中的证书。
[root@e0b673c9fd3f /]# ls -l /etc/httpd/conf/certs/
total 8
-rw-r--r-- 1 root root 2057 Dec 11 01:45 myapp.crt
-rw------- 1 root root 3272 Dec 11 01:44 myapp.key

###修改apache配置文件/etc/httpd/conf.d/ssl.conf,主要是修改证书的路径为实际存放路径,系统默认没有vim,可以先安装一下,当然也可以将文件拷贝到宿主机修改,再拷回。
[root@e0b673c9fd3f /]# yum install -y vim
[root@e0b673c9fd3f /]# vim /etc/httpd/conf.d/ssl.conf
#修改前
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

#修改后
SSLCertificateFile /etc/httpd/conf/certs/myapp.crt
SSLCertificateKeyFile /etc/httpd/conf/certs/myapp.key

###修改/etc/httpd/conf/httpd.conf文件,SeverName配置,不然启动时会有错误提示信息。
vim /etc/httpd/conf/httpd.conf
#修改前
#ServerName www.example.com:80

#修改后
ServerName localhost:80

###修改完配置文件,启动httpd服务进行测试。
[root@e0b673c9fd3f /]# httpd -k start

###网站默认值是/var/www/html(即把网站数据存放到这个目录中),我们创建一个测试页面进行测试。
[root@e0b673c9fd3f /]# echo "Hello,World!" > /var/www/html/index.html

###使用curl命令测试,-k参数忽略证书错误。
[root@e0b673c9fd3f /]# curl https://localhost/index.html -k
Hello,World!

###我们希望启动容器时自动启动httpd服务,可以编写一个启动脚本,放到/usr/local/bin下边。
[root@e0b673c9fd3f /]# vim /usr/local/bin/httpdstart
##内容如下:

#!/bin/sh
set -e
rm -f /etc/httpd/logs/httpd.pid
exec httpd -DFOREGROUND "$@"

###给启动脚本增加可执行权限
[root@e0b673c9fd3f /]# chmod +x /usr/local/bin/httpdstart
  • 使用 docker commit 保存成新的镜像

docker commit用法:docker commit  参数  容器名或容器id  镜像名。

参数说明:
-a:提交的镜像作者;

-c:使用Dockerfile指令来创建镜像;

-m:提交时的说明文字;

-p:在commit时,将容器暂停。(默认选项)  

###将修改后的容器保存为镜像,比方说保存为v1版本。
root@docker:~# docker commit -a "haha" -m "apache with ssl" -c 'CMD [ "httpdstart" ]'  e0b673c9fd3f httpd:v1
sha256:c893a0ca5ab6d9bc0b031a3b1483d923d1f428903561175d257bf74e88380519

###查看镜像。
root@docker:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
httpd        v1        c893a0ca5ab6   28 seconds ago   307MB
centos       latest    5d0da3dc9764   15 months ago    231MB

###停止并删除之前运行的容器。
root@docker:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS                                   NAMES
e0b673c9fd3f   centos    "/bin/bash"   6 hours ago   Up 6 hours   0.0.0.0:443->443/tcp, :::443->443/tcp   hopeful_khayyam
root@docker:~# docker stop e0b673c9fd3f
e0b673c9fd3f
root@docker:~# docker rm e0b673c9fd3f
e0b673c9fd3f

###使用新镜像运行容器,并测试。
root@docker:~# docker run -d -p 443:443 httpd:v1
9a18026a6603df9924d94f3517d45e37c34d1ac21e81ffa70db80b04cf494b49
root@docker:~# curl https://192.168.1.128/index.html -k
Hello,World!

###运行容器时,也可以通过-v参数,映射宿主机文件目录到容器中,这样更加灵活,比如配置文件,网站文件,日志文件等。可以把之前配置好的容器中文件拷贝到宿主机上,通过-v参数进行映射。
##这里我创建了一个app目录,里面拷贝了apache的配置文件、证书,创建了日志目录。
root@docker:/docker# cd app/
root@docker:/docker/app# ls
certs  conf  logs

##创建一个myapp目录,在里面创建一个测试html。
root@docker:/docker/app# mkdir myapp
root@docker:/docker/app# ls
certs  conf  logs  myapp
root@docker:/docker/app# echo "Hello,New World!" > myapp/index.html

###停止并删除之前运行的容器。
root@docker:/docker/app# docker ps
CONTAINER ID   IMAGE      COMMAND        CREATED          STATUS          PORTS                                   NAMES
9a18026a6603   httpd:v1   "httpdstart"   26 minutes ago   Up 26 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp   cool_shtern
root@docker:/docker/app# docker stop 9a18026a6603
9a18026a6603
root@docker:/docker/app# docker rm 9a18026a6603
9a18026a6603

###启动新的容器。
root@docker:/docker/app# docker run -d -p 443:443 -v /docker/app/logs:/etc/httpd/logs -v /docker/app/conf/httpd.conf:/etc/httpd/conf/httpd.conf -v /docker/app/myapp/:/var/www/html httpd:v1
8505ff194f70b2df4dfaa952591f8b326c80ff009cad0780f4ff559499d92cd7
root@docker:/docker/app# docker ps
CONTAINER ID   IMAGE      COMMAND        CREATED         STATUS         PORTS                                   NAMES
8505ff194f70   httpd:v1   "httpdstart"   5 seconds ago   Up 3 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp   jovial_buck

###测试。
root@docker:/docker/app# curl https://192.168.1.128/index.html -k
Hello,New World!

###进到宿主机的/docker/app/lo目录,可以看到apache的日志文件已经写到这里了,可以进行持久化存储。
root@docker:/docker/app# cd /docker/app/logs/
root@docker:/docker/app/logs# ls
access_log  error_log  ssl_access_log  ssl_error_log  ssl_request_log

2、基于厂商提供的基础镜像构建

      也可以直接拉取官方做好的镜像来进行修改,官方的 httpd 镜像都是基于 Ubuntu 系统的。      

  • 拉取一个官方 httpd 镜像并运行一个容器

      可以去 docker hub (Docker Hub)上找一个合适的镜像进行拉取,一般拉取最新的即可。

###拉取httpd镜像。
root@docker:/# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete 
dcc4698797c8: Pull complete 
41c22baa66ec: Pull complete 
67283bbdd4a0: Pull complete 
d982c879c57e: Pull complete 
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
root@docker:/# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
httpd        v1        c893a0ca5ab6   About an hour ago   307MB
httpd        latest    dabbfbe0c57b   11 months ago       144MB
centos       latest    5d0da3dc9764   15 months ago       231MB

###停掉并删除之前运行的apache容器,以免端口冲突。
root@docker:/# docker ps
CONTAINER ID   IMAGE      COMMAND        CREATED          STATUS          PORTS                                   NAMES
8505ff194f70   httpd:v1   "httpdstart"   28 minutes ago   Up 28 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp   jovial_buck
root@docker:/# docker stop 8505ff194f70
8505ff194f70
root@docker:/# docker rm 8505ff194f70
8505ff194f70

###使用官方镜像运行一个容器,并进入容器。
root@docker:/# docker run -d -p 443:443 httpd:latest
62eeead7d288b05c27f0d47e5b57e338d2d052b73fb4093407edf5281c6ae964
root@docker:/# docker ps
CONTAINER ID   IMAGE          COMMAND              CREATED          STATUS          PORTS                                           NAMES
62eeead7d288   httpd:latest   "httpd-foreground"   44 seconds ago   Up 43 seconds   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   amazing_shamir
root@docker:/# docker exec -it 62eeead7d288 bash
root@62eeead7d288:/usr/local/apache2#

###查看apache详细信息,Debian默认的安装目录和CentOS有区别,需注意,以免搞混。
root@62eeead7d288:/usr/local/apache2# httpd -V
Server version: Apache/2.4.52 (Unix)
Server built:   Dec 21 2021 01:34:45
Server's Module Magic Number: 20120211:121
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local/apache2"
 -D SUEXEC_BIN="/usr/local/apache2/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
  •  根据需要修改容器

       官方提供的 httpd 镜像默认没有开启 https,需要修改配置文件启用相关配置。

###在宿主机创建一个app2目录,区别于之前的目录,将证书拷贝到app2目录。
root@docker:/docker# mkdir app2
root@docker:/docker# cd app2
root@docker:/docker/app2# cp -rp ../app/certs/ .

###创建conf、logs、myapp目录。
root@docker:/docker/app2# mkdir conf logs myapp

###将配置文件从容器复制到宿主机相应的目录。
root@docker:/# docker ps 
CONTAINER ID   IMAGE          COMMAND              CREATED       STATUS       PORTS                                           NAMES
62eeead7d288   httpd:latest   "httpd-foreground"   3 hours ago   Up 3 hours   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   amazing_shamir
root@docker:/# docker cp 62eeead7d288:/usr/local/apache2/conf/extra/httpd-ssl.conf /docker/app2/conf/
root@docker:/# docker cp 62eeead7d288:/usr/local/apache2/conf/httpd.conf /docker/app2/conf/

###在宿主机上编辑httpd.conf配置文件。
root@docker:/docker/app2/conf# vim /docker/app2/conf/httpd.conf

##修改SeverName配置,不然启动时会有错误提示信息。
#修改前
#ServerName www.example.com:80

#修改后
ServerName localhost:80

##去掉以下三行前面的#注释。
...
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
#LoadModule ssl_module modules/mod_ssl.so
...
#Include conf/extra/httpd-ssl.conf
...

###在宿主机上编辑httpd-ssl.conf,修改证书名字,也可以修改其他参数,如加密协议、加密套件等。
root@docker:/docker/app2/conf# vim httpd-ssl.conf
#修改前
SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
#修改后
SSLCertificateFile "/usr/local/apache2/conf/myapp.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/myapp.key"

###将配置文件和证书拷贝到容器中。
root@docker:/docker/app2/conf# docker cp /docker/app2/conf/httpd.conf 62eeead7d288:/usr/local/apache2/conf/
root@docker:/docker/app2/conf# docker cp /docker/app2/conf/httpd-ssl.conf 62eeead7d288:/usr/local/apache2/conf/extra/
root@docker:/docker/app2/conf# docker cp /docker/app2/certs/myapp.crt 62eeead7d288:/usr/local/apache2/conf/
root@docker:/docker/app2/conf# docker cp /docker/app2/certs/myapp.key 62eeead7d288:/usr/local/apache2/conf/

###容器中新建一个测试html进行测试,默认工作目录是/usr/local/apache2/htdocs。
root@62eeead7d288:/# echo "Hello,MyWorld!" > /usr/local/apache2/htdocs/index.html

###容器中重启httpd。
root@62eeead7d288:/# httpd -k restart

###宿主机上访问测试。
root@docker:/# curl https://192.168.1.128/index.html -k
Hello,MyWorld!
  •  使用 docker commit 保存成新的镜像
###docker commit保存成新的镜像,官方的httpd默认有启动脚本,无需再单独添加。
root@docker:/# docker commit -a "haha" -m "apache with ssl" 62eeead7d288 httpd:v2
sha256:379d5e9087dbc9c791cfbd5dc0c611dddd726ec20f00131f23436440393d54b3

###查看镜像。
root@docker:/# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
httpd        v2        379d5e9087db   43 seconds ago   144MB
httpd        v1        c893a0ca5ab6   5 hours ago      307MB
httpd        latest    dabbfbe0c57b   11 months ago    144MB
centos       latest    5d0da3dc9764   15 months ago    231MB

###停止删除之前运行的容器。
root@docker:/# docker ps
CONTAINER ID   IMAGE          COMMAND              CREATED       STATUS       PORTS                                           NAMES
62eeead7d288   httpd:latest   "httpd-foreground"   4 hours ago   Up 4 hours   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   amazing_shamir
root@docker:/# docker stop 62eeead7d288
62eeead7d288
root@docker:/# docker rm 62eeead7d288
62eeead7d288

###使用新镜像运行一个新容器,logs和httpd.conf配置文件和应用文件,通过-v参数映射给容器。
##创建一个测试index.html。
root@docker:/# echo "Thank You!" > /docker/app2/myapp/index.html

##运行容器。
root@docker:/# docker run -d -p 443:443 -v /docker/app2/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v /docker/app2/logs/:/usr/local/apache2/logs/ -v /docker/app2/myapp/:/usr/local/apache2/htdocs/ httpd:v2
2cbaa3f3d4bc778a46babec2b96944f9a81dca1ef0220d00e6f4c4160eec43db

##查看镜像
root@docker:/# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED         STATUS         PORTS                                           NAMES
2cbaa3f3d4bc   httpd:v2   "httpd-foreground"   4 seconds ago   Up 2 seconds   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   upbeat_goldwasser

###测试访问。
root@docker:/# curl https://192.168.1.128/ -k
Thank You!

二、docker commit 构建镜像的缺点

       上面我们了解了通过对容器的可写层进行修改,来生成新的镜像。但是这种方式会让镜像的层数越来越多,联合文件系统最多允许128层。另外,许多上层的应用镜像都基于相同的基础镜像的话,一旦基础镜像需要改动,比如一些安全漏洞,所有的上层应用镜像都需要进行相应的改动,或者重新构建,会产生大量的重复工作。那还有没有更好的方式呢?答案是 Dockerfile。


总结

       以上就是今天学习了解的内容,主要是通过 docker commit 命令构建自己的镜像,后面看一下 如何通过 Dockerfile 构建自己的镜像。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtobeKegio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值