Docker的镜像创建及数据管理

Docker镜像的创建

Docker镜像除了是Docker的核心技术之外也是应用发布的标准格式。一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用程序,如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。
镜像的生方式分为三种,分别为基于已有镜像创建、基于本地模板创建以及基于dockerfile创建。

基于已有镜像创建

基于已有镜像创建主要使用docker commit 命令。实质上是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
在创建新的镜像时,首先第一步是启动镜像,在容器中做修改,最后将修完之后的容器提交为新的镜像,这里我是实验演示,所以就没有进去容器进行修改。

docker commit -m "new" -a "nginx1" ac3b61096300 nginx1:test

常用选项介绍:

  • m:说明信息
  • a:作者信息
  • p:生成过程中停止容器的运行

基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可从OPENVZ开源项目下载
示例:
使用docker命令将下载的debian模板压缩包导入为本地镜像

下载debian压缩包

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

生成镜像

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:latest

基于Dockerfile创建镜像

Dockerfile是由一组指令组成的文件,其中每条指令对应的Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。Dockerfile结构大致分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用"#"号开头的注释。
在编写Dockerfile时,有严格的格式需要遵循:

  • 第一行必须使用FROM指令指明所基于的镜像名称
  • 第二行使用MAINTAINER指令说明维护该镜像的用户信息
  • 接下来是镜像操作相关指令,如RUN指令,每运行一条,都会给基础镜像添加新的一层
  • 最后使用CMD指令,来指定启动容器时要运行的命令操作

Dockerfile创建操作指令及含义

指令 含义
FROM镜像 指定新镜像所所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 说明新镜像的维护人信息
RUN命令 在所基于的镜像上执行命令,并提交到新的镜像中
CMD命令 指定启动容器时要于运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条,则只有最后一条被执行
EXPOSE端口号 指定新镜像加载到Docker时要开启的端口
ENV环境变量 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD源文件/目录 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY源文件/目标 目标文件/目录 将本地主机上的源文件/目录复制到目标地点,源文件目录要与Dockerfile在相同的目录中
VOLUME["目录"] 在容器中创建一个挂载点
USER用户名/UID 指定运行容器时的用户
WORKDIR路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令

示例:
创建一个web网站(httpd)镜像,以centos作为基础镜像

建立工作目录

mkdir apache
cd apache

创建并编写Dockerfile文件

vim Dockerfile

#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER The porject <[email protected]>
#镜像操作指令安装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/*                          //清理httpd缓存
exec /usr/sbin/apachectl -D FOREGROUND       //启动httpd服务

创建测试首页

echo "this is apache test web" > index.html

使用Dockerfile生成镜像

docker build -t httpd:centos .    //最后又一个空格和“.”不要遗忘,选项-t指定镜像的标签信息

使用新镜像运行容器

docker run -d -p 1234:80 httpd:centos    //-p选项实现从本地1234端口到容器中80端口的映射

运行镜像报错解决


docker服务启动时定义的自定义链DOCKER由于某种原因被清掉重启docker服务即可重新生成自定义链DOCKER

systemctl restart docker.service

使用浏览器访问

本地私有仓库的建立

下载registry镜像

docker pull registry

在/etc/docker目录下创建json文件

vim /etc/docker/daemon.json
{ "insecure-registries":["172.16.10.22:5000"]}

重启docker服务

systemctl restart docker.service

创建registry容器

docker create -it registry /bin/bash

启动容器

docker start 5f817c015faa

挂载宿主目录

将本地目录挂载到容器仓库的默认存储地址中,这样即使容器被删除,镜像还是会有保存。

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
//宿主机的/data/registry挂载容器中的/tmp/registry 宿主机中的目录会自动创建

重命名镜像

docker tag nginx 172.16.10.22:5000/nginx

上传镜像到本地仓库

docker push 172.16.10.22:5000/nginx

获取私有仓库列表

curl http://172.16.10.22:5000/v2/_catalog

Docker数据管理

管理Docker容器中数据主要有两种方式:数据卷和数据卷容器

数据卷

数据卷是一个共容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。

创建数据卷

在docker run命令中使用-v 选项可以在容器中创建数据卷。多次使用-v可以创建多个数据卷。使用--name选项可以为容器创建一个简单的自定义名称

docker run -d -v /data1 -v /data2 --name web nginx:latest

挂载主机目录作为数据卷

在容器数据卷中创建文件,在本地文件夹中可见,同样的在本地文件夹中创建文件,容器中仍可见,实现了从宿主机到容器,容器到宿主机的数据迁移。

docker run -v /var/www:/data --name web1 -it nginx /bin/bash   //主机目录不存在时会自动创建

数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提够数据卷给其他容器使用。首先需创建一个容器作为数据卷容器,之后再创建时使用--volumes-from挂载数据卷容器中的数据卷使用。
之前创建好的数据卷容器web,其中所创建的数据卷分贝挂载在了/data1和/data2目录上,创建新容器来挂载数据卷容器中的数据卷。

docker run -it --volumes-from web --name db1 nginx /bin/bash

原文地址:http://blog.51cto.com/13643643/2159155

时间: 2024-10-05 01:34:25

Docker的镜像创建及数据管理的相关文章

Docker基本控制命令(资源控制、数据卷及数据卷容器、镜像创建、端口映射、私有仓库)

一.资源控制 1.CPU使用率控制 限制该镜像本次建立的容器最大只能占总资源的10% docker run --cpu-quota 10000 centos 2.按比例分配 创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为33.3%和66. 7% docker run -itd --name c1 --cpu-shares 512 centos(镜像名)docker run -itd --name c2 --cpu-shares 1024 centos

docker通过模板创建镜像以及容器、仓库和数据管理

笔记内容:docker通过模板创建镜像以及容器.仓库和数据管理笔记日期:2018-02-05 25.5 通过模板创建镜像 25.6 容器管理 25.7 仓库管理 25.8 数据管理 25.5 通过模板创建镜像 1.既然是通过模板创建镜像,那么首先肯定得先下载一个模板,地址如下: http://openvz.org/Download/templates/precreated 打开以上网址选择一个模板进行下载,我这里下载的是centos-6-x86-minimal.tar.gz (signature

Docker中通过模板创建镜像,Docker容器、仓库及数据管理

1.通过模板创建镜像 (1)首先去下载一个模板 http://openvz.org/Download/templates/precreated //下载速度不快,阿铭下载了一个centos6的模板centos-6-x86-minimal.tar.gz (2)导入该镜像的命令为: cat centos-6-x86-minimal.tar.gz|docker import - centos6 (3)查看导入的镜像 docker images (4)导出镜像: 把现有镜像,导出为一个文件: docke

Docker 镜像创建、私有仓库搭建和数据管理

Docker 镜像的创建方法 Docker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式.一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像. 创建镜像的三种方法 : 基于已有的镜像创建 基于本地模板创建 基于 Dockerfile 创建 (推荐) 基于已有的镜像创建

ubuntu16创建docker基础镜像

通过Dockerfile创建镜像时,一般都是基于 Docker Hub 提供的官方镜像.以下介绍在ubuntu16系统上创建个人私有基础镜像的方法. 1.安装Bootstrap工具debootstrap $ sudo apt-get insall debootstrap -y 2.使用debootstrap下载ubuntuxenial(16.04)二进制文件 $ sudo debootstrap xenial xenial 3.使用docker import命令创建基础镜像 1)导入xenial

安装docker并使用默认镜像创建一个容器

1.安装docker 命令:yum install –y docker-i 错误解决:如果device-mapper-libs 这个docker依赖包版本太低.可以直接执行yum upgrade device-mapper-libs升级一下这个依赖包 2.Docker装好后,默认自动启动或使用命令启动:service docker start 3.查看版本:  docker –v  来查看当前装的docker版本 4.查看当前所有镜像: docker 安装好后,有个默认cento63镜像,可以选

docker学习之二镜像创建

继上一篇docker入门之后写一点使用的经验. 通过命令:docker run -it REPOSITORY或IMAGE ID   注:-it后面跟的字段可以通过下面指令获得 创建运行的容器,会进入一个伪终端,如果使用ctrl+D或者使用exist命令来退出伪终端,会造成容器也终止运行.正确推出伪终端的姿势是:ctrl+P之后再按ctrl+q   这样就能把伪终端与容器分离了. Ps:到现在为止可以自己粗略自己发现一些命令了,使用docker --help可以查看到一些命令.其中attach的功

Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "[email protected]" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /

docker镜像创建

关于docker镜像的构建有四种形式:     官方下载    dockerfile创建    yum安装    容器commit生成 作为比较核心的东西,镜像的好坏直接影响docker的使用体验 首先说下四种方式的区别: ①官方下载就是docker pull 自己需要的镜像,当然这个是按照镜像的名字去下载,这里就有一个问题,别人写的镜像跟自己的需求不一定是完全吻合的. ②然后是dockerfile写镜像,这个是在官方镜像的基础上去添加自己想要的东西,构成自己的镜像,个人感觉是一种折中的方案.但