Docker镜像创建+数据管理

一、概述

  • 在docker的整个使用过程中,进入一个已经定型的容器后可以在其中进行服务的安装;
  • 若要将已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。

二、docker镜像创建的三种方法

2.1、基于Dockerfile创建

Dockerfile简述:

  • Dockerfile是由一组指令组成的脚本文件,其中每条指令对应Linux中的一条指令,Docker程序将读取Dockerfile中的指令生成指定镜像。
  • Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

Docker镜像分层:

  • Dockerfile中的每个指令都会创建一个新的镜像层
  • 镜像层将被缓存和复用
  • 当Dockerfile的指令修改了,复制到文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
  • 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
  • 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

Dockerfile常用指令:
在这里插入图片描述
使用Dockerfile创建镜像并在容器中运行案例:

  • 建立生成的镜像的工作目录
[root@localhost ~]# mkdir /abc
[root@localhost ~]# cd /abc
  • 创建并编写Dockerfile文件
[root@localhost abc]# vim Dockerfile   
#基础镜像 
FROM centos:7
#用户信息
MAINTAINER this is apache
#基于基础镜像安装软件
RUN yum -y update
RUN yum -y install httpd
#开启端口
EXPORT 80
#复制首页到指定站点
ADD index.html  /var/www/html/index.html
#复制启动脚本到镜像
ADD run.sh  /run.sh
#设置run.sh执行权限
RUN chmod +x /run.sh
#启动容器执行操作
CMD ["/run.sh"]

  • 编写执行脚本内容
[root@localhost abc]# vi run.sh

#!/bin/bash
rm -rf /run/httpd/*     ##清理apache缓存
exec /usr/sbin/apachectl -D FOREGROUND   ##启动apache服务
  • 创建测试页面
[root@localhost abc]# echo "this is apache" > index.html
[root@localhost abc]# ls
Dockerfile  index.html  run.sh

  • 生成镜像
[root@localhost abc]# docker build -t httpd:centos .

  • 将生成的镜像加载到容器中运行
[root@localhost abc]# docker run -d -p 1234:80 httpd:centos 
055f0135a310c085e70547c3702db51f018eedd9011c99e3ac772c486fd20a89
[root@localhost abc]# docker ps -a      ##查看容器此时为up状态
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
055f0135a310        httpd:centos        "/run.sh"           3 minutes ago       Up 3 minutes        0.0.0.0:1234->80/tcp   gifted_feynman

  • 查看当前当前主机ip,并用转换的1234端口访问apache网页
[root@localhost abc]# ifconfig ens33 | sed -n '2p'| awk '{print $2}'     
192.168.5.130                  ###当前IP

在这里插入图片描述

2.2、基于已有镜像容器创建
  • 查看当前容器,只有一个
[root@localhost abc]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
055f0135a310        httpd:centos        "/run.sh"           29 minutes ago      Up 29 minutes       0.0.0.0:1234->80/tcp   gifted_feynman

  • 基于此容器创建名为docker:test的镜像
[root@localhost abc]# docker commit -m "new" -a "daoke" 055f0135a310 docker:test
sha256:a2f65aeee35780fd7d739110b4c8dc1dea2dffafe4a362b20e7e9a9f4d1236a2

[root@localhost abc]# docker images | grep docker
docker              test                a2f65aeee357        3 minutes ago       524MB
  • 同理将此镜像加载到容器中运行
[root@localhost abc]# docker run -d -p 5678:80 docker:test 
4ead41755cafe6cb82669b226f48360651b4641d878d64fd83d23dd66e13dcec
  • 用转换的5678端口访问apache

在这里插入图片描述

2.3、基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为http://openvz.org/Download/template/precreated

  • 下载模板
[root@localhost /]# wget https://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
  • 创建镜像
[root@localhost /]# cat debian-7.0-x86-minimal.tar.gz | docker import - centos:new
sha256:2dae7fc9961f510dc16d2a70bb26b221633a25d50e13429e2fcd010075d9edfd

[root@localhost /]# docker images | grep new
centos              new                 2dae7fc9961f        About a minute ago   215MB

三、docker数据管理

  • 在docker中,为了方便查看容器内产生的数据或者将多个容器中数据实现共享,就涉及到容器的数据管理操作;
  • 管理docker容器中的数据主要有两种方式:数据卷和数据卷容器
3.1、数据卷
  • 数据卷:挂载宿主系统的存储空间,实现宿主机和容器间数据共享
  • 使用-v选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机和容器之间的数据迁移

下载centos镜像

[root@localhost www]# docker pull centos

创建数据卷,挂载宿主机的/opt/test目录

[root@localhost ~]# docker run -v /opt/test:/data1 --name web1 -it centos /bin/bash

进入/data1数据卷中写入相关测试文件

[root@35f0e465d45e /]# cd /data1
[root@35f0e465d45e data1]# ls
[root@35f0e465d45e data1]# touch 1111.txt
[root@35f0e465d45e data1]# exit

返回宿主机查看/opt/test目录,发现文件1111.txt也存在

[root@localhost test]# ls /opt/test/
1111.txt  
3.2、数据卷容器
  • 数据卷容器:挂载容器里的存储空间,实现容器与容器间的数据共享

创建新容器web100

[root@localhost /]# docker run --name web100 -v /data2 -it centos /bin/bash

挂载数据卷容器web100到新容器web200中

[root@localhos /]# docker run -it --volumes-from web100 --name web200 centos /bin/bash

在数据卷容器web100的/data2中写入测试文件222.txt

[root@localhost test]# docker start  04b8d6b0a36c    ##启动web100容器
04b8d6b0a36c
[root@localhost test]# docker exec -it 04b8d6b0a36c /bin/bash
[root@04b8d6b0a36c /]# cd /data2/
[root@04b8d6b0a36c data2]# touch 222.txt
[root@04b8d6b0a36c data2]# exit
exit

进入web200容器中查看/data2目录,发现有222.txt文件,实现了数据共享

[root@localhost test]# docker start  83307d41f451     ###先启动容器
83307d41f451
[root@localhost test]# docker exec -it 83307d41f451 /bin/bash
[root@83307d41f451 /]# ls /data2/        
222.txt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值