2 Docker镜像的制作和使用说明

一、Docker镜像的分类

Docker镜像从来源,可以分为官方镜像和自制镜像。从制作方式不同又可分为自动生成镜像和定制镜像。本篇文章着重讲解镜像的各种制作和使用方法。

二、Docker镜像的制作

首先官方镜像不需要我们制作,直接pull来用就可以了,当安装Docker并启动了服务的linux机器能够连接互联网的时候,可以直接执行:

  • docker search 镜像名

系统自动会到docker的官方库里查找我们需要的镜像,根据列表和描述,我们可以选择需要的镜像下载到本机进行使用:

  • docker pull 镜像名

但有时候运行docker的电脑可能无法联网,如果想使用官方镜像,就只能通过导入镜像包的办法:

  1. 在一台能联网的docker机器上pull到你需要的镜像。
  2. docker image ls:查看这个镜像的名称。
  3. 执行docker save -o /存储目录 镜像名   将镜像名自动打包tar到存储目录。
  4. 把打包的镜像转存到需要导入的docker机器上。
  5. 执行docker load -i /存储目录   将镜像的tar包恢复到当前docker服务器上。
  6. 执行docker image ls 查看镜像是否恢复成功。

其次我们不使用官方提供的镜像,我们希望自己从无到有的制作一个镜像,这里有一个问题需要指出,任何想做成docker的应用,都必须依赖于操作系统,也就是如果你想提供PG数据库服务,则这个PG应用必须运行在docker的一个操作系统中,简言之就是操作系统是所有应用的基础。所以我们自己从无到有的制作镜像,首先要做一个操作系统镜像。

制作操作系统镜像的时候需要注意一个问题,要制作的镜像必须和当前的操作系统镜像一致,例如要制作一个基于CentOS7的Docker镜像,必须在CentOS7的操作系统上执行,因为制作过程中需要从本地的环境变量中拷贝内容到镜像里,所以如果系统不匹配,会造成错误。

下面以在linux7上制作linux7的docker image做简单说明:

制作Docker镜像需要安装的工具:

从 febootstrap-3.21-4.el6.x86_64.rpm开始,后续根据needby进行安装

 fakechroot-2.9-24.5.el6_1.1.x86_64.rpm

 fakechroot-libs-2.9-24.5.el6_1.1.x86_64.rpm

 fakeroot-1.12.2-22.2.el6.x86_64.rpm

 fakeroot-libs-1.12.2-22.2.el6.x86_64.rpm

 febootstrap-supermin-helper-3.21-4.el6_.x86_64.rpm

完成后执行febootstrap不再提示命令找不到,说明安装完成。

准备一个系统镜像源,如果能访问外网,可以直接找到对应系统的mirror iso,如果只有局域网或就像在本地执行,也可以临时搭建一个web应用,指向ISO的目录,例如:

 

 

在内网搭建了一个centos7的源镜像,并且保证linux能够访问到这个地址。

确保制作docker 镜像的计算机上安装了docker服务,并且正在运行。

使用root用户操作,在任意目录,例如/opt,执行:

febootstrap -i bash -i wget -i yum -i man -i vim -i openssh-server -i openssh-clients -i tar -i gzip  centos centos7 http://192.168.3.65/iso/

-i:表示镜像中要得到的功能包。

centos:表示创建的时centos的镜像。

centos7:会在当前目录下创建这个目录,系统自动把所有需要拷贝的内容复制到这个目录里。

url:获取ISO内容的位置,只能使用http协议的连接。

e 复制当前系统中root用户的bash的基本文件,到准备打包的目录centos7下。

cp /etc/skel/.bash* centos7/root/

将目录导入镜像

cd centos7 && tar -c .|docker import - centos7

 

检查生成的镜像

系统docker正在运行,直接docker image ls

 

 

可以看到刚刚制作的镜像已经在库里了。

 

然后,我们有了自己的镜像,在使用中可能需要在这个基础上做增加或修改,有两种方法可以实现:

第一种:在启动容器执行操作时,有一些当前的操作需要被记录成一层镜像,可以使用docker commit的方式。

  1. 被执行操作的容器正在运行,没有被stop。
  2. 在另一个终端使用docker ps,查看当前容器的ID。
  3. 在这个新终端上执行:docker commit --author "lming" --message "create user2" 容器ID 新镜像名:新标签
  4. 这样可以创建一个新的镜像,是在之前基础镜像上实时操作来的。

第二种:使用dockerfile定制镜像

作为一个以层存储作为实现方式的虚拟化手段,docker的没一次操作都会作为一个层进行记录,新的层会覆盖旧的层,并且旧层不再能修改,而实现生成镜像或生成层的最简单办法就是使用dockerfile,dockerfile类似一个脚本文件,有执行的步骤和命令,系统通过执行这些脚本,达到生成一个镜像的作用。本节所要讲的向镜像中拷贝本地文件和直接修改镜像内文件的内容,就是dockerfile里的功能。

先了解一下dockerfile

创建一个目录,例如mkdir newImage

cd newImage

vim dockerfile,编辑一个dockerfile内容如下:

FROM centos7:latest

RUN touch /opt/newfile \

        &&  echo 'This is my first img file .' \

         &&  cp -rf /opt/newfile /opt/oldfile

COPY localfile /opt/

--完成

FROM 表示当前再生成的镜像,是以centos7:latest这个镜像为基础。

RUN:RUN的操作时在镜像内部完成,实际就是在镜像内部执行一系列的bash操作,docker认为每个RUN就是一次生成过程,为了避免频繁的生成镜像浪费资源,我们把RUN的语句放在一起,使用\进行换行,使用&&表示连接。

COPY:COPY是dockerfile的功能,实现将本地文件拷贝到镜像内部制定目录的操作。

在dockerfile文件的所在目录创建一个文件touch localfile。

执行镜像生成

在dockerfile所在目录执行镜像生成

docker build -t centos:nv1 .

最后的"."很重要,"."表示当前目录,也就是在向镜像中拷贝文件时,时相对这个目录进行的,这样才能把localfile拷贝到镜像的/opt目录下。

 

--以下为使用centos7的基础镜像,创建一个安装了postgresql数据库的镜像的例子:

简述思路:

  1. 基础镜像是一个通过centos7的源新创建的镜像文件,里面什么内容也没有。
  2. 需要上传postgresql的编译版本,这个版本的软件已经验证过,可以在和镜像系统相同版本的centos上正常工作。
  3. 需要在镜像中创建普通用户,初始化data目录。
  4. 用户启动新镜像的容器后,能够切换到新创建的普通用户,启动数据库服务,并能通过客户端连接到服务器上。

 

 

将要拷贝到镜像中的postgresql目录存放到上下文目录的根目录中。

 

编辑dockerfile文件,复制文件,创建目录,创建用户。

生成镜像的过程中执行用户切换并输入命令,需要使用-c参数,语法和shell类似。

 

 

 

正常提示后,完成镜像创建。

 

 

 

启动容器,启动镜像里的postgresql数据库,执行客户端连接。

 

三、Docker镜像的基本使用方法

1.导入导出:

前面已经提过 docker save -o /目录 镜像名   导出本地镜像到tar

                         docker load -i *.tar,把tar导回系统使用。

2.标签操作

标签操作很重要,和存储标记,私库上传下载有关。

docker tage 旧镜像:旧标签  新镜像:新标签

3.创建docker网络

docker network create --subnet=192.168.253.1/16 mynetwork (有了docker自己的网络配置,才能给启动的容器定制IP)

docker network ls

docker的网络配置共有四种:host,container,bridge,none,默认为bridge,docker的bridge和虚拟机的桥接不同,更类似NAT模式,具体详情后续文章再详细介绍。

4.启动容器

docker run -it --net mynetwork --ip 192.168.253.3  --hostname node01 centos:7_0820 bash

-i:交互操作
-t:启动终端

--net mynetwork --ip 192.168.253.3 指定容器的IP

--hostname node01:指定容器中的hostname

bash:使用bash命令行。

5.停止容器

docker ps

查看正在运行的容器信息,获得容器ID

docker stop 容器ID

6.删除镜像

删除普通镜像:

docker image ls 查找镜像信息,获得镜像ID

docker rmi 镜像ID ,执行删除,若提示删除失败,可增加 f 和 force 选项强制删除。

删除虚悬镜像:

有时候操作失误会导致名称等信息变为<NONE>的虚悬镜像,执行

docker image rm 镜像ID 进行删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说我听海绵宝宝派大星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值