###Docker镜像的分层结构####

  • 共享宿主机的kernel(内核)
  • base镜像提供的是最小的Linux发行版
  • 同一docker主机支持运行多种linux发行版
  • 采用分层结构的最大好处:共享资源(节省本地空间占用)
[root@server2 ~]# docker images   #查看docker镜像信息
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server2 ~]# docker info  ##查看当前docker信息
Containers: 2Running: 0Paused: 0Stopped: 2
Images: 3
Server Version: 18.09.6
Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:Volume: localNetwork: bridge host macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:seccompProfile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.7MiB
Name: server2
ID: RKGE:ELZE:W545:SL7V:THN6:7KEP:FEZK:GX7S:3ZZQ:CVMQ:WJJH:CPK6
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
[root@server2 ~]# cd  /var/lib/docker  ##docker 数据存放路径(一般不要动哦!!)
[root@server2 docker]# ls
builder   containers  network   plugins   swarm  trust
buildkit  image       overlay2  runtimes  tmp    volumes

docker的所有指令

[root@server2 docker]# hostnamectl  主机的Static hostname: server2Icon name: computer-vmChassis: vmMachine ID: 044cd6e3cdb74146a641f5736767187fBoot ID: e8e9b887c7524ee49c8cf7d60fb9ab27Virtualization: kvmOperating System: Red Hat Enterprise Linux Server 7.3 (Maipo)CPE OS Name: cpe:/o:redhat:enterprise_linux:7.3:GA:serverKernel: Linux 3.10.0-514.el7.x86_64  #我的操作系统内核Architecture: x86-64
[root@server2 docker]# docker run -it --name vm1 ubuntu  #-it以交互式形式打开一个tty
root@90ac2b752f12:/# ls   ##ubantu的镜像
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr   ##ubantu的发行版根目录
root@90ac2b752f12:/# uname -r
3.10.0-514.el7.x86_64   ##内核和宿主机的一样

镜像分层的特点:

  • Copy-on-Write 可写容器层
  • 容器成以下所有镜像层都是只读的
  • docker从上往下一次查找文件(先看到容器层部分)
  • 容器层保存镜像变化的部分并不会对镜像本身有任何修改
  • 一个镜像最多127层 (层数越小越好)
1.如何修改镜像
[root@server2 docker]# docker run -it --name vm1 ubuntu
root@90ac2b752f12:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@90ac2b752f12:/# touch file{1..5}   ##在容器层创建文件(删除文件、修改文件),不会影响镜像层
root@90ac2b752f12:/# ls
bin   dev  file1  file3  file5  lib    media  opt   root  sbin  sys  usr
boot  etc  file2  file4  home   lib64  mnt    proc  run   srv   tmp  var
root@90ac2b752f12:/# rm -f file1
root@90ac2b752f12:/# ls
bin   dev  file2  file4  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  file3  file5  lib   media  opt  root  sbin  sys  usr

##镜像构建###

root@90ac2b752f12:/# ls
bin   dev  file1  file3  file5  lib    media  opt   root  sbin  sys  usr
boot  etc  file2  file4  home   lib64  mnt    proc  run   srv   tmp  var
root@90ac2b752f12:/# rm -f file1
root@90ac2b752f12:/# ls
bin   dev  file2  file4  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  file3  file5  lib   media  opt  root  sbin  sys  usr
[root@server2 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server2 docker]# docker ps -a  查看已经关闭的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
90ac2b752f12        ubuntu              "/bin/bash"         23 minutes ago      Exited (0) 22 seconds ago                       vm1
ddc369328a0f        rhel7               "bash"              2 hours ago         Exited (0) 2 hours ago                          vm4
4e03bbd9e419        rhel7               "bash"              2 hours ago         Exited (0) 2 hours ago                          vm3
[root@server2 docker]# docker  rm vm1  ##删除vm1
vm1
[root@server2 docker]# docker ps -a   ##vm1容器已没有
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
ddc369328a0f        rhel7               "bash"              2 hours ago         Exited (0) 2 hours ago                       vm4
4e03bbd9e419        rhel7               "bash"              2 hours ago         Exited (0) 2 hours ago                       vm3[root@server2 docker]# docker run -it --name vm1 ubuntu   ##运行镜像
root@49659e310412:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var   ##因为容器层没保存所以之前建立的数据都没了
boot  etc  lib   media  opt  root  sbin  sys  usr
root@49659e310412:/# [root@server2 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB[root@server2 docker]# docker history ubuntu:latest    #查看镜像构建历史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB


docker commit 方式构建:

[root@server2 ~]# docker load -i busybox.tar   ##导入busybox.tar镜像
8a788232037e: Loading layer   1.37MB/1.37MB
Loaded image: busybox:latest
[root@server2 ~]# docker images  ##查看镜像信息
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server2 ~]# docker run -it --name vm1 busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # vi testfile   #创建文件
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr[root@server2 ~]# docker start vm1
vm1
[root@server2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1a62311d09c3        busybox             "sh"                3 minutes ago       Up 6 seconds                            vm1
[root@server2 ~]# docker attach vm1
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr
/ # [root@server2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server2 ~]# docker commit vm1 test:v1  #提交容器到镜像
sha256:e4de9ba8d4e4c9919778eac47674e0407841aa0ad3aecf4b550e1f31492a748e
[root@server2 ~]# docker images   #v1成为镜像层
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                v1                  e4de9ba8d4e4        12 seconds ago      1.15MB
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server2 ~]# docker images test   ##查看test镜像信息
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                v1                  e4de9ba8d4e4        30 seconds ago      1.15MB
[root@server2 ~]# docker history test:v1  ##查看镜像创建历史,可以看到v1在bustbox镜像基础上创建
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
e4de9ba8d4e4        52 seconds ago      sh       #看不到容器内的操作作(docker commit 提交无法审计)                                       33B
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB
[root@server2 ~]# docker history busybox:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB   [root@server2 ~]# docker rm -f vm1  ##-f 强制删除vm1容器
vm1
[root@server2 ~]# docker run -it --name vm1 test:v1   ##运行test:v1镜像
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      testfile  usr  ##由于之前已经保存数据在镜像,所有testfile不会丢失
/ # 


docker commit:注意构建;dockerfile自动构建也是基于docker commit的层层构建得出
Dockerfiile 方式构建:

[root@server2 ~]# mkdir docker  #创建一个dockerfile 构建目录(默认情况下会把当前目录的内容发送docker引擎作为构建引擎)
[root@server2 ~]# cd docker/
[root@server2 docker]# ls
[root@server2 docker]# pwd  ##尽量不要把目录建在根目录下(根目录下的数据比较多)
/root/docker
[root@server2 docker]# vim dockerfile
[root@server2 docker]# cat dockerfile
FROM busybox
RUN echo  'hello world'
[root@server2 docker]# docker build -t busybox:v2 .   ##'.' 表示当前目录构建内容加载到docker引擎, -t 指定镜像名称
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM busybox   ##基础镜像是busybox---> 59788edf1f3e
Step 2/2 : RUN echo  'hello world'   ##构建容器,我们在容器中运行的指令---> Running in e92d2e8fb8b3
hello world
Removing intermediate container e92d2e8fb8b3#删除临时容器的id---> 068533611022
Successfully built 068533611022
Successfully tagged busybox:v2  ##生成镜像层
[root@server2 docker]# docker history busybox:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB
[root@server2 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox           v2                  068533611022        10 minutes ago      1.15MB
test                v1                  e4de9ba8d4e4        About an hour ago   1.15MB
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB
[root@server2 docker]# docker history busybox:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
068533611022        10 minutes ago      /bin/sh -c echo  'hello world'                  0B             #可以看见指令  ,便于审计
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB
缓存特性():
[root@server2 docker]# vim dockerfile
[root@server2 docker]# cat dockerfile
FROM busybox
RUN echo  'hello world'
RUN echo testfile > file1
RUN echo testfile > file2
root@server2 docker]# docker build -t busybox:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM busybox---> 59788edf1f3e
Step 2/4 : RUN echo  'hello world'---> Using cache   ##运行过的cache 直接使用---> 068533611022
Step 3/4 : RUN echo testfile > file1---> Running in 4fee74ff45a5  #新建的会生成一个中间的容器
Removing intermediate container 4fee74ff45a5  ##运行后删除容器---> 7f213cefba57  #提交镜像层
Step 4/4 : RUN echo testfile > file2---> Running in e978b6309e99
Removing intermediate container e978b6309e99---> b794a5c7bc39
Successfully built b794a5c7bc39
Successfully tagged busybox:v3
[root@server2 docker]# docker history busybox:v3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
b794a5c7bc39        3 minutes ago       /bin/sh -c echo testfile > file2                9B
7f213cefba57        3 minutes ago       /bin/sh -c echo testfile > file1                9B
068533611022        20 hours ago        /bin/sh -c echo  'hello world'                  0B
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB        [root@server2 docker]# docker history busybox:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
068533611022        20 hours ago        /bin/sh -c echo  'hello world'                  0B
59788edf1f3e        9 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           9 months ago        /bin/sh -c #(nop) ADD file:63eebd629a5f7558c…   1.15MB
v2 和v3相比之前的两层都一样,每个run是一层,

###Dockerfile祥解###
dickerfile 常用指令:

  • FROM: 指定base镜像,如果本地不存在会从远程仓库下载(可以联网)
    MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)
  • COPY:把文件从build context复制到镜像
    支持两种形式:CPOY src dest和COPY [" src" ,"dest "]
    src必须指定build context中的文件或目录

    [root@server2 docker]# vim dockerfile
    

[root@server2 docker]# cat dockerfile
FROM busybox #FROM 制定base镜像
COPY testfile /tmp #cpoy testfile到 /tmp文件 后面可以加制定的文件名
[root@server2 docker]# echo testfile > testfile #创建文件,注意源文件一定要在构建目录中
[root@server2 docker]# ls
dockerfile testfile
[root@server2 docker]# docker run -it --name vm1 busybox:v1
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cd tmp/
/tmp # ls
testfile
/tmp #
[root@server2 docker]# docker rmi busybox:v1 #删除不用的容器
Untagged: busybox:v1
Deleted: sha256:fc63aa93b2b4eee339dd8c3bbb0e7fd79478e560ed8e75b002ce85efe03aa750
Deleted: sha256:6a60ed6c36d0159665b09d84b7a81564dc77

- ADD 用法与CPOY类似,不同的是src可以是归档压缩文件,文件会自动解压到dest也可以自动下载URL并拷贝到镜像
ADD html.tar /var/www
ADD http://ip/html.tar /var/www
- ENV 设置环境变量(定义主机名...),变量可以被后续的指令(CMD结合)使用
ENV HOSTNAME server1.example.com

[root@server2 docker]# ls
dockerfile nginx-1.15.8.tar.gz
[root@server2 docker]# vim dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.8.tar.gz /tmp
[root@server2 docker]#
[root@server2 docker]# echo testfile > testfile
[root@server2 docker]# ls
dockerfile nginx-1.15.8.tar.gz testfile
[root@server2 docker]# docker build -t test:v1 .
Sending build context to Docker daemon 1.032MB
Step 1/3 : FROM busybox
—> 59788edf1f3e
Step 2/3 : COPY testfile /tmp
—> 7fa33b685481
Step 3/3 : ADD nginx-1.15.8.tar.gz /tmp
—> e986dbe19784
Successfully built e986dbe19784
Successfully tagged test:v1
[root@server2 docker]# docker run -it --name vm1 test:v1
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cd tmp/
/tmp # ls
nginx-1.15.8 testfile #查看到有nginx的解压包
/tmp # cd nginx-1.15.8/
/tmp/nginx-1.15.8 # ls
CHANGES LICENSE auto configure html src
CHANGES.ru README conf contrib man

- EXPOSE  如果容器中运行应用服务,可以把端口暴露出去;

[root@server2 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 e986dbe19784 2 hours ago 7.32MB
busybox latest 59788edf1f3e 9 months ago 1.15MB
game2048 latest 19299002fdbe 2 years ago 55.5MB
ubuntu latest 07c86167cdc4 3 years ago 188MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140MB
[root@server2 docker]# docker history game2048:latest
IMAGE CREATED CREATED BY SIZE COMMENT
19299002fdbe 2 years ago /bin/sh -c #(nop) CMD ["/bin/sh" “-c” "sed … 0B
2 years ago /bin/sh -c #(nop) EXPOSE 80/tcp #暴露镜像内部的应用所监听的端口方便作端口映射 0B
2 years ago /bin/sh -c #(nop) COPY dir:cb74e9c037a3d501c… 600kB
2 years ago /bin/sh -c #(nop) MAINTAINER Golfen Guo <go… 0B
2 years ago /bin/sh -c #(nop) CMD [“nginx” “-g” "daemon… 0B
2 years ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0B
2 years ago /bin/sh -c #(nop) COPY file:d15ceb73c6ea776c… 1.1kB

- VOLUME 申明数据卷,通常指应用的数据挂载点:
VOLUME [ "/var/www/html"]
  • VOLUME 申明数据卷,通常指应用的数据挂载点:
    VOLUME [ “/var/www/html”]
    -WORKDLIR 为RUN,ENTRYPOINT,ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动建立
[root@server2 docker]# docker run -it --name vm1 test:v1
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
[root@server2 docker]# vim dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.8.tar.gz /tmp
VOLUME ["/data"]  ##/data目录在容器本没有
[root@server2 docker]# vim dockerfile
[root@server2 docker]# cat dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.8.tar.gz /tmp
VOLUME ["/data"]
[root@server2 docker]# docker run -it --name vm3 test:v2  ##运行容器
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var   ##自动新建,按装docker的宿主机上
/ #   # ctrl+pq  退出但依旧运行
[root@server2 docker]# docker inspect vm3"Source": "/var/lib/docker/volumes #在封装时申明了数据卷,容器启动是dicker引擎会自动在本地生成数据目录并挂到容器内的数据挂载点/c3e66b8a21fdde6b5ee7b5b969c0e9de7c3765921f30736e58707bfdc3cc51fe/_data","Destination": "/data","Driver": "local",
[root@server2 docker]# cd /var/lib/docker/volumes  /c3e66b8a21fdde6b5ee7b5b969c0e9de7c3765921f30736e58707bfdc3cc51fe/_data  ##此时容器内往/data操作也就是在该目录中操作
[root@server2 _data]# touch file1[root@server2 _data]# pwd
/var/lib/docker/volumes/c3e66b8a21fdde6b5ee7b5b969c0e9de7c3765921f30736e58707bfdc3cc51fe/_data
[root@server2 _data]# docker attach vm3
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # cd data/
/data # ls
file1
/data # rm -fr file1
/data # touch file2
/data # read escape sequence
[root@server2 _data]# cd /var/lib/docker/volumes/c3e66b8a21fdde6b5ee7b5b969c0e9de7c3765921f30736e58707bfdc3cc51fe/_data
[root@server2 _data]# ls
file2
手动指定数据卷
[root@server2 ~]# docker run -it --name vm4 -v /opt/data:/data test:v2  #-v 挂接数据卷,“:”前是宿主机上的路径(没有的话会自动新建),之后的是容器内的路径
/ # cd data/
/data # touch file1
/data # touch file2
/data # touch file3
[root@server2 ~]# cd /opt/data/   #自动存储在宿主机的指定位置,不指定的时候docker自动分配挂在点
[root@server2 data]# ls
file1  file2  file3
  • WORKDLIR 为RUN,ENTRYPOINT,ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动建立(相当于cd,但可自动创建目录)

  • RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包:
    RUN yum install -y vim (每个run 都会多一层)

  • CMD和ENTRRYPOINT 这两个指令都用于设置容器启动后执行的命令,但CMD会被docker run 后面的命令覆盖,而ENTRYPOINT不会被忽略,一定会执行。
    docke run后面的参数可以传递给ENTRYPOINT指令当作参数;
    Dockerfile中只能指定一个ENTRYPOINT,如果指定多个,只有最后一个有效

-Shell和exec格式的区别:
#cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo “hello,$name”

Shell 格式底层会调用/bin/sh -c来执行命令,可以解析变量,而ecec格式不会:
#cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", “hello, n a m e &quot; ] 调 用 变 量 的 话 : F R O M b u s y b o x E N V n a m e w o r l d E N T R Y P O I N T [ &quot; / b i n / s h &quot; , &quot; − c &quot; , &quot; e c h o h e l l o , name&quot;] 调用变量的话: FROM busybox ENV name world ENTRYPOINT [&quot;/bin/sh&quot;,&quot;-c&quot;, &quot;echo hello, name"]调用变量的话:FROMbusyboxENVnameworldENTRYPOINT["/bin/sh","−c","echohello,name”]

shell方式:
[root@server2 docker]# docker build -t test:v1 .  #构建容器
Sending build context to Docker daemon  1.032MB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : ENV name world---> Running in 531dcf97954b
Removing intermediate container 531dcf97954b---> 171917472c12
Step 3/3 : ENTRYPOINT echo "hello,$name"---> Running in 176f9b4a07f1
Removing intermediate container 176f9b4a07f1---> aac161403dbc
Successfully built aac161403dbc
Successfully tagged test:v1
[root@server2 docker]# docker run  --rm test:v1  #--rm 表示本次运行之后就会自动删除
hello,world
[root@server2 docker]# cat dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello,$name"  #$name 被解析
[root@server2 docker]#
exec模式:
[root@server2 docker]# vim dockerfile
[root@server2 docker]# docker build -t test:v1 .
Sending build context to Docker daemon  1.032MB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : ENV name world---> Using cache---> 171917472c12
Step 3/3 : ENTRYPOINT ["/bin/echo", "hello,$name"]---> Running in 8d560ac187a9
Removing intermediate container 8d560ac187a9---> 1e6e19156aa2
Successfully built 1e6e19156aa2
Successfully tagged test:v1
[root@server2 docker]# docker run  --rm test:v1
hello,$name   #变量不会被解析
[root@server2 docker]# cat dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", "hello,$name"]EXEC调用变量的写法:
[root@server2 docker]# vim dockerfile
[root@server2 docker]# docker build -t test:v1 .
Sending build context to Docker daemon  1.032MB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : ENV name world---> Using cache---> 171917472c12
Step 3/3 : ENTRYPOINT ["/bin/sh","-c", "echo hello,$name"]---> Running in a695adb33f72
^[[ARemoving intermediate container a695adb33f72---> 20779a8060c0
Successfully built 20779a8060c0
Successfully tagged test:v1
[root@server2 docker]# docker run  --rm test:v1
hello,world
[root@server2 docker]# cat dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh","-c", "echo hello,$name"]

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

FROM busybox
ENTRYPOINT ["/bin/echo", “ hello"]
CMD [“world”]

[root@server2 docker]# vim dockerfile
[root@server2 docker]# docker build -t test:v1 .
Sending build context to Docker daemon  1.032MB
Step 1/3 : FROM busybox---> 59788edf1f3e
Step 2/3 : ENTRYPOINT ["/bin/echo", "hello"]---> Running in 630bd1c4713b
Removing intermediate container 630bd1c4713b---> dc953ab1563a
Step 3/3 : CMD ["world"]---> Running in 6f8c56c21c79
Removing intermediate container 6f8c56c21c79---> c644bf42cf64
Successfully built c644bf42cf64
Successfully tagged test:v1
[root@server2 docker]# docker run  --rm test:v1
hello world
[root@server2 docker]# cat dockerfile
FROM busybox
ENTRYPOINT ["/bin/echo", "hello"]
CMD ["world"]
[root@server2 docker]# docker run  --rm test:v1 westos
hello westos

####镜像的优化#####
镜像优化:
1.选择最精简的镜像基础
2.减少镜像层数
3.清空镜像构建的中间产物
4.优化网络请求
5.尽量用构建缓存
6.使用多阶段构建镜像(1.把debug关闭,可以编译最小nginx;
2.把编译的过程放一个阶段,将编译后的二进制文件拷贝到新的镜像)

docker编译nginx

[root@server2 docker]# ls
dockerfile  nginx-1.15.8.tar.gz  testfile  yum.repo
[root@server2 docker]# vim dockerfile
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
ADD nginx-1.15.8.tar.gz /mnt
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.15.8
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]   ##编译的数据都在/usr/local/nginx/sbin/nginx下[root@server2 docker]# docker images rhel7
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v1                  9494759d5de4        2 minutes ago       325MB   ##编译的325MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB  #基础镜像

减少层数:

FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
ADD nginx-1.15.8.tar.gz /mnt
COPY yum.repo /etc/yum.repos.d/yum.repo
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && ./configure --prefix=/usr/local/nginx && make && make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server2 docker]# docker build -t rhel7:v2 .
[root@server2 docker]# docker images rhel7
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v2                  a0fc29e192b6        4 minutes ago       318MB  ##减少层数后
rhel7               v1                  9494759d5de4        26 minutes ago      325MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

清空镜像构建的中间产物

[root@server2 docker]# vim dockerfile
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
ADD nginx-1.15.8.tar.gz /mnt
COPY yum.repo /etc/yum.repos.d/yum.repo
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS=$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server2 docker]# docker build -t rhel7:v3 .
[root@server2 docker]# docker images rhel7
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v3                  a9b24470bc81        29 seconds ago      254MB
rhel7               v2                  a0fc29e192b6        16 minutes ago      318MB
rhel7               v1                  9494759d5de4        37 minutes ago      325MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

多阶段构建镜像

[root@server2 docker]# vim dockerfile
FROM rhel7 as build
ADD nginx-1.15.8.tar.gz /mnt
COPY yum.repo /etc/yum.repos.d/yum.repo
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS=$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server2 docker]# docker build -t rhel7:v4 .
[root@server2 docker]# docker images rhel7
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v4                  4c34cad083cc        32 seconds ago      141MB
rhel7               v3                  a9b24470bc81        10 minutes ago      254MB
rhel7               v2                  a0fc29e192b6        25 minutes ago      318MB
rhel7               v1                  9494759d5de4        About an hour ago   325MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

#####Docker镜像结构和镜像优化######相关推荐

  1. Docker容器搭建及Docker镜像结构和镜像优化

    Docker Docker 是一个开源的应用容器引擎 开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...

  2. Docker容器(配置+镜像建立及优化+镜像加速器制作)

    一.docker简介 Docker是管理容器的引擎. Docker为应用打包.部署平台,而非单纯的虚拟化技术 1.VM vs Container 2.传统虚拟机和容器的技术对比 3.容器是如何工作的 ...

  3. docker镜像的构建及Dockerfile的详解应用,镜像加速器,镜像优化

    docker镜像的构建及dockerfile的祥解应用 1.镜像的构建 1.1创建一个Dockerfile 1.2构建镜像 1.3查看镜像的分层结构 1.4镜像的缓存特性 2.Dockerfile详解 ...

  4. docker公共存储库_Docker入门(2)——镜像结构和私有镜像库

    前面一篇教程里面,我们操练了一下如何在一台服务器上实际安装和使用docker.接下来我们来讨论一下和镜像有关的话题. Docker镜像的分层结构 前面我们也提到过,docker在宿主机上面并不是以一个 ...

  5. Docker基础镜像操作系统基础镜像对比(参考官方文档),优化docker镜像

    目录: 一. 选择Docker基础镜像 操作系统基础镜像 1. busybox 2. Alpine 3. CentOS 4. Ubuntu 5. Debian 二.编程语言基础镜像 应用基础镜像 其它 ...

  6. Docker镜像瘦身与优化

    为什么在存储如此便宜的今天我们仍然需要对Docker镜像进行瘦身? 小镜像的优点 加速构建/部署.虽然存储资源较为廉价,但是网络IO是有限的,在带宽有限的情况下,部署一个1G的镜像和10M的镜像带来的 ...

  7. [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor

    目录 1.镜像(images) 1.1.Dockerfile:是制作镜像的文件 2.镜像结构原理 2.1.base 镜像 2.1.1.rootfs和bootfs 2.1.2.base 镜像提供的是最小 ...

  8. docker(四)镜像的大小优化

    镜像的大小优化与默认挂载 一.优化镜像 优化一:把不需要的命令丢入/dev/null 优化二:减少RUN构建 优化三:多阶段构建 优化四:使用更为轻量级的linux发行版 二.关于VOLUME 一.优 ...

  9. (转)Docker镜像结构原理

    以下内容转载自 https://blog.51cto.com/liuleis/2070461 第八篇:Docker镜像结构原理 base 镜像 base 镜像有两层含义: 不依赖其他镜像,从 scra ...

最新文章

  1. MUI H5+ APP 分享H5连接 通过scheme唤醒APP
  2. Chrome 开发工具指南——通过工作空间保存更改
  3. 批处理引擎MapReduce程序设计
  4. PyTorch实战福利从入门到精通之六——线性回归
  5. 第六章 访问ContentProvider共享数据
  6. 电子商务网站建设策划书_网站建设及推广的5大注意事项
  7. 金融评分卡项目—7.申请评分卡中的数据预处理和特征衍生
  8. python实现完整的求解给定列表中所有的平衡点问题,是所有的平衡点
  9. Dagum Gini Decomposition,Dagum基尼系数分解的python实例
  10. Vue.js:从安装到快速创建脚手架项目,解决刚创建完出现的parsing error:No Bable config file detected报错
  11. (八十一)探索hidl-gen使用及IWifi.hal 实现
  12. 图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
  13. 基于CIM的馈线建模和应用(论文学习)
  14. ENSP实验六——三层交换机+路由器
  15. 牛客网SQL大厂面试真题(二)
  16. sql之浅谈视图的作用
  17. Python玩家使用B站开源项目Real-CUGAN修复动漫图片、视频
  18. 2013年10月17日浙大ZJG听百度CEO李彦宏讲座
  19. 互联网环境下决策支持系统的发展变迁
  20. 【计算机图形学】OpenGl基础

热门文章

  1. Java设计模式 —— 组合模式(Composite)
  2. ios手机续航测试软件,iOS14.4.2续航测试:这6款旧iPhone升级续航时间缩短?
  3. 小马哥---高仿苹果6sp 主板型号W9200 V3.0新版机型刷机拆机图
  4. java手动切换成独立显卡_教你MacBook如何实现一键切换显卡
  5. 【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)
  6. @JsonFormat 24小时
  7. win7 SQL Server2014安装
  8. 字符串数组转译对象形式
  9. js鼠标移入移出显示与隐藏
  10. pycharm教程:如何在pycharm中安装软件包(超详细)