docker容器二

# docker run --name dd1 -it --rm -v /data/bb2:/data busybox
/ #

Docker Data Volume (存储卷)

Docker镜像由多个只读层叠加而成,启动容器时,Docker会加 载只读镜像层并在镜像栈顶部添加一个读写层

如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版 本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即 “写时复制(COW)”机制

“卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件 系统,与宿主机上的某目录“绑定(关联)”

即使将容器删除,同步到宿主机上的数据也不会消失,保证数据的持久化。

Docker管理卷

Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同

1、Bind  mount  volume  (卷绑定到宿主机)

#docker run --name dd1 -it --rm -v /data/b2:data busybox  #创建一个容器,前面的路径为宿主机的路径,后面为容器的路径;两个位置的路径都不需要创建会自动生成的

/#

#docker inspect dd1  :用此命令可以查看容器的详细信息:(关连路径的详细信息)
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/data/b2",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

此时在容器路径下/data/创建数据,会自动同步到指定的宿主机/data/b2/路径下的。

2、Docker-managed volume (docker管理卷)

只需要指定容器里的目录,docker引擎会自动关连到宿主机上对应的路径位置,可以通过探测容器的详细信息来查询。

#docker run –name dd1 -it -v /data busybox    #只指定容器的路径
#docker inspect dd1     #查看具体关连到本地的路径的信息
 "Mounts": [
            {
                "Type": "volume",
                "Name": "5d3a55d03a0f1e17650300265d17c795ee7edfc587cd3569edbae856ba62efc9",
                "Source": "/var/lib/docker/volumes/5d3a55d03a0f1e17650300265d17c795ee7edfc587cd3569edbae856ba62efc9/_data",  #宿主机上目录的具体路径
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

此时在容器里/data/下创建数据,会自动同步到宿主机上的路径下的;有了脱离容器的持久状态。

两个docker容器共享一个卷

在同一个宿主机上
# docker run --name d1 -it --rm -v /data/b2:/data busybox
/ #
# docker run --name d2 -it --rm -v /data/b2:/app busybox
/ #
创建两个容器,指定相同的宿主机目录,容器的目录各不相同。此时,在宿主机/data/b2下创建一个文件,会同时同步到两个容器/data和/app目录下。

做一个基础的容器,在创建其他容器时,复制此文件的配置

# docker run --name base -it --rm -v /data/b2;/data busybox  #创建基础容器
/ # ifconfig  #查看网络
eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:03  
          inet addr:10.0.0.3  Bcast:10.0.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)/ # ls   #查看base容器的目录
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # 
# docker run --name nginx --network container:base -it --rm --volumes-from base busybox   #创建新容器nginx,网络和卷的关连设置都是基于base容器的
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:03  
          inet addr:10.0.0.3  Bcast:10.0.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # 
nginx容器的网络和卷设置和base容器的是一样的。

Dockerfil:制作镜像

大多从dockerhub上下载下来的容器镜像大多都不符合实际需求,许多配置参数都需要改动,比较麻烦,所以需要自己制作符合自己需求的容器镜像。

dockerfile的方式是讲应用的配置文件做成模板,每次运行一个镜像容器时,加载设定好的模板配置文件就可以实现对不同镜像的不同需求。

工作原理:在开启一个容器镜像时,不启动容器的主进程而是先开启另一个进程,读取模板配置文件里的参数,设定好容器主进程的个项环境变量参数,然后再打开容器的主进程。不通过去修改应用程序的配置文件,而是在启动程序时,给容器的应用传递环境变量(环境变量就存放在docker文件里)

FROM指令(指定制作镜像的基础镜像)

FROM指令是最重的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映射文件构建过程指定基准镜像,后续的指令运 行于此基准镜像所提供的运行环境。

实践中,基准镜像可以是任何可用镜像文件,默认情况下, docker build会在docker主机上查找指定的镜像文件,在其不存在 时,则会从Docker Hub Registry上拉取所需的镜像文件

如果找不到指定的镜像文件,docker build会返回一个错误信息

form 指定镜像的格式:

FROM <image>[:<tag>] :直接指定镜像名称
FROM <image>@<digest>   :指定镜像的哈希值;(防止在使用镜像时,被人在镜像里添加危害系统的代码)

LABEL(标签)

用于让镜像制作者提供本人的详细信息

LABEL:格式是键值数据对: LABEL maintainer= “magedu <[email protected]>”

COPY指令

用于docker宿主机复制文件至创建的新映像文件

Syntax  格式

COPY <src> … <dest>
COPY [“<src>”,… “<dest>”]  列表格式:前面多个源文件,后面一个目标文件夹
<src>:要复制的源文件或目录,支持使用通配符
<dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径;

注意:在路径中有空白字符时,通常使用第二种格式用引号。

文件复制的规则:

<src>必须是build上下文中的路径,不能是其父目录中的文件

如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身 不会被复制。不复制目录,只是将目录下的文件复制过去。

如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录 ,且必须以/结尾

如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

例如:copy index.html /data/web/html/  (仅复制一个文件到要启动容器的目录下,容器的目录如果不存在,系统会默认创建的,index.html文件的路径在当前目录下及和dockerfile文件在同一目录下)

被直接下载 并保存为<dest>/<filename>

如果<src>是一个本地系统上的压缩格式的tar文件,它将被自动展开为一个目录 ,其行为类似于“tar -x”命令;然而通过URL网络上获取到的tar文件将不会自动 展开;

如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结 尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内 容将被直接写入到<dest>;

WORKDIR 指令   (指定容器的路径)

在使用copy和add命令时,用于指定容器的路径。

用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录

Syntax ɰ WORKDIR <dirpath> l 在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过 ,其是相对此前一个WORKDIR指令指定的路径 l 另外,WORKDIR也可调用由ENV指定定义的变量 ɰ 例如 l WORKDIR /var/log l WORKDIR $STATEPATH

例如:

WORKDIR /usr/local/src     (先指定好容器的路径)
ADD nginx-1.15.2.tar.gz ./   (引用时只写当前路径就可以了)

VOLUME指令 (卷的挂载)

用于在image中创建一个挂载点目录,以挂载Docker host上的卷或 其它容器上的卷

Syntax  格式

VOLUME <mountpoint>
VOLUME [“<mountpoint>”]

如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂 载完成后将此前的所有文件复制到新挂载的卷中

例如:

VOLUME /data/mysql (前面路径为容器里的路径,后面宿主机的目录路径不指定会自动创建的,也可以自定义的指定)

这样就实现了将容器里的/data/mysql/  目录直接就挂载到了宿主机上了。

EXPOSE 指令  (暴露端口)

用于为容器打开指定要监听的端口以实现与外部通信;只能指定自己暴露的端口,不能指定自己的IP地址。需要动态绑定到宿主机上的所有地址和随机端口,因为本机到底是运行在哪个主机上不确定,且宿主机的哪个端口空闲也是不确定的,所以是随机指定的。

Syntax

EXPOSE <port>[/<protocol>] [<port>[/<protocol>] …]
<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
EXPOSE指令可一次指定多个端口,例如
EXPOSE 11211/udp 11211/tcp

只写在此文件里,是不会暴露的,只有在docker run 运行时添加-P选项就会读取此文件里的暴露的配置内容,为了防止安全才这样做。

ENV指令(定义容器的环境变量)

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其 后的其它指令(如ENV、ADD、COPY等)所调用

调用格式为$variable_name或${variable_name}

dockerfile里的变量:
${variable:-word} 当变量有值时,使用原变量的值,如果没有给与变量赋值,则使用-号后面的值。
${variable:+word} 和上述变量相反,当变量有值时,使用+后面的值,变量没有值时,就没有值了

Syntax  格式

ENV <key> <value>
ENV <key>=<value> …

第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分 ,因此,一次只能设置一个变量;

第二种格式可用一次设置多个变量,每个变量为一个”<key>=<value>”的 键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,也可通过 对<value>加引号进行标识;另外,反斜线也可用于续行

定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能

RUN指令

用于指定docker build过程中运行的程序,其可以是任何命令,但在基础镜像里需要有相对应的命令,否则也无法运行。

Syntax  格式

 RUN <command>
 RUN [“<executable>”, “<param1>”, “<param2>”]

第一种格式中,<command>通常是一个shell命令,且以“/bin/sh -c”来运行它, 这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用 docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号;

第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的 命令,后面的<paramN>为传递给命令的选项或参数;然而,此种格式指定的命 令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,* 等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将 其替换为类似下面的格式。

RUN [“/bin/bash”, “-c”, “<executable>”, “<param1>”]

CMD指令  (定义镜像文件启动为容器时 将定义的程序运行为容器的主程序;如果此程序结束容器也会跟随者结束)

类似于RUN指令,CMD指令也可用于运行任何命令或应用程序, 不过,二者的运行时间点不同

RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile 构建出的新映像文件启动一个容器时

CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运 行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的 命令行选项所覆盖

在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效

Syntax
CMD <command>
CMD [“<executable>”, “<param1>”, “<param2>”]
CMD [“<param1>”,”<param2>”]

前两种语法格式的意义同RUN

第三种则用于为ENTRYPOINT指令提供默认参数

ENTRYPOINT指令

类似CMD指令的功能,用于为容器指定默认运行程序,从而使得 容器像是一个单独的可执行程序

与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命 令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传 递给ENTRYPOINT指定指定的程序

不过,docker run命令的–entrypoint选项的参数可覆盖ENTRYPOINT指令,指定的程序Syntax 格式

例1:创建镜像(copy命令复制单个文件到容器目录下)

#mkdir imge1   #创建一个文件夹
#cd imge1/     #进入到此文件夹下
#vim Dockerfile  #创建一个dockerfie文件,注意创建的文件开头字母要大写
 #Description test image  #描述信息
  FROM busybox:latest      #基于什么镜像来制作
 MAINTAINER “magedu <[email protected]>”   #指定镜像制作的人的信息
 #LABEL maintainer= “magedu <[email protected]>”   #注释信息,新的指令用法
 copy index.html /data/web/html/    #需要在imge1目录下创建一个index.html文件
#vim index.html
 hello world! 
#cd ~
# docker build
-t httpd:1.1 imge1/ #制作镜像 (httpd为自定义的仓库名;1.1为标签版本号;imge1/:为dockerfile文件的父目录。) Sending build context to Docker daemon 3.072kB Step 1/3 : FROM busybox:latest ---> e1ddd7948a1c Step 2/3 : MAINTAINER "magedu <[email protected]>" ---> Running in 439d3cb17fc3 Removing intermediate container 439d3cb17fc3 ---> 8c513ec7b848 Step 3/3 : copy index.html /data/web/html/ ---> ec188d98a1a3 Successfully built ec188d98a1a3 Successfully tagged httpd:1.1 # docker image ls #查看本地镜像已生成新的文件 REPOSITORY TAG IMAGE ID CREATED SIZE httpd 1.1 ec188d98a1a3 23 seconds ago 1.16MB 基于上面制作的镜像文件来开启一个容器: #docker run –name hhh -it –rm httpd:1.1 #交互式的方式登陆进去查看dockerfile里复制到容器里的文件是否复制过去 / # cd /data/web/html/ /data/web/html # ls index.html

例2:创建镜像(copy命令复制目录下的多个文件到容器目录里)

#cd /root/imae1/
~/imge1]# cp -r /etc/yum.repos.d .  #复制/etc/yum.repos.d目录到 /root/imae1/目录下
~/imge1]# ls
Dockerfile  index.html  yum.repos.d
~/imge1]# vim Dockerfile 
#Description test image
FROM busybox:latest
MAINTAINER "magedu <[email protected]>"
#LABEL maintainer= "magedu <[email protected]>"
copy index.html /data/web/html/
copy yum.repos.d /etc/yum.repos.d/
其中yum.repos.d为目录。复制过去不复制目录,只复制目录下的文件,另外dockerfile文件里命令如果能写一行不要分两行来写,因为每一行都在运行容器时都是一层封装。
 ~/imge1]# docker build -t httpd:1.2 /root/imge1/
Sending build context to Docker daemon  20.48kB
Step 1/4 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/4 : MAINTAINER "magedu <[email protected]>"
 ---> Using cache
 ---> 8c513ec7b848
Step 3/4 : copy index.html /data/web/html/
 ---> Using cache
 ---> ec188d98a1a3
Step 4/4 : copy yum.repos.d /etc/yum.repos.d/
 ---> 5c6a8e8dbe66
Successfully built 5c6a8e8dbe66
Successfully tagged httpd:1.2
 ~/imge1]# docker run --name hhh -it --rm httpd:1.2
/ # cd /etc/yum.repos.d/   #以第二版本的镜像开启一个容器,查看是否将目录下的文件复制过去
/etc/yum.repos.d # ls
back       base.repo
/etc/yum.repos.d # ls
back       base.repo
/etc/yum.repos.d # cd /data/web/html/
/data/web/html # ls
index.html

例3:创建镜像(add命令下载网络上tar格式的文件和下载本地的tar格式的文件)

找一个网络上的tar格式的包,复制其url的路径http://nginx.org/download/nginx-1.12.2.tar.gz

#cd /root/imae1/
~/imge1]# vim Dockerfile 
#Description test image
FROM busybox:latest
MAINTAINER "magedu <[email protected]>"
ADD http://nginx.org/download/nginx-1.12.2.tar.gz /usr/local/src/下载到容器上的路径
[root@centos7 ~/imge1]# cd
[root@centos7 ~]# docker build -t httpd:1.3 /root/imge1/ 
Sending build context to Docker daemon  20.48kB
Step 1/3 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/3 : MAINTAINER "magedu <[email protected]>"
 ---> Using cache
 ---> 8c513ec7b848
Step 3/3 : ADD http://nginx.org/download/nginx-1.12.2.tar.gz /usr/local/src/
Downloading  981.7kB/981.7kB
 ---> 8e9c27dcb249
Successfully built 8e9c27dcb249
Successfully tagged httpd:1.3
[root@centos7 ~]# docker run –name kkk -it –rm httpd:1.3 
docker: invalid reference format.
See 'docker run --help'.
[root@centos7 ~]# docker run --name kkk -it --rm httpd:1.3 
/ # cd /usr/local/src
/usr/local/src # ls
nginx-1.12.2.tar.gz #未解压缩

网络上的url路径下载的tar格式的包不会自动将其解压缩

但如果将tar格式的包下载到宿主机上的目录下,使用add命令,会将其自动的解压缩。

wget http://nginx.org/download/nginx-1.15.2.tar.gz  先将文件下载到本地/root/imge1/下

 #cd /root/imge1/
 ~/imge1]# wget http://nginx.org/download/nginx-1.15.2.tar.gz 
--2018-08-05 14:45:09--  http://nginx.org/download/nginx-1.15.2.tar.gz
Resolving nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...
Connecting to nginx.org (nginx.org)|206.251.255.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1025746 (1002K) [application/octet-stream]
Saving to: ‘nginx-1.15.2.tar.gz’

100%[======================================>] 1,025,746   20.9KB/s   in 64s    

2018-08-05 14:46:14 (15.7 KB/s) - ‘nginx-1.15.2.tar.gz’ saved [1025746/1025746]
~/imge1]# vim Dockerfile 
#Description test image
FROM busybox:latest
MAINTAINER "magedu <[email protected]>"
ADD nginx-1.15.2.tar.gz /usr/local/src/
~/imge1]# docker build -t httpd:1.4 /root/imge1/ 
Sending build context to Docker daemon  1.047MB
Step 1/3 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/3 : MAINTAINER "magedu <[email protected]>"
 ---> Using cache
 ---> 8c513ec7b848
Step 3/3 : ADD nginx-1.15.2.tar.gz /usr/local/src/
 ---> 166b320352e0
Successfully built 166b320352e0
Successfully tagged httpd:1.4
 ~/imge1]# docker run --name kkk -it --rm httpd:1.4
/ # cd /usr/local/src/
/usr/local/src # ls
nginx-1.15.2  #解压缩

猜你喜欢

转载自www.cnblogs.com/yaun1498078591/p/9419133.html
今日推荐