Docker镜像

Docker 镜像

    Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用  UnionFS 来将这些层联合到单独的镜像中。正因为有了这些层的存在,Docker  是如此的轻量。当你改变了一个 Docker  镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。

在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,由于镜像不可写,所以镜像是无状态的。

镜像由三部分组成:
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)

1.存储对象:images
2.格式:库名/分类:tag
3.tag:表示镜像版本

镜像的大体分类方式:这不是规定

 1.以操作系统名字    
centos的docker镜像:
centos5
centos6
centos7
-----------------

2.以应用的名字
nginx的docker镜像
tomcat的docker镜像
mysql的docker镜像

 镜像名字:

完整镜像名称示例:        
docker.io/library/nginx:v1
docker.io/library/nginx:latest
daocloud.io/library/nginx

镜像ID:

所有镜像都是通过一个 64 位十六进制字符串来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。

镜像ID:64位的id号,一般我们看到的是12位的我们称之为短ID,只要我们每个ID号不冲突就可以了

镜像本身:是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。

基础镜像:一个没有任何父镜像的镜像,谓之基础镜像。
centos7   镜像
centos7+nginx 镜像

Docker 容器

   Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker  镜像创建的。Docker 容器可以运行、启动、停止、移动、删除、暂停(挂起)。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是  Docker 的运行一部分。

1 Docker镜像命名解析

Docker镜像命名解析

镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是Dockerfile里面写FROM image,从Docker官方Registry下载镜像应该是Docker操作里面最频繁的动作之一了。那么docker镜像是如何命名的,这也是Docker里面比较容易令人混淆的一块概念:Registry,Repository, Tag and Image。

那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。

下面是在本地机器运行docker images的输出结果:

常说的"ubuntu"镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。

Image[:tag]

当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特定版本的镜像。

例如:docker run ubuntu:14.04

2 Docker镜像和容器的区别

一、Docker镜像

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

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。

要列出本地所有有效的镜像,可以使用命令

# docker images
# docker image list

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

可以使用pull命令加上指定的标签(不加版本号默认是最新版本):

# docker pull ubuntu:11
# docker pull ubuntu:12.04
# docker pull centos:7

二、Docker容器

Docker容器可以使用命令创建:

# docker run  -it  imagename  /bin/bash

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

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现

3 镜像管理

这种方法只能用于官方镜像库
搜索基于 centos 操作系统的镜像

[root@docker-server ~]# docker search centos

按星级搜索镜像:

查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 centos 镜像:         
[root@docker-server ~]# docker search ubuntu -f stars=100

 拉取镜像:

# docker pull centos
注:没有加registry,默认是从docker.io/dockerhub下载的
[root@docker-server ~]# docker pull daocloud.io/library/tomcat:7
[root@docker-server ~]# docker pull daocloud.io/library/centos:6

查看本地镜像:

[root@docker-server ~]# docker image list 
或者
[root@docker-server ~]# docker images

查看镜像详情:

[root@docker-server ~]# docker inspect 镜像id/镜像名称

 删除镜像:

删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
[root@docker-server ~]# docker rmi daocloud.io/library/mysql
或者
[root@docker-server ~]# docker rmi 81debc
或者
                        docker image rm 镜像名或者镜像id

参数解释:
rm          Remove one or more containers  ---移除一个或多个容器
rmi         Remove one or more images   ---删除一个或多个镜像

 强制删除:--force

如果镜像正在被使用中可以使用--force强制删除    
# docker rmi docker.io/ubuntu:latest --force
-f, --force      Force removal of the image

注意: 容器运行中不能删除,将容器停止后,删除容器,再删除镜像。

只查看所有镜像的id:

[root@docker-server ~]# docker images -q
98ebf73aba75
81debc95563d
d0957ffdf8a2

-q, --quiet

删除所有镜像:

[root@docker-server ~]# docker rmi $(docker images -q)
                    或者docker rmi `docker images -q` 

查看镜像制作的过程:
相当于dockfile

[root@docker-server ~]# docker history daocloud.io/library/nginx  使用镜像名或者镜像ID都可以

5. 容器管理

5.1 容器基本操作

5.1.1 启动容器

创建新容器但不启动

[root@docker-server ~]# docker create -it daocloud.io/library/centos:7 /bin/bash

创建并运行一个新Docker 容器:同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器

[root@docker-server ~]# docker run -it --restart=always daocloud.io/library/centos:7 /bin/bash   #最常用
-i:标准输入输出
-t:分配一个终端或控制台
--restart=always:容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭   
也适用于create选项
-d    后台运行容器,并返回容器ID

如果执行成功,说明CentOS 容器已经被启动,并且应该已经得到了 bash 提示符。

--rm:默认情况下,每个容器在退出时,它的文件系统也会保存下来.另一方面,也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。

示例:
[root@docker-server ~]# docker run -it --rm daocloud.io/library/nginx:latest  /bin/bash
root@be2d0a462ce1:/# exit 
exit

注意:不能用-d   , --rm和--restart=alwarys冲突;

[root@docker-server ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

容器名称

为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称是 docker run 子命令的参数
--name= Assign a name to the container
# docker run -it --name 名字  daocloud.io/centos:6 /bin/bash   #名字自定义 

如果你在执行docker run时没有指定--name,那么自动生成一个随机字符串UUID。这个UUID标识是由Docker deamon生成的。但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。

若要断开与容器的连接,并且关闭容器:容器内部执行如下命令

 root@37b8b8cdd75f:/# exit

如果只想断开和容器的连接而不关闭容器:

快捷键:ctrl+p+q 

5.1.2 查看容器

1.只查看运行状态的容器:
# docker ps
2.-a  查看所有容器
# docker ps -a
3.只查看所有容器id:
# docker ps -a -q
或者docker ps -qa 

5.1.3 查看容器详细信息

inspect  :用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。

目标:查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。

提示:可以使用容器id的前面部分,不需要完整的id。

[root@docker-server ~]# docker inspect 容器名称/容器ID   #机器上运行的一个容器ID或者名称
[
    {
        "Id": "d95a220a498e352cbfbc098c949fc528dbf5a5c911710b108ea3a9b4aa3a4761",
        "Created": "2017-07-08T03:59:16.18225183Z",
        "Path": "bash",
        "Args": [],
        "State": {
            "Status": "exited",
           "Running": false,
            "Paused": false,
           "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,

容器信息很多,这里只粘贴了一部分

5.1.4 启动容器

# docker start  name   #容器ID也可以
这里的名字是状态里面NAMES列列出的名字,这种方式同样会让容器运行在后台 

5.1.5 关闭容器: 

# docker stop  name

# docker kill  name      --强制终止容器

 5.1.6 杀死所有running状态的容器

# docker kill $(docker ps  -q) 
# docker stop `docker ps  -q`

5.1.7 stop和kill的区别:

   docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。

5.1.8 删除容器:

# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数 --慎用。先stop在删除

 根据格式删除所有容器:

# docker rm $(docker ps -qf status=exited)
-f:过滤

pause :暂停容器中所有的进程(挂起)
unpause:恢复容器内暂停的进程,与pause对应

[root@docker-server ~]# docker pause 容器名
[root@docker-server ~]# docker ps 
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                  PORTS               NAMES
3c0e0f43807d        98ebf73aba                     "/bin/bash"         7 minutes ago       Up 7 minutes (Paused)   80/tcp              c7
[root@docker-server ~]# docker unpause 容器名  #恢复

重启容器:

[root@docker-server ~]# docker restart name 

让容器运行在后台:

# docker run -dit 镜像ID /bin/bash
-d 后台运行必须要加-it
 

如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。
注:
容器运行在后台模式下,是不能使用--rm选项的(老版本是这样,新版本已经可以同时生效)

5.1.9 修改容器名字

rename  ---修改容器名称

 [root@docker-server ~]# docker rename mytest testmy
[root@docker-server ~]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
774c02898fb1        daocloud.io/library/nginx   "/bin/bash -c 'while…"   5 minutes ago       Up About a minute   80/tcp              testmy

5.1.10 查看容器资源情况

stats
显示容器资源使用统计信息的实时流

 [root@docker-server ~]# docker stats
--当有容器在运行的时候动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O

5.1.11 登陆容器方法

连接容器:前提是容器在运行状态中
方法1.attach

 docker attach 容器id   #前提是容器创建时必须指定了交互shell

 方法2.exec
通过exec命令可以创建两种任务:后台型任务和交互型任务

1.交互型任务:
[root@docker-server ~]# docker exec -it  容器id  /bin/bash
root@68656158eb8e:/# ls

2.后台型任务:不进入容器里面执行命令
[root@docker-server ~]# docker exec 容器id touch /testfile

监控容器的运行:

可以使用logs、top、wait这些子命令

logs:使用logs命令查看守护式容器
       可以通过使用docker logs命令来查看容器的运行日志,其中--tail选项可以指定查看最后几条日志,使用-f选项可以跟踪日志的输出,直到手动停止。

[root@docker-server ~]# docker pull daocloud.io/library/nginx
[root@docker-server ~]# docker images 
[root@docker-server ~]# docker run -it --name nginx1 98ebf73
root@8459191dbe7c:/# /usr/sbin/nginx   #启动nginx
ctrl+p+q --- 退出
[root@docker-server ~]# docker inspect nginx1  #找到ip地址
[root@docker-server ~]# curl -I http://172.17.0.3  #宿主机访问容器可以访问成功
HTTP/1.1 200 OK
Server: nginx/1.17.1
Date: Mon, 09 Mar 2020 14:49:40 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 25 Jun 2019 12:19:45 GMT
Connection: keep-alive
ETag: "5d121161-264"
Accept-Ranges: bytes
[root@docker-server ~]# curl -I http://172.17.0.3  #继续测试访问

在开启一个终端:
[root@docker-server ~]# docker logs -f nginx1  
root@8459191dbe7c:/# /usr/sbin/nginx
root@8459191dbe7c:/# 172.17.0.1 - - [09/Mar/2020:14:49:33 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
172.17.0.1 - - [09/Mar/2020:14:49:40 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"

top:显示一个运行的容器里面的进程信息

[root@docker-server ~]# docker top  nginx   #容器ID也可以 

wait :--捕捉容器停止时的退出码
执行此命令后,该命令会"hang"在当前终端,直到容器停止,此时,会打印出容器的退出码

在第一个终端执行停止容器命令
[root@docker-server ~]# docker stop nginx1
=============================================================================
[root@docker-server ~]# docker wait nginx1  #第二个终端操作
0

docker run 之后容器退出的状态码:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在

5.1.12 宿主机和容器之间相互拷贝文件/目录

cp的用法如下:

Usage: 
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH   --从容器拷贝到本机
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH   --从本机拷贝到容器

 如:容器nginx中/usr/local/bin/存在test.sh文件,可如下方式copy到宿主机

[root@docker-server ~]# docker run -it --name mytest nginx:latest /bin/bash
root@2a9a18b4a485:/# cd /usr/local/bin/
root@2a9a18b4a485:/usr/local/bin# touch test.sh
ctrl+p+q  退出
[root@docker-server ~]# docker cp mytest:/usr/local/bin/test.sh /root/ 

修改完毕后,将该文件重新copy回容器 

[root@docker-server ~]# ls
anaconda-ks.cfg  test.sh
[root@docker-server ~]# echo "123" >> test.sh
[root@docker-server ~]# docker cp /root/test.sh mytest:/usr/local/bin/

[root@docker-server ~]# docker cp -a /opt mytest:/usr/local/bin/  #拷贝目录

5.1.13 容器的状态

Created:

  • 容器已经被创建,但尚未启动。此时,容器处于一种待机状态,等待进一步的操作。

Running:

  • 容器正在运行并执行其主要进程。处于此状态的容器可以处理请求和数据。
  • docker ps 可以显示所有正在运行的容器。

Paused:

  • 容器的所有进程被暂停(挂起)。此时,容器的 CPU 资源被释放,但内存等其他资源仍然占用。
  • 你可以通过 docker pause <container_id> 暂停一个容器,并通过 docker unpause <container_id> 恢复它。

Restarting:

  • 容器正在重新启动。通常,这种情况发生在容器配置了自动重启策略时,其进程由于某种原因终止并触发重启。

Exited:

  • 容器的主进程已经停止运行,并且没有自动重启策略,或者重启策略未能触发。容器退出状态码可以通过 docker inspect 命令查看。
  • docker ps -a 可以显示所有包含已退出容器的列表。

Dead:

  • 容器遇到严重问题,无法恢复。通常,这是 Docker 容器处于崩溃状态的标志,需要人工干预来处理这个容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值