文章目录

  • docker(二)镜像的使用
  • 列出镜像列表
  • 查找拖取删除
  • 镜像的构建
  • Dockerfile文件的方式
  • COPY
  • ADD
  • ENV&EXPOSE
  • VOLUME
  • CMD与ENTRYPOINT和shell exec
  • 镜像的优化
  • 几个命令


docker(二)镜像的使用

列出镜像列表

docker images           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB

各个选项说明:

    REPOSITORY:表示镜像的仓库源

    TAG:镜像的标签

    IMAGE ID:镜像ID

    CREATED:镜像创建时间

    SIZE:镜像大小


同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,
如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,
我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash 
root@d77ccb2e5cca:/#

#如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker 将默认使用 ubuntu:latest 镜像。

查找拖取删除

docker search httpd
docker pull httpd
docker rmi hello-world

镜像的构建

'
镜像的构建
docker commit 构建镜像三部曲
	运行容器
	修改容器
	将容器保存为新的镜像

缺点
	效率低 可重复性弱 容易出错
	使用者无法对镜像进行审计,存在安全隐患

'
[root@server3 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB
[root@server3 ~]# docker history ubuntu:latest  
# 查看每一层的镜像修改,也就是该镜像的创建历史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
3556258649b2        2 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           2 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo '...   7 B                 
<missing>           2 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' >...   745 B               
<missing>           2 weeks ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     987 kB              
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:3ddd02d976792b6...   63.2 MB 

# <missing>的意思是 这些操作不是在本机操作的 所有找不到 这并没有什么关系
演示案例:
# busybox:这个镜像非常的轻量级 适合我们在学习和实验中去使用
[root@server3 ~]# docker run -it --name test busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
ee153a04d683: Pull complete 
Digest: sha256:9f1003c480699be56815db0f8146ad2e22efea85129b5b5983d0e0fb52d9ab70
Status: Downloaded newer image for busybox:latest
/ # echo helloworld >testfile
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr
/ # cat testfile 
helloworld
/ # exit #退出并停止运行 ctrl p+q 退出不停止运行

[root@server3 ~]# docker ps -a  #注意:我们只是退出了运行中的容器 并没有删除它
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
6789012d8958        busybox             "sh"                About a minute ago   Exited (0) 5 seconds ago                       test
[root@server3 ~]# docker start test 
#我们将在后台保存的容器运行起来
test

[root@server3 ~]# docker attach test #此命令可以进入在后台运行起来的容器

[root@server3 ~]# docker commit test test:v1  #将我们所修改的容器保存
sha256:c1a9c80bccb0b51e410cc90bbe56460c4b84e2119741aee133d99a45da702857

'docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

各个参数说明:

    -m: 提交的描述信息

    -a: 指定镜像作者

    e218edb10161:容器 ID

    runoob/ubuntu:v2: 指定要创建的目标镜像名

'

[root@server3 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                v1                  c1a9c80bccb0        5 seconds ago       1.22 MB
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB

[root@server3 ~]# docker history test:v1 
 #我们可以看到 相同的底层是共享的(在我们当前的文件系统之上是只保存一份的)基于busybox构建的
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c1a9c80bccb0        24 seconds ago      sh                                              59 B                
db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB 

# 缺点是:我们无法得知我们对这个容器到底做了什么操作,虽然它已经被保存了

# 可以强制删除正在运行中的容器
docker rm -f 

# 我们可以看到 新运行的容器也是有我们之前所保存的数据的
[root@server3 ~]# docker run -it --name vm1 test:v1
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr
/ # cat testfile 
helloworld

Dockerfile文件的方式

创建一个Dockerfile

# 注意:一定要创建一个新的目录 因为在构建镜像的时候,
#会默认把dockerfile所在的目录中的所有目录发送给docker引擎,
#举个例子:如果你把dockerfile放在/目录下 那么这个过程会变得非常的缓慢
[root@server3 mnt]# pwd
/mnt
[root@server3 mnt]# ls
docker
[root@server3 mnt]# cd docker/
[root@server3 docker]# ls
[root@server3 docker]# vim dockerfile
'FROM busybox  #以哪个基础镜像为模板
 RUN echo testfile > file1 #在新镜像中你要执行的哪些动作
 RUN echo testfile > file2'
[root@server3 docker]# docker build -t test:v2 . #镜像名称 #.代表当前目录
Sending build context to Docker daemon 2.048 kB
#把dockerfile所在的目录中的所有目录发送给docker引擎
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : RUN echo testfile > file1
 ---> Running in 4c00ef6f0753
 ---> e8a1fbac8837
Removing intermediate container 4c00ef6f0753 #临时镜像层删掉
Step 3/3 : RUN echo testfile > file2
 ---> Running in cd7a46bb3269
 ---> 5fc404485b27
Removing intermediate container cd7a46bb3269
Successfully built 5fc404485b27

[root@server3 docker]# cat dockerfile 
FROM busybox  #以哪个基础镜像为模板
RUN echo testfile > file1 #在新镜像中你要执行的哪些动作
RUN echo testfile > file2

[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test                v2                  5fc404485b27        About a minute ago   1.22 MB
test                v1                  c1a9c80bccb0        19 minutes ago       1.22 MB
ubuntu              latest              3556258649b2        2 weeks ago          64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago          1.22 MB
game2048            latest              19299002fdbe        2 years ago          55.5 MB
[root@server3 docker]# docker history test:v2
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
5fc404485b27        About a minute ago   /bin/sh -c echo testfile > file2                9 B                 
e8a1fbac8837        About a minute ago   /bin/sh -c echo testfile > file1                9 B                 
db8ee88ad75f        3 weeks ago          /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago          /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB  

[root@server3 docker]# docker history busybox:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB     

# 缓存特性
# 再次更改dockerfile 注意:不要随便加空格(要使用缓存 之前内容不能随便更改)
[root@server3 docker]# cat dockerfile 
FROM busybox
RUN echo testfile > file1
RUN echo testfile > file2
RUN echo testfile > file3

[root@server3 docker]# docker build -t test:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1/4 : FROM busybox
 ---> db8ee88ad75f
Step 2/4 : RUN echo testfile > file1
 ---> Using cache  #已经运行过的不再运行
 ---> e8a1fbac8837
Step 3/4 : RUN echo testfile > file2
 ---> Using cache
 ---> 5fc404485b27
Step 4/4 : RUN echo testfile > file3
 ---> Running in e2e4d6f4c565  #运行新的指令
 ---> edd40df71d11
Removing intermediate container e2e4d6f4c565
Successfully built edd40df71d11

##如果我们希望在构建镜像时不使用缓存,可以在docker build命令中加上 --no-cache参数
#dockerfile中每一个指令都会创建一个镜像层,上层是依赖于下层的,无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失败

# 对比来看 v2和v3 有几层是一样的 每一个RUN就会构建一层镜像
# 而且我们可以看到 每一层的操作
# 再次说明 共同的镜像层之间的共享的

[root@server3 docker]# docker history test:v3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
edd40df71d11        52 seconds ago      /bin/sh -c echo testfile > file3                9 B                 
5fc404485b27        6 minutes ago       /bin/sh -c echo testfile > file2                9 B                 
e8a1fbac8837        6 minutes ago       /bin/sh -c echo testfile > file1                9 B                 
db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB             
[root@server3 docker]# docker history test:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5fc404485b27        6 minutes ago       /bin/sh -c echo testfile > file2                9 B                 
e8a1fbac8837        6 minutes ago       /bin/sh -c echo testfile > file1                9 B                 
db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB  

# 本质:dockerfile中的每一层其实就是执行了一个docker commi

COPY

dockerfile的详解 
#便于我们书写更成熟的dockerfile文件
dockerfile常用指令
	FROM:指定base镜像,如果本地不存在会从远程仓库下载(虚拟机要配置上网)
	MAINTAINER:设置镜像的作者,比如用户邮箱等 (不是必须的)
	COPY:把文件从buile context复制到镜像
		  支持两种形式:COPY src dest 和 COPY ["src","dest"]
		  src必须指定build context中的文件或目录
	"""
	[root@server3 docker]# vim dockerfile
	FROM busybox
	COPY testfile /tmp

	[root@server3 docker]# vim testfile
	hello~

	[root@server3 docker]# docker build -t test:v4 .
	Sending build context to Docker daemon 3.072 kB
	Step 1/2 : FROM busybox
	 ---> db8ee88ad75f
	Step 2/2 : COPY testfile /tmp
	 ---> ff437a8d3732
	Removing intermediate container e79887133199
	Successfully built ff437a8d3732
	[root@server3 docker]# docker history test:v4
	IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
	ff437a8d3732        9 seconds ago       /bin/sh -c #(nop) COPY file:d93a5a916d7ae8...   7 B                 
	db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
	<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4dd...   1.22 MB             
	
	[root@server3 docker]# docker run -it --name vm1 test:v4
	/ # ls
	bin   dev   etc   home  proc  root  sys   tmp   usr   var
	/ # cd /tmp/
	/tmp # ls
	testfile
	/tmp # cat testfile 
	hello~	
	"""
# 建议:不用的容器 要即使删除

ADD

ADD:用法与COPY类似,不同的是src可以是归档压缩文件,
	文件会被自动解压到dest,也可以下载URL并拷贝到镜像
	eg:ADD html.tar /var/www
	   ADD http://ip/html.tar /var/www

"""
[root@server3 docker]# ls
dockerfile  nginx-1.15.9.tar.gz  testfile
[root@server3 docker]# vim dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.9.tar.gz /tmp
 
[root@server3 docker]# docker build -t test:v5 .
Sending build context to Docker daemon 1.036 MB
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : COPY testfile /tmp
 ---> Using cache
 ---> ff437a8d3732
Step 3/3 : ADD nginx-1.15.9.tar.gz /tmp
 ---> 9db2ad29e44f
Removing intermediate container f84d556d43dc
Successfully built 9db2ad29e44f

[root@server3 docker]# docker run -it --name vm2 test:v5 
/ # cd /tmp/
/tmp # ls
nginx-1.15.9  testfile
/tmp # cd nginx-1.15.9/
/tmp/nginx-1.15.9 # ls
CHANGES     README      configure   man
CHANGES.ru  auto        contrib     src
LICENSE     conf        html
"""

ENV&EXPOSE

ENV:设置环境变量,变量可以被后续的指令使用(不是必须的)
		ENV HOSTNAME server1.example.com
	EXPOSE:如果容器运行应用服务,可以把服务的端口暴露出去
"""
[root@server3 docker]# docker history game2048
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
19299002fdbe        2 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "se...   0 B                 
<missing>           2 years ago         /bin/sh -c #(nop)  EXPOSE 80/ tcp                0 B                 
# 服务的端口暴露出去 方便我们去做端口映射和用户在容器启动后去访问的
<missing>           2 years ago         /bin/sh -c #(nop) COPY dir:cb74e9c037a3d50...   600 kB              
<missing>           2 years ago         /bin/sh -c #(nop)  MAINTAINER Golfen Guo <...   0 B                 
<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daem...   0 B                 
<missing>           2 years ago         /bin/sh -c #(nop)  EXPOSE 443/tcp 80/tcp        0 B                 
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:d15ceb73c6ea77...   1.1 kB              
<missing>           2 years ago         /bin/sh -c #(nop) COPY file:af94db45bb7e4b...   643 B               
<missing>           2 years ago         /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D421...   50.1 MB             
<missing>           2 years ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.11.7     0 B                 
<missing>           2 years ago         /bin/sh -c #(nop)  MAINTAINER NGINX Docker...   0 B                 
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:7afbc23fda8b0b3...   4.8 MB    
	"""

VOLUME

VOLUME:申明数据卷,通常指定的是应用的数据挂在点
	#后面会有专门去讲解的 
	#目的:容器数据持久化的
		VOLUME ["/var/www/html"]
"""
[root@server3 docker]# vim dockerfile 
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.9.tar.gz /tmp
VOLUME ["/data"] 
#在启动容器的时候会帮我们自动的新建
[root@server3 docker]# docker build -t test:v6 .
Sending build context to Docker daemon 1.036 MB
Step 1/4 : FROM busybox
 ---> db8ee88ad75f
Step 2/4 : COPY testfile /tmp
 ---> Using cache
 ---> ff437a8d3732
Step 3/4 : ADD nginx-1.15.9.tar.gz /tmp
 ---> Using cache
 ---> 9db2ad29e44f
Step 4/4 : VOLUME /data
 ---> Running in 5f03d4efc260
 ---> 680a9d07e8e9
Removing intermediate container 5f03d4efc260
Successfully built 680a9d07e8e9
[root@server3 docker]# docker run -it --name vm2 test:v6
/ # ls
bin   dev   home  root  tmp   var
data  etc   proc  sys   usr
/ # cd data/

#我们可以通过docker inspect 6a8af9225428 这个命令看到
#容器中的/data目录与宿主机上的一个新建的本地目录发生了联系

        "Mounts": [
            {
                "Type": "volume",
                "Name": "54322e71d6257057e0b785efdfa5853a53422a287048780753fba37df3a2470b",
                "Source": "/var/lib/docker/volumes/54322e71d6257057e0b785efdfa5853a53422a287048780753fba37df3a2470b/_data",

我们进入到这个目录中去:
# 注意:此目录是docker引擎自动帮我们创建出来的
# 目录名是随机生成的
[root@server3 /]# cd /var/lib/docker/volumes
/54322e71d6257057e0b785efdfa5853a53422a287048780753fba37df3a2470b/_data
[root@server3 _data]# ls
[root@server3 _data]# touch file1
[root@server3 _data]# touch file2
[root@server3 _data]# docker attach vm2
/ # cd /data/
/data # ls
file1  file2
/data # rm -rf file1
/data # exit
[root@server3 _data]# ls
file2


#如需自己创建
#手工指定挂载点 如不存在 会自动创建
[root@server3 _data]# docker run -it --name vm3 -v /opt/data(宿主机上的路径 如果没有会自动帮我们创建):/data(容器内的路径) test:v
v1  v2  v3  v4  v5  v6  
[root@server3 _data]# docker run -it --name vm3 -v /opt/data:/data test:v6
/ # cd /data/
/data # ls
/data # ls
/data # touch file2
/data # ls
file1  file2
/data # [root@server3 _data]# cd /opt/
[root@server3 opt]# cd data/
[root@server3 data]# ls
file1  file2

	"""

CMD与ENTRYPOINT和shell exec

WOEKDIR:为RUN CMD ENTRYPOINT ADD COPY 指令设置镜像中的
当前工作目录(类似于cd ),如果目录不存在会自动创建
	RUN:在容器中运行命令并创建新的镜像层,常用于安装包
	# 每一个RUN指令都会构建一层镜像层,尽可能将多个命令放在一个RUN指令下
		RUN yum install -y vim

	CMD与ENTRYPOINT:这两个指令都是用于设置容器启动后执行的命令,
	但CMD会被docker run后面的命令覆盖,而ENTRYPOINT不会被忽略,一定会被执行
docker run后面的参数可以传递给ENTRYPOINT指令当作参数 dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,
只有最后一个有效
	
# CMD与ENTRYPOINT(容器启动后要运行的!!) RUN :在创建容器的时候!!!(在容器中)

"""
两种书写格式的区别 shell exec
[root@server3 docker]# docker build -t test:v7 .
Sending build context to Docker daemon 1.036 MB
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : ENV name world
 ---> Running in 67e1d402e2b6
 ---> 9771be0e3225
Removing intermediate container 67e1d402e2b6
Step 3/3 : ENTRYPOINT echo "hello,$name"
 ---> Running in 51af15777274
 ---> f6ec975c2f75
Removing intermediate container 51af15777274
Successfully built f6ec975c2f75
[root@server3 docker]# docker run --rm(一次性的 运行停止后就删除) test:v7
hello,world
1.shell的方式
[root@server3 docker]# cat dockerfile  #shell的方式
FROM busybox
ENV name world #ENV:定义变量
ENTRYPOINT echo "hello,$name"

[root@server3 docker]# docker build -t test:v8 .
Sending build context to Docker daemon 1.036 MB
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : ENV name world
 ---> Using cache
 ---> 9771be0e3225
Step 3/3 : ENTRYPOINT /bin/echo hello,$name
 ---> Running in 6bc8e3d7e2d8
 ---> 77cecb1b6c1c
Removing intermediate container 6bc8e3d7e2d8
Successfully built 77cecb1b6c1c

[root@server3 docker]# docker run --rm test:v8 #发现问题 变量无法被解析
hello,$name

2.exec的方式
[root@server3 docker]# cat dockerfile #exec的方式 
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo","hello,$name"]

shell格式底层会调用/bin/sh -c 来执行命令,
可以解析变量,而exec格式不会

所以我们需要修改写法
[root@server3 docker]# docker build -t test:v9 .
Sending build context to Docker daemon 1.036 MB
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : ENV name world
 ---> Using cache
 ---> 9771be0e3225
Step 3/3 : ENTRYPOINT /bin/sh -c echo hello,$name
 ---> Running in 5ab8da5fc8ca
 ---> 6f26d3c56e7e
Removing intermediate container 5ab8da5fc8ca
Successfully built 6f26d3c56e7e

[root@server3 docker]# docker run --rm test:v9
hello,world
[root@server3 docker]# cat dockerfile 
FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh","-c","echo hello,$name"]

exec格式时,ENTRYPOINT可以通过CMD提供的额外参数,
CMD的额外参数可以在容器启动时动态替换,
在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数

[root@server3 docker]# docker build -t test:v10 .
Sending build context to Docker daemon 1.036 MB
Step 1/3 : FROM busybox
 ---> db8ee88ad75f
Step 2/3 : ENTRYPOINT /bin/echo hello
 ---> Running in abf418860a24
 ---> 6265a469ddca
Removing intermediate container abf418860a24
Step 3/3 : CMD world
 ---> Running in 5d4ec18b4a7d
 ---> 5998937f8ea3
Removing intermediate container 5d4ec18b4a7d
Successfully built 5998937f8ea3

[root@server3 docker]# docker run --rm test:v10
hello world
[root@server3 docker]# cat dockerfile 
FROM busybox
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]

[root@server3 docker]# docker run --rm test:v10 westos
hello westos
# westos 覆盖了dockerfile CMD后面的值

"""

镜像的优化

选择最经简的基础镜像
减少镜像的层数
清理镜像构建的中间产物
注意优化网络请求
尽量去构建缓存
使用多阶段构建镜像

"""
前提:保证镜像存在于本地
[root@server3 docker]# docker load -i rhel7.tar 
[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140 MB

"""
[rhel7.3]
name=rhel7.3
baseurl=http://172.25.0.250/rhel7.3/x86_64/dvd
gpgcheck=0

[root@server3 docker]# docker build -t nginx:v1 .
[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  6baf2165c143        30 seconds ago      295 MB
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140 MB
# 实例:部署nginx
[root@server3 docker]# cat dockerfile 
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb  
#重新构建rpm数据库 如不执行这一条命令会报错 
#可以先不加这一句 看下报错
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
# 通过exec的方式
# nginx的启动方式
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

1.给镜像"瘦身":减少中间产物
[root@server3 docker]# docker build -t nginx:v2 .
[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  d21df066fe46        5 seconds ago       272 MB
nginx               v1                  6baf2165c143        5 minutes ago       295 MB
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140 MB
[root@server3 docker]# cat dockerfile 
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel && yum clean all #清理yum缓存
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
RUN rm -rf /mnt/nginx-1.15.9 #删除原始编译路径
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
# 注意:一但改动 缓存就不能用了

2.给镜像"瘦身":减少镜像层数 #合并多个RUN
# 注意:修改了指令 哪怕是一个空格 缓存就不能用了 使用缓存可以加快镜像构建速度
[root@server3 docker]# docker build -t nginx:v3 .
[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  49349f668909        33 seconds ago      253 MB
nginx               v2                  d21df066fe46        5 minutes ago       272 MB
nginx               v1                  6baf2165c143        11 minutes ago      295 MB
ubuntu              latest              3556258649b2        2 weeks ago         64.2 MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22 MB
game2048            latest              19299002fdbe        2 years ago         55.5 MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140 MB
[root@server3 docker]# cat dockerfile 
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.9
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

层数对比:
[root@server3 docker]# docker history nginx:v1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
6baf2165c143        11 minutes ago      /bin/sh -c #(nop)  CMD ["/usr/local/nginx/...   0 B                 
a0c55fb15186        11 minutes ago      /bin/sh -c make install                         3.86 MB             
c2818114b626        11 minutes ago      /bin/sh -c make                                 12.3 MB             
42cfafda467f        12 minutes ago      /bin/sh -c ./configure --prefix=/usr/local...   71.6 kB             
b53295c86125        12 minutes ago      /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9     0 B                 
3d39ff802d4d        12 minutes ago      /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd...   6.2 MB              
e45257d6ece4        12 minutes ago      /bin/sh -c yum install -y gcc make pcre-de...   126 MB              
3a812a20583c        12 minutes ago      /bin/sh -c rpmdb --rebuilddb                    6.64 MB             
ca37225041bb        14 minutes ago      /bin/sh -c #(nop) COPY file:45a94bb87479f6...   81 B                
8c63445a8161        14 minutes ago      /bin/sh -c #(nop)  MAINTAINER dd@westos.org     0 B                 
0544c1ca4b61        14 minutes ago      /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
0a3eb3fde7fd        5 years ago                                                         140 MB              Imported from -
[root@server3 docker]# docker history nginx:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d21df066fe46        6 minutes ago       /bin/sh -c #(nop)  CMD ["/usr/local/nginx/...   0 B                 
84cef4bc300b        6 minutes ago       /bin/sh -c rm -rf /mnt/nginx-1.15.9             0 B                 
9fd5173e4d04        6 minutes ago       /bin/sh -c make install                         3.86 MB             
d8a1f114e45e        6 minutes ago       /bin/sh -c make                                 12.3 MB             
64d1ab9f3fef        6 minutes ago       /bin/sh -c ./configure --prefix=/usr/local...   71.6 kB             
b6380cfd1f52        6 minutes ago       /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9     0 B                 
b1e894d7b421        6 minutes ago       /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd...   6.2 MB              
5a77bfb745f5        6 minutes ago       /bin/sh -c yum install -y gcc make pcre-de...   102 MB              
3a812a20583c        12 minutes ago      /bin/sh -c rpmdb --rebuilddb                    6.64 MB             
ca37225041bb        14 minutes ago      /bin/sh -c #(nop) COPY file:45a94bb87479f6...   81 B                
8c63445a8161        14 minutes ago      /bin/sh -c #(nop)  MAINTAINER dd@westos.org     0 B                 
0544c1ca4b61        14 minutes ago      /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
0a3eb3fde7fd        5 years ago                                                         140 MB              Imported from -
[root@server3 docker]# docker history nginx:v3
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
49349f668909        About a minute ago   /bin/sh -c #(nop)  CMD ["/usr/local/nginx/...   0 B                 
a181a5f0e37e        About a minute ago   /bin/sh -c rpmdb --rebuilddb && yum instal...   106 MB              
89980b82160c        About a minute ago   /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9     0 B                 
2e72df71ca13        About a minute ago   /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd...   6.2 MB              
ca37225041bb        14 minutes ago       /bin/sh -c #(nop) COPY file:45a94bb87479f6...   81 B                
8c63445a8161        14 minutes ago       /bin/sh -c #(nop)  MAINTAINER dd@westos.org     0 B                 
0544c1ca4b61        14 minutes ago       /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
0a3eb3fde7fd        5 years ago                                                          140 MB              Imported from -
镜像的优化(续)
3.使用多阶段构建镜像 
#比较优秀的方式(杀手锏) 
#细看dockerfile 我们其实只需要编译好的nginx的二进制文件 
[root@server3 docker]# docker build -t nginx:v4 . 
#很快:安装包完全使用缓存
[root@server3 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v4                  b218a266197d        5 minutes ago       144MB
nginx               v3                  49349f668909        About an hour ago   253MB
nginx               v2                  d21df066fe46        About an hour ago   272MB
nginx               v1                  6baf2165c143        2 hours ago         295MB
ubuntu              latest              3556258649b2        2 weeks ago         64.2MB
busybox             latest              db8ee88ad75f        3 weeks ago         1.22MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server3 docker]# cat dockerfile 
FROM rhel7:latest as build
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.9
####以上只是一个桥梁

FROM rhel7:latest #基于rhel7的基础镜像
EXPOSE 80
MAINTAINER dd@westos.org
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx #从上一层的构建中拷贝
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

那我们有没有办法去减小基础镜像
https://github.com/search?utf8=%E2%9C%93&q=distroless&type=
谷歌为我们提供了非常精简的镜像

几个命令

其实和一里面差不多

docker ps -a
# -a会显示所有状态的容器,可以看到,之前鹅的容器已经退出了,状态为exited
# 但是“一闪而过”的容器通常不是我们想要的结果,我们希望容器能够保持running状态,这样才能被我们使用

#让容器长期运行
如何让容器保存运行呢?
因为容器的生命周期依赖于启动时执行的命令,只要该命令不结束,
容器也就不会退出
[root@foundation0 ~]# docker run ubuntu /bin/bash -c 'while true;do sleep 1;done'
#while语句让bash不会退出,可以打开另一个终端查看容器的状态
[root@foundation0 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
737a0cd00a9b        ubuntu              "/bin/bash -c 'whi..."   12 seconds ago      Up 12 seconds                           focused_swartz

##通过while启动的容器虽然能够保持运行,但实际上没有干什么有意义的事情,
#容器常见的用途是运行后台服务

##--name指定容器的名字
[root@foundation0 ~]# docker run --name "my_http_server" -d httpd

#为一个镜像打另一个标签
docker tag 860c279d2fec runoob/centos:dev

#当然,如果只是为了查看启动命令的输出,可以使用docker logs命令
docker logs -f c72e8ee26615
#  -f的作用与tail -f 类似,能够持续打印输出
'按用途容器大致可分为两类:服务类容器和工具类容器
	服务类容器以daemon的形式运行,对外提供服务,
	比如web server,数据库等,通过-d以后台方式
	启动这类容器是非常合适的,如果要排查问题,
	可以通过exec -it进入容器
	
	工具类容器通常能给我们提供一个临时的工作环境,
	通常以run -it方式运行'