一、Docker镜像的分类
Docker镜像从来源,可以分为官方镜像和自制镜像。从制作方式不同又可分为自动生成镜像和定制镜像。本篇文章着重讲解镜像的各种制作和使用方法。
二、Docker镜像的制作
首先官方镜像不需要我们制作,直接pull来用就可以了,当安装Docker并启动了服务的linux机器能够连接互联网的时候,可以直接执行:
- docker search 镜像名
系统自动会到docker的官方库里查找我们需要的镜像,根据列表和描述,我们可以选择需要的镜像下载到本机进行使用:
- docker pull 镜像名
但有时候运行docker的电脑可能无法联网,如果想使用官方镜像,就只能通过导入镜像包的办法:
- 在一台能联网的docker机器上pull到你需要的镜像。
- docker image ls:查看这个镜像的名称。
- 执行docker save -o /存储目录 镜像名 将镜像名自动打包tar到存储目录。
- 把打包的镜像转存到需要导入的docker机器上。
- 执行docker load -i /存储目录 将镜像的tar包恢复到当前docker服务器上。
- 执行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的方式。
- 被执行操作的容器正在运行,没有被stop。
- 在另一个终端使用docker ps,查看当前容器的ID。
- 在这个新终端上执行:docker commit --author "lming" --message "create user2" 容器ID 新镜像名:新标签
- 这样可以创建一个新的镜像,是在之前基础镜像上实时操作来的。
第二种:使用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数据库的镜像的例子:
简述思路:
- 基础镜像是一个通过centos7的源新创建的镜像文件,里面什么内容也没有。
- 需要上传postgresql的编译版本,这个版本的软件已经验证过,可以在和镜像系统相同版本的centos上正常工作。
- 需要在镜像中创建普通用户,初始化data目录。
- 用户启动新镜像的容器后,能够切换到新创建的普通用户,启动数据库服务,并能通过客户端连接到服务器上。
将要拷贝到镜像中的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 进行删除。