江湖浪人 发表于 2019-2-21 08:13:55

Docker镜像的创建方法与数据管理

Docker镜像的创建方法


[*]创建镜像的方法有三种,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile 创建。

1、基于已有镜像创建


[*]基于已有镜像创建主要使用Docker commit 命令。实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。

命令格式:docker commit [选项] 容器ID/名称 仓库名称:[标签]
常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行

[*]基于已有的httpd镜像来创建新的镜像;

> docker images               #查看镜像信息
>
> docker create -it httpd /bin/bash         #创建容器;可以不用运行
>
> docker ps -a                              #查看容器运行信息
>
> docker commit -m "new" -a "httpd01" fddb8d93d6a7 httpd01:test         #创建一个名为httpd01,标签为test 的新镜像
>
> docker images | grep httpd01            #查看新创建的镜像信息
http://i2.运维网.com/images/blog/201808/14/de4621f764426287beab188704539f7b.jpg

2、基于本地模板创建


[*]通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为http://download.openvz.org/template/precreated/。
[*]使用docker导入命令将下载的debin模板压缩包导入为本地镜像;

> wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz   #下载模板压缩包
>
> cat debian-7.0-x86-minimal.tar.gz | docker import - debin01:new                     #导入模板压缩包生成镜像
>
> docker images | grep new                                                            #查看新生成的镜像信息
3、基于Dockerfile 创建(推荐)


[*]Dockerfile是由一组指令组成的文件,其中命一条指令对应Linux中的命令,Docker程序将读取Dockerfile中的指令生成指定镜像。
[*]Dockerfile结构大致分为四大部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Docker每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释。
[*]在编写Dockerfile时,有严格的格式需要遵循:第一行必须使用FROM指令指明所基于的镜像名称;之后使用MAINTAINER指令说明维护镜像的用户信息;然后是镜像操作相关指令,如RUN指令,每一条都会给基础镜像添加新的一层;最后使用CMD指令,来指定启动容器时需要运行的命令操作。
[*]Docker操作指令:




header 1
header 2




指令
含义


FROM 镜像
指定新镜像所基于的镜像,第一条指令必须为FORM指令,每创建一个镜像就需要一条FROM指令


MAINTAINER名字
说明新镜像的维护人信息


RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中


CMD["要运行的程序","参数1","参数2"]
指定启动容器时要运行的命令或脚本,Dockerfile只能有一条CMD命令,如果指定多条则只执行最后一条


EXPOSE 端口号
指定新镜像加载到Docker时需要开启的端口


ENV 环境变量 变量值
设置一个环境变量的值,会被后面的RUN使用


ADD 源文件/目录 目标文件/目录
将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL


COPY 源文件/目录 目标文件/目录
将本地主机上的源文件/目标复制到目标地点,源文件/目录要与Dockerfile位于相同目录中


VOLUME ["目录"]
在容器中创建一个挂载点


USER 用户名/UID
指定运行容器时的用户


WORKDIR 路径
为后续的RUN、CMD、ENTRYPOINT 指定工作目录


ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所需要运行的命令



  mkdirapache             #创建工作目录
  cdapache
  vim Dockerfile            #编写Dockerfile文件


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


#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
  echo "this is web test" > index.html          #创建测试页面
  docker build -t httpd:centos .                #生成镜像(注意别忘了末尾有".")
  docker run -d -p 49188:80 httpd:centos         #运行镜像;-p实现从本地端口49188到容器80端口的映射



[*]使用浏览器查看容器中Apache服务测试页;
http://i2.运维网.com/images/blog/201808/14/89edea9fcfcb1d97224e9caf5ef5f6c1.jpg

Docker镜像上传私有仓库

  docker pull registry
  vim /etc/docker/daemon.json               #创建一个json文件,否则在往自定义的私用仓库中上传镜像时,会报错


{"insecure-registries":["192.168.190.139:5000"]}       #本地IP地址和使用端口
  systemctl restart docker.service          #重启docker
  docker create -it registry /bin/bash      #创建registry容器
  docker ps -a                              #查看容器运行信息
  docker start 4748e2cce568               #启动容器
  docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry       #宿主机的/data/registry自动创建挂载容器中的/tmp/registry
  docker tag httpd 192.168.190.139:5000/test01          #更改标记为192.168.190.138:5000/test01
  docker push 192.168.190.139:5000/test01                                  #上传
  curl -XGET http://192.168.190.139:5000/v2/_catalog                        #获取私有仓库列表

http://i2.运维网.com/images/blog/201808/14/7e2b581eae09b80fd66f6e2dfed938b7.jpg

Docker 的数据管理

1、数据卷


[*]数据卷是一个共容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
[*]在docker run 命令中使用-v选项可以在容器内创建数据卷。多次使用-v选项可创建多个数据卷。使用--name 选项可以给容器创建一个友好的自定义名称。

  docker run-v /var/www:/data1 --name web1 -it httpd /bin/bash      #宿主机目录/var/www 挂载容器中的/data
  cd /data1               #cd到容器的挂载目录
  touch test01            #创建一个空文件
  exit                      #退出
  ls /var/www               #查看宿主机相对应的目录

http://i2.运维网.com/images/blog/201808/14/fea70d25d667e01b458239cc703aa4a8.jpg

2、数据卷容器


[*]数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。使用方法如下:首先,需创建一个容器作为数据卷容器,之后在其他容器创建时用 --volumes-from挂载数据卷容器中的数据卷使用。

  docker run --name web2 -v /data1 -v /data2 -it httpd /bin/bash       #数据卷容器
  docker run -it --volumes-from web2 --name db1 httpd /bin/bash      #新容器挂载数据卷容器web2



[*]在db1容器数据卷/data1中创建一个文件,在web2容器中的/data1目录中也可以看到。
http://i2.运维网.com/images/blog/201808/14/65a288af650dddaa347dd743ea86f41e.jpg



页: [1]
查看完整版本: Docker镜像的创建方法与数据管理