理论+实操:docker 镜像创建

前言:docker镜像的分层
  • dockerfile中的指令都会创建一个新的镜像层

  • 镜像层将被缓存和复用

  • 当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

  • 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

  • 镜像层是不可变的,如果在某一层中添加了一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

docker镜像
  • 是应用发布的标准格式
  • 可支撑一个docker容器的运行

一:docker镜像的创建方法

  • 基于已有镜像创建
  • 基于本地模板创建
  • 基于Dockerfile创建

dockerfile用的多,其次基于已有镜像创建

二:基于Dockerfile创建

Dockerfile是由一组指令组成的文件

Dockerfile结构四部分

  • 基础镜像信息——FROM
  • 维护者信息———MAINTAINER
  • 镜像操作指令——ENV、EXPOSE、RUN、ADD、COPY、VOLUME、USER、WORKDIR、ONBUILD、HEALTHCHECK
  • 容器启动时执行指令——CMD

维护者信息没啥用,起到说明作者之意

其他的部分都很重要

2.1 Dockerfile指令

指令含义概述
1FROM 镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM 指令指定基础镜像
2MAINTAINER 名字说明新镜像的相关信息,比如维护人员、作者指定新镜像的作者
3RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中,每一条RUN都会产生一个镜像层,生成一个临时容器,命令完成后会自动移除相当于在基础镜像上命令的运行,生成一个缓存层,并提交到新的镜像中
4CMD [ “要运行的程序”, “参数1,参数2” ]指定容器时要运行的命令或脚本,Dockerfile只能有一条CMD指令,若是指定多条,只会执行最后一条指定启动容器时要运行的命令或脚本,比如/bin/bash,dockerfile只能由一条CMD命令,只会执行最后一条CMD命令
5EXPOSE 端口号制定新镜像加载到Docker时要开启的端口指定新镜像要开启的端口
6ENV 环境变量 变量值设置一个环境变量的值,会被后面的RUN使用指定环境变量,会被后面的RUN所使用
7ADD 源文件/目录 目标文件/目录将宿主机内的源文件复制到容器内的目标文件处,源文件要与Dockerfile位于相同目录上,或者是一个URL复制源文件到目标文件,
8COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
9VOLUME [ “目录” ]在容器内创建一个挂载点在容器中创建一个挂载点

ADD可以自动解压归档文件
copy不行

2.2 实操演示

2.2.1 首先需要新创建一个目标目录,在里面写入Dockerfile文件

备注:要注意大小写,固定格式

[root@gsy ~]# mkdir apache
[root@gsy ~]# ls
anaconda-ks.cfg  apache  perl5
[root@gsy ~]# cd apache/

2.2.2 先写一个在容器内开启httpd的脚本

[root@gsy apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

2.2.3 编写Dockerfile

[root@gsy apache]# vim Dockerfile
#指定基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER GSY
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]

2.2.4 创建web的index首页

[root@gsy apache]# echo "gsy" > index.html
[root@gsy apache]# ls
Dockerfile  index.html  run.sh

备注:Dockerfile中的文件路径填写相对路径,即都在Dockerfile的同级目录下

2.2.5 准备就绪后,开始生成镜像,注意末尾有.

构建名为httpd:cetnos的镜像

[root@gsy apache]#  docker build -t httpd:cetnos .
Sending build context to Docker daemon  4.096kB
Step 1/9 : FROM centos
latest: Pulling from library/centos
8a29a15cefae: Pull complete 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
 ---> 470671670cac
Step 2/9 : MAINTAINER GSY
 ---> Running in 0272728c2b6e
Removing intermediate container 0272728c2b6e
 ---> 39d32b194362
Step 3/9 : RUN yum -y update
 ---> Running in 94d735d297c9
Install   9 Packages
Upgrade  22 Packages
Removing intermediate container 94d735d297c9
 ---> 9b7c08a2560b
Step 4/9 : RUN yum -y install httpd
 ---> Running in 9bffc91ec4b6
Installed:
  httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64                            
  apr-util-bdb-1.6.1-6.el8.x86_64                                               
  apr-util-openssl-1.6.1-6.el8.x86_64                                           
  apr-1.6.3-9.el8.x86_64                                                        
  apr-util-1.6.1-6.el8.x86_64                                                   
  centos-logos-httpd-80.5-2.el8.noarch                                          
  httpd-filesystem-2.4.37-16.module_el8.1.0+256+ae790463.noarch                 
  httpd-tools-2.4.37-16.module_el8.1.0+256+ae790463.x86_64                      
  mod_http2-1.11.3-3.module_el8.1.0+213+acce2796.x86_64                         
  brotli-1.0.6-1.el8.x86_64                                                     
  mailcap-2.1.48-3.el8.noarch                                                   

Complete!
Removing intermediate container 9bffc91ec4b6
 ---> 6845e32561e1
Step 5/9 : EXPOSE 80
 ---> Running in 99c541c14acf
Removing intermediate container 99c541c14acf
 ---> 18c976d4bcb9
Step 6/9 : ADD index.html /var/www/html/index.html
 ---> 60b68132a651
Step 7/9 : ADD run.sh /run.sh
 ---> 74b95e01ec1b
Step 8/9 : RUN chmod 755 /run.sh
 ---> Running in 11e640edb736
Removing intermediate container 11e640edb736
 ---> ee1977be4c19
Step 9/9 : CMD ["/run.sh"]
 ---> Running in caedba37de5e
Removing intermediate container caedba37de5e
 ---> 38d2d5159957
Successfully built 38d2d5159957
Successfully tagged httpd:cetnos

2.2.6 查看镜像

[root@gsy apache]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               cetnos              38d2d5159957        3 minutes ago       434MB
centos              latest              470671670cac        3 months ago        237MB
centos              7                   5e35e350aded        5 months ago        203MB

2.2.7 新镜像运行容器

-p 1216:80 端口映射,1216指的时宿主机端口,80指容器端口 小写字母

-P代表随机指定端口,用的少 大写字母

[root@gsy apache]# docker run -d -p 1216:80 httpd:cetnos
c75a2b3d2ad854bedc357572c1ca4cb2c1912db37e5b3b002130cc2bad786860
[root@gsy apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
c75a2b3d2ad8        httpd:cetnos        "/run.sh"           6 seconds ago       Up 5 seconds        0.0.0.0:1216->80/tcp   focused_torvalds

2.2.8 在客户机登录测试

在这里插入图片描述

三:基于已有的镜像容器进行创建

3.1 首先查看当前已有镜像

[root@gsy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               cetnos              38d2d5159957        10 hours ago        434MB
centos              latest              470671670cac        3 months ago        237MB
centos              7                   5e35e350aded        5 months ago        203MB

3.2 然后基于镜像创建容器

[root@gsy ~]# docker create -it centos:7 /bin/bash
01a0c8bbb34c028239a5d0ad82350f151f7a031a3b3d691e550865a8435cc4be
[root@gsy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
01a0c8bbb34c        centos:7            "/bin/bash"         8 seconds ago       Created                                    exciting_hawking
c75a2b3d2ad8        httpd:cetnos        "/run.sh"           10 hours ago        Up 10 hours         0.0.0.0:1216->80/tcp   focused_torvalds

3.3 基于创建的容器去创建镜像,并查看结果

[root@gsy ~]# docker commit --help

用法:docker 提交 [选项] 容器 [库[:TAG]]

根据容器的更改创建新映像

选项

-a,—author字符串 作者(例如,“John Hannibal Smith hannibal@a-team.com”)

-c, --change list 将Dockerfile指令应用于创建的映像

-m, --message string 提交消息

-p, --pause 提交期间暂停容器(默认为true)

[root@gsy ~]# docker commit -m "new" -a "gsy" 01a0c8bbb34c gsy:centos
sha256:9b6a848ec969142bdf411fed5fe46b03ef2cb29a7ec4f16638d811579e053ff1
[root@gsy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
gsy                 centos              9b6a848ec969        7 seconds ago       203MB
httpd               cetnos              38d2d5159957        10 hours ago        434MB
centos              latest              470671670cac        3 months ago        237MB
centos              7                   5e35e350aded        5 months ago        203MB

3.4 查看容器状态,顺便测试一波指定容器名字创建

[root@gsy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
01a0c8bbb34c        centos:7            "/bin/bash"         About a minute ago   Created                                    exciting_hawking
c75a2b3d2ad8        httpd:cetnos        "/run.sh"           10 hours ago         Up 10 hours         0.0.0.0:1216->80/tcp   focused_torvalds
[root@gsy ~]# docker create -it --name 965483 centos:7 /bin/bash
419b15d05dc196bf577f93c0181c7eecf1d29c14210ce09cce5dc37126936449
[root@gsy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
419b15d05dc1        centos:7            "/bin/bash"         3 seconds ago       Created                                    965483
01a0c8bbb34c        centos:7            "/bin/bash"         2 minutes ago       Created                                    exciting_hawking
c75a2b3d2ad8        httpd:cetnos        "/run.sh"           10 hours ago        Up 10 hours         0.0.0.0:1216->80/tcp   focused_torvalds
[root@gsy ~]# docker commit -m "new" -a "shl" 965483 shl:centos
sha256:b24563c2d9623c1b9962910859451cb1cb713001e2bf8b3336fa6bd24dff28f7
[root@gsy ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
419b15d05dc1        centos:7            "/bin/bash"         55 seconds ago      Created                                    965483
01a0c8bbb34c        centos:7            "/bin/bash"         2 minutes ago       Created                                    exciting_hawking
c75a2b3d2ad8        httpd:cetnos        "/run.sh"           10 hours ago        Up 10 hours         0.0.0.0:1216->80/tcp   focused_torvalds
[root@gsy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
shl                 centos              b24563c2d962        14 seconds ago       203MB
gsy                 centos              9b6a848ec969        About a minute ago   203MB
httpd               cetnos              38d2d5159957        10 hours ago         434MB
centos              latest              470671670cac        3 months ago         237MB
centos              7                   5e35e350aded        5 months ago         203MB

四:基于本地模板创建

4.1 这种方法首先需要在本地已经有一个模板(这里我是从网上下载的)

[root@gsy ~]# which wget
/usr/bin/which: no wget in (/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@gsy ~]# yum install wget -y
[root@gsy ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

在这里插入图片描述

[root@gsy ~]# ls -lh
total 85M
-rw-------. 1 root root 1.6K Mar 22 18:56 anaconda-ks.cfg
drwxr-xr-x. 2 root root   56 Apr 19 23:05 apache
-rw-r--r--. 1 root root  85M Apr 20 09:55 debian-7.0-x86-minimal.tar.gz
drwxr-xr-x. 2 root root    6 Apr  6 14:51 perl5

4.2 然后导入到镜像中

[root@gsy ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - gsy:shl
sha256:c1814f2b86169fa73414408b95193d0c079ab89f6bf6803fbd2ef715accfd69d
[root@gsy ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
gsy                 shl                 c1814f2b8616        14 seconds ago      215MB
shl                 centos              b24563c2d962        47 minutes ago      203MB
gsy                 centos              9b6a848ec969        48 minutes ago      203MB
httpd               cetnos              38d2d5159957        11 hours ago        434MB
centos              latest              470671670cac        3 months ago        237MB
centos              7                   5e35e350aded        5 months ago        203MB

完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值