镜像,容器和仓库

镜像

        Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统,在创建容器的时候必须输入以什么镜像为基础创建容器。现在来理解一下镜像和容器的关系,假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。

        镜像和镜像之间的关系,一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。要列出本地所有有效的镜像,可以使用命令

docker images

镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。 

容器

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker容器可以使用命令创建

docker run imagename

它会在所有的镜像层之上增加一个可写层。因此在创建第一个容器的时候必须选择一个镜像输入,这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。

我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。

如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。

如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。

64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

镜像和容器的区别

  • 镜像是包含了各种环境或者服务的一个模板,而容器是镜像的一个实例;
  • 镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。
  • 查看并且激活镜像

实操

启动一个新的容器(Run a command in a new container)

docker -it run 镜像名(你容器想创建在那个image上面) #镜像名字不能出现大写字母,只能用小写字母

docker 把容器做成镜像 docker 镜像 容器_linux

 

docker run -it --name Myubuntu ubuntu(Myubuntu为新创建的容器名字,ubuntu为容器的底层镜像)

docker 把容器做成镜像 docker 镜像 容器_docker_02

注意-it的重要性

通常的解释是: -t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开. 如果不加参数i, docker容器无法启动。因为Docker中系统镜像的缺省命令是 bash,如果不加 -ti bash 命令执行了自动会退出(有参数t不会自动退出,但是输入的信息无法被接收)。这是因为如果没有衔接输入流,本身就会马上结束。加-ti 后docker命令会为容器分配一个伪终端,并接管其stdin/stdout支持交互操作,这时候bash命令不会自动退出。

 退出当前容器终端

(注意退出终端不代表着是停止容器,进入容器有两种命名attach和exec命令,前者退出终端时会导致容器停止,而后者不会)

exit

docker 把容器做成镜像 docker 镜像 容器_docker 把容器做成镜像_03

查看所有已创建的容器

docker ps -a (docker ps 含义是运行所有运行的容器,加上参数-a为所有容器包括未运行的)

 

docker 把容器做成镜像 docker 镜像 容器_Docker_04

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

NAMES:容器名字

 启动一个已经停止的容器

docker start 18cfc2b8530c (16位字符串为容器ID,也可以为容器名字)

docker 把容器做成镜像 docker 镜像 容器_运维_05

启动容器的目的在于,进入容器前需要先启动

docker 把容器做成镜像 docker 镜像 容器_linux_06

进入容器终端

attach方法

docker attach 正在运行的容器ID或者名字

docker 把容器做成镜像 docker 镜像 容器_linux_07


 exec方法

  • -d :分离模式: 在后台运行 (加上之后就不会进入终端)
  • -i :即使没有附加也保持STDIN 打开(STDIN)是标准输入流
  • -t :分配一个伪终端

docker exec -dt 容器ID bash(一定要有两个参数,一个-dt,一个bash用于指定会话)

docker 把容器做成镜像 docker 镜像 容器_运维_08

 停止一个容器

docker stop 容器ID

docker 把容器做成镜像 docker 镜像 容器_Docker_09

删除一个容器

docker rm -f 容器ID

-f, --force     Force the removal of a running container (uses SIGKILL)

docker 把容器做成镜像 docker 镜像 容器_docker 把容器做成镜像_10