概念:
镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每次改变以读写层的形式增加到原来的只读文件上;

镜像是容器运行的基石;
如果说将容器理解为一套程序运行的虚拟环境,那么镜像就是用来构建着个环境的模板;

镜像的系统结构:
用户的镜像必须构建于根镜像之上;
镜像的本质是磁盘上一系列文件的集合;

镜像的写时复制机制:
一旦修改父镜像文件,便会触发Docker从父镜像中复制这个文件到临时镜像中来,所有的修改均发生你的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制;

3.1 本地镜像的管理

3.1.1查看
[root@bogon ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu    14.04               ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/ubuntu    latest              ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/centos    latest              ce20c473cd8a        6 weeks ago         172.3 MB

3.1.2显示镜像更详细信息
[root@bogon ~]# docker inspect ubuntu

3.1.3下载
[root@bogon ~]# docker search wordpress
[root@bogon ~]# docker pull docker.io/wordpress

3.1.4删除
[root@bogon ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu    14.04               ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/ubuntu    latest              ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/centos    latest              ce20c473cd8a        6 weeks ago         172.3 MB
[root@bogon ~]# docker rmi ubuntu
Untagged: ubuntu:latest
[root@bogon ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu    14.04               ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/centos    latest              ce20c473cd8a        6 weeks ago         172.3 MB

有时候会遇到删不掉的问题,一般出现这个问题的原因是这个容器所依赖。即便容器已经停止运行了,也仍然需要依赖惊醒。用户可以使用-f参数进行强制删除,或者,先删除容器,然后删除镜像;


3.2创建本地镜像

3.2.1使用commit命令创建本地镜像

#docker run -it --name=ubuntu_test ubuntu /bin/bash                                             //创建一个ubuntu_test的容器
#cd /tmp && echo "Hello,this is my first time to create a mirror" > hello_docker.txt && exit   //在这里面做自己想做的操作
#docker commit -m="message" --author="x180" d639c5228760 x180/ubuntu_mirror:v1                 //提交,这个ID要注意是ubuntu_test容器的ID
[root@localhost ~]# docker p_w_picpaths
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
x180/ubuntu_mirror   v1                  203403840f4d        7 seconds ago       187.9 MB
docker.io/ubuntu     latest              ca4d7b1b9a51        2 weeks ago         187.9 MB
docker.io/centos     latest              ce20c473cd8a        6 weeks ago         172.3 MB

[root@localhost ~]# docker run -it --name=ubuntu_test2 x180/ubuntu_mirror:v1 /bin/bash
进行验证此前的操作;

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS                      PORTS               NAMES
0d1b58e0c57c        x180/ubuntu_mirror:v1   "/bin/bash"         43 seconds ago      Exited (0) 18 seconds ago                       ubuntu_test2
d639c5228760        ubuntu                  "/bin/bash"         3 minutes ago       Exited (0) 2 minutes ago                        ubuntu_test
8e2711a8c7ac        ubuntu                  "/bin/bash"         26 minutes ago      Exited (0) 26 minutes ago                       compassionate_colden
2c90ec50a558        ubuntu                  "/bin/bash"         26 minutes ago      Exited (0) 26 minutes ago                       backstabbing_pasteur

3.2.2使用Dockerfile创建镜像

相比第一种方法,这种方法将要对镜像进行的操作全部写到一个文件中,然后使用docker build命令从这个文件中创建镜像;
好处:
    使镜像的创建变得透明和独立化;
    并且创建过程可以重复执行;
[root@localhost ~]# vim Dockerfile

#Version:1.0.1
FROM ubuntu:latest
MAINTAINER x180 "[email protected]"
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN mkdir /web
RUN echo "hello,this is mirror created by Dockerfile" > abc.txt
#对外暴露端口
EXPOSE 22
#添加文件
ADD local.txt /tmp/
#添加文件夹
ADD /webapp /opt/webapp          //ADD是把本地主机上的文件添加到镜像中去,也可以是网络上的文件
#设置工作目录
WORKDIR /tmp/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数
CMD ["-a","-l"]
#设置卷
VOLUME ["/data"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt

使用build命令进行构建:
#docker build -t x180/dockerfile:v1 .             //-t参数用来指定镜像的空间、仓库名和TAG
#docker tag x180/dockerfile:v1 x180/dockerfile:v   //修改tag;

方式(2)、使用Github上的Dockerfile文件:
#docker build -t x180/new_mirror:v1 git://github.com/x180/gitDockerfile.git

方式(3)、使用Docker Hub

#docker login
Username:x180
Password:
Email:[email protected]

#docker push x180/Dockerfile:v1    //把创建的镜像上传到Docker Hub;
#docker pull x180/Docker_test:v1   //把在Docker Hub上的镜像下载过来;

方式(4)、使用自动化构建
    登录Docker Hub


后记:
ONBUILD:触发器指令。构建镜像的时候,Docker的镜像构建起会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用FROM指令指定父镜像为这个镜像时,才会触发执行。




3.3 创建注册服务器
除了使用Docker官方提供的注册服务器Docker Hub来存储管理镜像之外,我们还可以搭建自己的注册服务器。

(1)拉去最新的registry官方镜像:
#docker pull registry

(2)运行registry:
#docker run -p 5000:5000 -d -i -t registry  //这是一个简便的做法,更多:https://hub.docker.com/_/registry/

(3)可以使用commit命令将任意一个容器提交成镜像
#docker commit 203403840f4d 127.0.0.1:5000/my_p_w_picpath:v1

(4)提交这个镜像到注册服务器
#docker push 127.0.0.1:5000/my_p_w_picpath:v1