Docker应用之镜像

一、Docker包括三个基本概念

1、镜像(Image):Docker镜像是一个只读模板,例如一个镜像可以包含完整的Linux系统环境,里面仅仅安装了Apache或用户其他应用程序;镜像可以用来创建Docker容器,每一次使用命令run一个镜像就是创建一个容器;Docker提供了一个很简单的机制来创建或更新现有镜像,用户甚至可以直接从别处下载一个镜像使用

2、容器(Container):Docker利用容器来运行应用;容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除,每个容器都是相互隔离的,保证安全的平台;可以把容器看做是一个简易版的linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序;注意,镜像是只读的,容器在启动的时候创建一层可写层作为最上层

3、仓库(Repository):仓库是集中存放镜像文件的场所,有时候会把仓库注册服务器(Registry)混为一谈,严格说仓库注册服务器存放在多个仓库,每个仓库又包含多个镜像,每个镜像有不同的标签(tag);仓库分为公开仓库和私有仓库,最大的公开仓库是Docker Hub,用户可以在本地网络创建私有仓库;用户可以通过push将镜像上传到公开或私有仓库,或者通过pull从公开或私有仓库下载镜像

二、镜像

  Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,docker会从镜像仓库下载(默认从Docker Hub公共仓库下载)

1、获取镜像:如,在Docker Hub公共仓库下载Ubuntu 12.04操作系统

docker pull ubuntu:12.04

其实上面命令等价于

docker pull registry.hub.docker.com/ubuntu:12.04

即从docker hub注册服务器上的ubuntu仓库下载标记为12.04的镜像;如果在docker hub上下载比较慢,可以从其他库下载,如下

docker pull dl.dockerpool.com:5000/ubuntu:12.04

创建一个交互式容器,运行bash应用

docker run -t -i ubuntu:12.04 /bin/bash

2、列出镜像

docker images

列标题可以看出镜像REPOSITORY仓库,TAG镜像标记,IMAGE ID镜像ID(唯一),CREATED创建时间,SIZE大小

其中UbuntuIMAGE ID一样,说明这两个镜像实际上是同一个镜像,TAG信息来标记来自同一个仓库的镜像版本

创建容器时,如果不指定镜像版本,则默认使用latest标记的版本(本地没有,就要到仓库下载)

3、创建镜像

创建镜像可以从仓库下载更新,也可以利用本地文件系统创建

1)在现有镜像基础上创建新镜像

启动一个容器,然后在里面添加json和gem两个应用

 docker run -t -i training/sinatra /bin/bash
 gem install json

安装完成后使用exit命令退出,然后用docker commit命令来提交更新后的副本

 docker commit -m "Add json gem" -a "Docker Newbee" 836bcab25b1d ouruser/sinatra:v2

如果去掉了:v2,则提交后的TAG为latest,使用dokcer images命令可以查看本地现有镜像

-m 指定提交的说明信息,-a 指定更新的用户信息,再后面是用来创建镜像的容器ID,最后是目标镜像的仓库名和tag信息

2)利用Dockerfile来创建镜像

新建一个目录和Dockerfile

mkdir sinatra
cd sinatra/
touch Dockerfile
vi Dockerfile

Dockerfile文件中的内容如下

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

Dockerfile基本语法:1)、使用#来注释,2)、FROM指令告诉Docker使用哪个镜像作为基础,3)、接下来是维护者信息,4)、RUN开头的指令会在创建中执行,比如安装一个软件包

(Dockerfile中创建一个镜像每执行一条指令就创建一个新的容器,最后把中间步骤产生的容器删除掉,规定不能超过127层;可以利用ADD命令复制本地文件到镜像,用EXPOSE命令来向外开放端口,用CMD命令来描述容器启动后运行的程序等,命令如下:

# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

编写完以后可以使用docker build来生成镜像

 docker build -t="ouruser/sinatra:v3" .

-t来添加tag,及用户信息,"."是指Dockerfile所在目录,即当前目录

我在第一次执行build时候出现了错误,是RUN后面的命令导致的,所有就删除了,不执行RUN命令,使用查看镜像命令得结果如下

再给镜像重新打一个标签

 docker tag bb31 ouruser/sinatra:devel

3)从本地文件系统导入

要从本地文件系统导入一个镜像,可以使用openvz(容器虚拟化的先锋技术)的模板来创建,openvz模板下载地址为templates,在这里面比如下载了一个镜像文件ubuntu-14.04-x86_64-minimal.tar.gz,之后使用以下命令导入

cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:14.04

4)上传镜像,上传到私服或Docker Hub上(Docker Hub需要注册)

docker push ouruser/sinatra上传该库下所有镜像

4、镜像存出、载入和移除

1)、cd ~,切换到home文件夹下,执行下面命令

docker save -o ubuntu_14.04.tar ubuntu:14.04

在home文件夹下查看文件

2)、载入存出的镜像文件

 docker load --input ubuntu_14.04.tar 

docker load < ubuntu_14.04.tar 

这种方式会导入镜像及其元数据信息(如标签等)

3)移除镜像,移除镜像前要先删掉依赖这个镜像的所有容器

删除所有容器命令

docker rm -f $(docker ps -a -q)

-f 强制,-a 所有,-q 只列出容器ID

移除ubuntu:14.04镜像,然后验证是否移除,然后再载入

docker rmi ubuntu:14.04

 5、查看镜像详细信息

docker inspect [ImageID]

原文地址:https://www.cnblogs.com/hujiapeng/p/7146861.html