【Docker】镜像、容器、仓库相关 (三)

摘要:关于Docker,必须理解其最主要的三个基本概念,镜像(Image)、容器(Container)、仓库(Repository),只有正确理解这三个概念,才能理解Docker的整个生命周期。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。容器是用镜像创建的运行实例。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例 一样,镜像是静态的定义,容器是镜像运行时的实体。仓库(Repository)是集中存放镜像文件的场所,实质是一个集中的存储、分发镜像的服务。

镜像

关于镜像文件

Docker把应用程序及其依赖,打包在 image文件里面。只有通过这个image镜像文件,才能生成Docker容器。
image文件可以看作是容器的模板。

Docker 根据 image文件生成容器的实例。
同一个 image文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个image文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。
举例来说,你可以在Ubuntuimage 基础上,往里面加入 Apache服务器,形成你的image

获取新的镜像

当我们在本地主机上使用一个不存在的镜像时Docker就会自动下载这个镜像。

如果我们想预先下载这个镜像,我们可以使用docker pull命令来下载它。

[root@wx ~]# docker pull ubuntu:13.10

列出镜像列表

方式一:

[root@wx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest f6e427c148a7 3 weeks ago 1.15 MB
docker.io/ubuntu 13.10 7f020f7bf345 3 years ago 185 MB
参数 说明
REPOSITORY 仓库名
TAG 标签
IMAGE ID 镜像 ID
CREATED 创建时间
SIZE 所占用的空间

方式二:

[root@wx ~]# docker image ls

删除镜像文件

[root@wx ~]# docker image rm [选项] <镜像短 ID> [<镜像长 ID> <镜像名> <镜像摘要>...]

列出当前的镜像:

[root@wx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
import/lnmp v1.0 fe2ffdf273e5 30 minutes ago 637MB
lnmp v1 ffdafb6c807c 17 hours ago 795MB
<none> <none> 05d2fc98e5ad 23 hours ago 366MB
php v1 97d9b5856eff 24 hours ago 869MB
<none> <none> 0e7850d816ad 24 hours ago 426MB
<none> <none> cd4589097c35 25 hours ago 300MB
centos centos7 5182e96772bf 5 days ago 200MB
ubuntu 16.04 7aa3602ab41e 2 weeks ago 115MB
hello-world latest 2cb0d9787c4d 4 weeks ago 1.85kB

使用镜像短ID删除:

[root@wx ~]# docker image rm 05d
Deleted: sha256:05d2fc98e5ad9137aa11d13c3c8***d2a4f2dd0d1c873eb5ca0bf13c757efa4af
Deleted: sha256:6118d3ba77a3095eed42d89df5a***f506f0bb43a165bd4b091a32ea44118ebc0

使用镜像长ID删除:

[root@wx ~]# docker image rm 0e7850d816ad
Deleted: sha256:0e7850d816ad4c662705a647ec3e16a***8a9388ea2dba7997c068a1d505918e
Deleted: sha256:438d92ff0ddacdffbe6b69609196dad2e***3b0fcabd70b4cc33137537c0e6456

使用镜像名<仓库名>:<标签>删除:

[root@wx ~]# docker image rm hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:4b8ff392a12ed9ea17784bd3c9a8*****9cac44aca35a85c90c5e3c7afacdc
Deleted: sha256:2cb0d9787c4dd*******b03e512923bc4db10add190d3f84af63b744e353a9b34
Deleted: sha256:ee83fc5847cb87*******8a1f5dbfd754255367f4280122b4e2d5aee17818e31f5

使用镜像摘要删除:

[root@wx ~]# docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
import/lnmp v1.0 <none> fe2ffdf273e5 35 minutes ago 637MB
lnmp v1 <none> ffdafb6c807c 17 hours ago 795MB
php v1 <none> 97d9b5856eff 24 hours ago 869MB
<none> <none> <none> cd4589097c35 25 hours ago 300MB
centos centos7 sha256:6f6d986d425aeabdc3a0*******7357e92417d6d58332856024faf 5182e96772bf 5 days ago 200MB
ubuntu 16.04 sha256:3097ac92b852f878f802c22*******97b4084dbef82893ba453ba0297d76a6a 7aa3602ab41e 2 weeks ago 115MB

[root@iZrj9hb9k9jtcpp85t8ryeZ ~]# docker image rm ubuntu@sha256:3097ac92b852f878f802c22*******97b4084dbef82893ba453ba0297d76a6a
Untagged: ubuntu@ sha256:3097ac92b852f878f802c22*******97b4084dbef82893ba453ba0297d76a6a

镜像体积

[root@wx ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 9 1 2.708GB 2.113GB (78%)
Containers 1 1 130B 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B

使用镜像运行容器

假设我们使用版本为13.10的ubuntu系统镜像来运行容器时,命令如下:

[root@wx ~]# docker run -t -i ubuntu:13.10 /bin/bash

对于像Ubuntu这些不会自动终止的容器,必须使用 docker container kill 命令手动终止。

[root@wx ~]# docker container kill e776356b5e5c
e776356b5e5c

容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。

容器拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。

容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。

创建和运行

不使用-d选项参数,直接进入运行后的容器:

[root@wx ~]# docker run -it --rm \
                      ubuntu:16.04 \ 
                      /bin/bash  
[root@55579470ab71 ~]#

使用-d选项参数,启动后会返回一个唯一的 id,在后台运行:

[root@wx ~]# docker run -d -i -t --rm \
                      ubuntu:16.04 \ 
                      /bin/bash  
2104aab0e69a72665d2823bd107***d1c52d389306b771385c1e4234d953f8bb
参数 说明
docker run 运行容器的命令
-d 守护态运行,在后台运行
-i (interactive) 交互式操作
-t (terminal) 终端
--rm 容器退出后随之将其删除
ubuntu:16.04 以ubuntu:16.04 镜像为基础来启动容器
/bin/bash 交互式 Shell

当利用docker run来创建容器时,Docker在后台运行的标准操作包括:
① 检查本地是否存在指定的镜像,不存在就从公有仓库下载
② 利用镜像创建并启动一个容器
③ 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
④ 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
⑤ 从地址池配置一个 ip 地址给容器
⑥ 执行用户指定的应用程序
⑦ 执行完毕后容器被终止

查看容器

查看运行中的容器:

[root@wx ~]# docker ps
[root@wx ~]# docker container ls

查看所有容器(停止+运行中):

[root@wx ~]# docker ps -a
[root@wx ~]# docker container ls -a

终止、启动和重启容器

通过指定某个容器的ID进行终止:

[root@wx ~]# docker container stop container_id

在运行的容器中直接进行终止:

[root@wx ~]# exit
[root@wx ~]# Ctrl+d

终止后再次启动容器:

[root@wx ~]# docker container start container_id

重新启动容器:

[root@wx ~]# docker container restart container_id

进入容器

exec 命令(推荐):

[root@wx ~]# docker exec -it container_id bash
[root@2ce67b15dbbd ~]#

attach 命令(不推荐):

[root@wx ~]# docker attach container_id

导出和导入

导出容器快照到本地文件:

[root@wx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ce67b15dbbd lnmp:v1 "/bin/bash" 17 minutes ago Up 8 minutes hungry_beaver
[root@wx ~]# docker export 2ce67b15dbbd > lnmp.tar

导入一个容器快照到本地镜像库:

[root@wx ~]# cat lnmp.tar | docker import - import/lnmp:v1.0
sha256:fe2ffdf273e57a910db98555f36**********db2efa7d2bbbe9d2a8020f46
[root@wx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
import/lnmp v1.0 fe2ffdf273e5 2 minutes ago 637MB
lnmp v1 ffdafb6c807c 17 hours ago 795MB

通过指定 URL 或者某个目录来导入:

[root@wx ~]# docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

删除处于终止状态的某个容器:

[root@wx ~]# docker container rm container_id

删除处于运行中的某个容器:

[root@wx ~]# docker container rm -f container_id

删除所有处于终止状态的多个容器:

[root@wx ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

prune 意思为删除、减少

仓库

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

官方Docker Hub

我的Docker Hub

Docker Hub

Docker Hub 是 Docker 官方维护的一个公共仓库。大部分需求都可以通过在 Docker Hub中直接下载镜像来实现。

登录

[root@wx ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: wangxiong
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

退出

[root@wx ~]# docker logout
Removing login credentials for https://index.docker.io/v1/

搜索

[root@wx ~]# docker search wangxiong
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wangxiong/lnmp 利用Dockfile 定制的LNMP镜像 0

拉取镜像

[root@wx ~]# docker pull wangxiong/lnmp

推送镜像

[root@wx ~]# docker tag lnmp:v1 wangxiong/lnmp:v1.0
[root@wx ~]# docker images
[root@wx ~]# docker push wangxiong/lnmp:v1.0
[root@wx ~]# docker search wangxiong/lnmp

小结

Docker 本身是一个容器运行载体或称之为管理引擎。

我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器。image文件可以看作是容器的模板。

Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同事运行的容器实例。

  • image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

  • 一个容器运行一种服务,当我们需要的时候,就可以通过Docker客户端创建一个对应的运行实例,也就是容器。

  • 至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。

相关推荐

微信扫一扫,分享到朋友圈

【Docker】镜像、容器、仓库相关 (三)
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close