文章目录
- 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方式运行'