Docker容器与镜像管理

释放双眼,带上耳机,听听看~!

1 查看系统信息

除了查看版本信息之外,在 docker 的命令组中还有一个较为常用的命令,查看系统的一些相关信息:

docker system info 或者使用命令 docker info

运行截图如下所示:

2 help

我们可以直接通过 help 或者使用 man 手册的方式查看相关命令的详细说明,例如我们直接使用如下命令:

$ docker –help

我们可以看到运行结果如下图所示。如果之前有学习过 docker 相关知识的同学,可能会发现一些不一样的地方。即下图中标出的 Management commands 和 Commands。在 1.13 版本之前,docker 并没有 Mangement commands。

3 Management Commands

在 Docker 1.12 CLI 中大约有四十个左右的顶级命令,这些命令没有经过任何组织,显得十分混乱,对于新手来说,学习它们并不轻松。

而在 Docker 1.13 中将命令进行分组,就得到如上图中所示的 Management Commands。例如经常使用的容器的一些相关命令:

# 创建一个新的容器,下面分别为 Commands 和 Management Commands,作用相同

docker create

docker container create

# 显示容器列表

docker ps docker container ls

# 在一个新的容器中运行一个命令

docker run

docker container run …

如上所示,对于新的命令而言相比于旧命令明显更具有可读性。并且在实验环境中的 docker 版本以及最新版本中两者都是有效的命令,所以在这里我们将一些常用的命令,及其对应的 Management Commands 命令都列举出来,方便大家在后续的学习过程中可以进行参考。

4 查看容器列表

查看容器列表可以使用如下命令:

docker container ls [OPTIONS]
或者旧的命令
docker ps [OPTIONS]

在使用命令时,我们可以使用一些可选的配置项 [OPTIONS]

  • -a 显示所有的容器
  • -q 仅显示 ID
  • -s 显示总的文件大小

这些配置项对于上述的两个命令都是有效的,在后面的内容不会再特殊说明。

默认情况下,直接使用该命令仅显示正在运行的容器,如下所示:

$ docker container ls

此时并没有处于运行中的容器,所以显示为空。我们可以使用 -a 参数,来显示所有的容器,并加上 -s 选项,显示大小,命令如下:

$ docker container ls -a -s

5 创建一个容器

docker run

首先,我们回顾在上一节使用到的 docker run hello-world 命令,该命令的格式为:

docker run [OPTIONS] IMAGE [COMMAND]

对应于 Management Commands 的命令为:

docker container run [OPTIONS] IMAGE [COMMAND]

上述两个命令的作用相同,docker run 命令会在指定的镜像 IMAGE 上创建一个可写的容器(因为镜像是只读的),然后开始运行指定的命令 [COMMAND]

一些常用的配置项为:

  • -i 或 --interactive, 交互模式
  • -t 或 --tty, 分配一个 pseudo-TTY,即伪终端
  • --rm 在容器退出后自动移除
  • -p 将容器的端口映射到主机
  • -v 或 --volume, 指定数据卷

关于该命令的详细参数较多,并且大多数参数在很多命令中的意义是相同的,将在后面的内容中使用到时进行相应的介绍。

我们指定 busybox 镜像,然后运行命令 echo "hello wanneng" 命令,如下所示:

$ docker container run busybox echo “hello wanneng”

我们可以看到该命令执行的过程:

  1. 对于指定镜像而言,首先会在本地查找,找不到时将从镜像仓库中下载
  2. 镜像下载完成后,通过镜像启动容器,并运行 echo "hello wanneng" 命令,输出运行结果之后退出。

在执行命令之后,容器就会退出,如果我们需要一个保持运行的容器,最简单的方法就是给这个容器一个可以保持运行的命令或者应用,比如 bash,例如我们在 ubunutu 容器中运行 /bin/bash 命令:

$ docker container run -i -t ubuntu /bin/bash

对于交互式的进程而言(例如这里的 bash),必须将 -i 和 -t 参数一起使用,才能为容器进程分配一个伪终端,通常我们会直接使用 -it

如上所示,我们已经进入到分配的终端中了,这时如果我们需要退出 bash,可以使用以下两种方式,它们的效果完全不同:

直接使用 exit 命令,这时候 bash 程序终止,容器进入到停止状态

使用组合键退出,容器仍然保持运行的状态,可以再次连接到这个 bash 中,组合键是 ctrl + p 和 ctrl +q。即先同时按下 ctrl 和 p 键,再同时按 ctrl 和 q 键。就可以退出

这里我们使用第二种方式,然后使用 docker container ls 命令,可以看到该容器仍然处于运行中。

docker container create

严格意义上来讲,docker run 命令的作用并不是创建一个容器,而是在一个新的容器中运行一个命令。而用于创建一个新容器的命令为

docker container create [OPTIONS] IMAGE [COMMAND] [ARG…] 或者使用旧的

docker create [OPTIONS] IMAGE [COMMAND] [ARG…]

该命令会在指定的镜像 IMAGE 上创建一个可写容器层,并 准备 运行指定的命令。需要着重强调的是,这里是准备运行,并不是立即运行。即该命令只创建容器,并不会运行容器。

一些常见的配置项如下所示:

–name 指定一个容器名称,未指定时,会随机产生一个名字。 –hostname 设置容器的主机名

–mac-address 设置 MAC 地址

–ulimit 设置 Ulimit 选项。

关于上述提到的 ulimit,我们可以通过其对容器运行时的一些资源进行限制。ulimit 是一种 linux 系统的内建功能,一些简单的描述,可以参考 https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/ ,而对于在下面我们将要设置的部分值的含义,可以参考 https://access.redhat.com/solutions/61334 。

除此之外,关于创建容器,我们还可以设置有关存储和网络的详细内容,将会在下一节的内容中进行介绍。

如下示例,我们指定容器的名字为 wanneng,主机名为wanneng,设置相应的 MAC 地址,并通过 ulimit 设置最大进程数(1024:2048 分别代表软硬资源限制,详细内容可以参考上面的链接),使用 ubuntu 的镜像,并运行 bash: $ docker container create –name wanneng –hostname wanneng

此时,容器创建成功后,会打印该容器的 ID,这里需要简单说明一下,在 docker 中,容器的标识有三种比较常见的标识方式:

  • UUID 长标识符,例如 1f6789f885029dbdd4a6426d7b950996a5bcc1ccec9f8185240313aa1badeaff
  • UUID 短标识符,从长标识符开始,只要不与其它标识符冲突,可以从头开始,任意选用位数,例如针对上面的长标识符,可以使用 1f1f678 等等
  • Name 最后一种方式即是使用容器的名字

在容器创建成功后,我们可以查看其运行状态,使用如下命令:

# 此时该容器并未运行,需要使用 -a 参数

$ docker container ls -a

新创建的容器的状态 (STATUS) 为 Created,并且其容器名被设置为对应的值。

6.查看容器的详细信息

查看容器的详细信息可以使用如下命令:

docker container inspect [OPTIONS] CONTAINER [CONTAINER…]

或者旧的

docker inspect [OPTIONS] CONTAINER [CONTAINER…]

例如我们查看刚刚创建的容器的详细信息就可以使用以下命令:

# 使用容器名

$ docker container inspect wanneng

# 使用 ID ,因生成的 ID 不同,需要修改为相应的 ID

$ docker container inspect 1f6789 $ docker container inspect 1f6

例如,我们查看刚刚创建的名为 wanneng 的容器的 MAC 地址,就可以使用如下命令:

$ docker container inspect wanneng | grep “00:01”

7 容器的 启动和暂停及退出

容器的启动命令为:

docker container start [OPTIONS] CONTAINER [CONTAINER...]

对于上面我们创建的容器而言,此时处于 Created 状态,需要使用如下命令启动它:

$ docker container start wanneng

此时,运行一个容器我们分成了两个步骤,即创建和启动,使用的命令如下:

# 创建

$ docker container create –name wanneng –hostname wanneg –mac-address 00:01:02:03:04:05 –ulimit nproc=1024:2048 -it ubuntu /bin/bash # 启动 $ docker container start wanneng

此时,运行一个容器我们分成了两个步骤,即创建和启动,使用的命令如下:

# 创建

$ docker container create –name wanneng –hostname wanneng –mac-address 00:01:02:03:04:05 –ulimit nproc=1024:2048 -it ubuntu /bin/bash

# 启动

$ docker container start wanneng

上述的两个命令如果我们使用 docker container run 只需要一步即可,即此时 run 命令同时完成了 create 及 start 操作:

$ docker container run –name wanneng –hostname wanneng –mac-address 00:01:02:03:04:05 –ulimit nproc=1024:2048 -it ubuntu /bin/bash

上述的两个命令如果我们使用 docker container run 只需要一步即可,即此时 run 命令同时完成了 create 及 start 操作:

$ docker container run –name wanneng –hostname wanneng –mac-address 00:01:02:03:04:05 –ulimit nproc=1024:2048 -it ubuntu /bin/bash

除此之外,上面的 run 命令还完成一些其它的操作,例如没有镜像时会 pull 镜像,使用 -it 参数时完成了 attach 操作(后面会学习该操作),使用 --rm 参数在容器退出后还会完成 container rm 操作。

run 命令是一个综合性的命令,如果能够熟练的使用它可以简化很多步骤,但是其使用方式较为复杂

启动之后,暂停容器可以使用如下命令:

# 暂停一个或多个容器

docker container stop [OPTIONS] CONTAINER [CONTAINER…]

# 暂停一个或多个容器中的所有进程

docker container pause CONTAINER [CONTAINER…]

上述两个命令的区别在于一个是暂停容器中的进程,而另外一个是暂停容器,例如,我们使用 stop 停止刚刚启动的容器就可以使用如下命令:

$ docker container stop wanneng

# 查看容器的状态

$ docker container ls -a

8 连接到容器

上述操作我们启动的容器运行于后台,所以,我们需要使用 attach 操作将本地标准输入输出流连接到一个运行中的容器,命令格式为:

docker container attach [OPTIONS] CONTAINER

如下示例,我们启动容器,并使用连接命令:

$ docker container start wanneng

$ docker container attach wanneng

连接到容器后,查看相应的主机名和 Mac 地址,可以判断我们连接到了刚刚创建的容器。

9 其他命令

除了上面介绍的一些命令之外,还有很多其它的命令,下面简单描述

获取日志

获取容器的输出信息可以使用如下命令:

docker container logs [OPTIONS] CONTAINER

常用的配置项有:

  • -t 或 --timestamps 显示时间戳
  • -f 实时输出,类似于 tail -f

如下所示,我们查看刚刚创建的容器的日志,使用如下命令:

$ docker container logs -tf wanneng

显示进程

除了获取日志之外,还可以显示运行中的容器的进程信息,例如查看刚刚创建的容器的进程信息:

$ docker container top wanneng

需要注意的是,该命令对于并未运行的容器是无效的

查看修改

查看相对于镜像的文件系统来说,容器中做了哪些改变,可以使用如下命令:

docker container diff wanneng

例如我们在 wanneng 容器中创建一个文件,就可以使用 diff 命令查看到相应的修改:

重启

重启容器可以使用如下命令:

docker container restart wanneng

执行命令

除了使用 docker container run 来创建容器并在容器里执行命令之外,我们还可以在一个已经处于运行中的容器中执行命令,使用如下格式: docker container exec [OPTIONS] CONTAINER COMMAND [ARG…] 例如,我们在刚刚创建的容器中执行 echo “test_exec” 命令,就可以使用如下命令:

$ docker container exec wanneng echo "test_exec"

删除容器

删除容器的命令:

docker container rm [OPTIONS] CONTAINER [CONTAINER…]

需要注意的是,在删除容器后,在容器中进行的操作并不会持久化到镜像中

10 镜像

镜像仓库(Repository)用于存放镜像,每个仓库都有其唯一地址,类似于网址。镜像仓库需要托管在某个 Registry,Registry 的作用类似于 GitHub。Docker 提供了一个官方的 Registry,官方 Registry 里的镜像仓库地址可以省去前面的域名前缀,其它 Registry 里的镜像仓库地址必须要指定域名前缀,以保证唯一性。

镜像仓库地址后面可以跟一个 TAG。比如一个镜像名称 ubuntu:14.04,冒号前面的 ubuntu 是镜像仓库地址(由于是官方 Registry 里的,可以省略域名前缀),后面的 14.04 是 TAG,TAG 通常设置为镜像的版本号。

Docker 镜像是分层存储的,每一个镜像都由多层组成。镜像之间会共享一些相同的层,从而可以减小所有镜像占用的存储空间。对于实验环境中的 docker 来说,其使用的存储驱动是 aufs,如下图所示:

aufs 是一种联合文件系统(UnionFS),理解其原理对于我们理解 Docker 镜像比较有帮助,有兴趣的同学可以学习 Linux 文件系统之 aufs

11 查看镜像列表

我们查看镜像可以使用如下命令:

$ docker image ls

也可以查看指定的镜像:

$ docker image ls ubuntu

12 查看镜像的详细信息

查看镜像的详细信息使用如下命令:

docker image inspect ubuntu

13 拉取镜像

从仓库中拉取镜像的命令如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

比较常用的配置参数为 -a,代表下载仓库中所有 TAG 的镜像,默认只下载 latest TAG 的镜像。

如果要下载 ubuntu:14.04 镜像,可使用如下命令:

$ docker image pull ubuntu:14.04

14 构建镜像

commit

此时,对于我们 pull 的新镜像 ubuntu:14.04 来说,如果我们需要对其进行更新,可以创建一个容器,在容器中进行修改,然后将修改提交到一个新的镜像中。

提交修改使用如下命令:

docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

该命令从一个修改过的容器创建一个新的镜像。例如,我们运行一个容器,然后在其中创建一个文件,最后使用 commit 命令:

# 使用 run 创建运行一个新命令

$ docker container run -it –name wanneng001 busybox /bin/sh

# 在运行的容器中创建两个文件,test1 和 test2

touch test1 test2

# 使用 ctrl + p 及 ctrl+q 键退出

# 使用提交命令,提交容器 wanneng001 的修改到镜像 busybox:test 中

$ docker container commit wanneng001 busybox:test

# 查看通过提交创建的镜像

$ docker image ls busybox

通过上述操作我们创建了一个新的镜像,但是本方法不推荐在生产环境使用,因为这种方式的可维护性很差。推荐的创建镜像的方法是使用 Dockerfile,修改镜像可通过修改 Dockerfile,然后使用新的 Dockerfile 来构建新的镜像。

BUILD

docker 可以从一个 Dockerfile 文件中读取指令来构建镜像。 Dockerfile是一个包含用户构建镜像所需命令的文本文件。在 创建好该文件后,我们可以使用如下命令来构建镜像:

docker image build [OPTIONS] PATH | URL

构建镜像的第一件事是将 Dockerfile 文件所在目录下的所有内容发送给 Docker 守护进程。所以最好创建一个新的目录,在其中保存 Dockerfile,并在其中添加构建镜像所需的其它文件。

对于一个 Dockerfile 文件内容来说,基本语法格式如下所示:

# Comment INSTRUCTION arguments

使用 # 号作为注释,指令(INSTRUCTION)不区分大小写,但是为了可读性,一般将其大写。Dockerfile 中的指令一般包含下面几个部分:

  1. 基础镜像:以哪个镜像为基础进行制作,使用 FROM 指令来指定基础镜像,一个 Dockerfile 必须以 FROM 指令启动。
  2. 维护者信息:可以指定该 Dockerfile 编写人的姓名及邮箱,使用 MAINTAINER 指令。
  3. 镜像操作命令:对基础镜像进行修改的命令,比如安装新的软件,进行配置等,常见的是 RUN 命令。
  4. 容器启动命令:基于该镜像的容器启动时需要执行的命令,常见的是 CMD 命令或 ENTRYPOINT

下面是一个最基本的 Dockerfile


# 指定基础镜像

FROM ubuntu:14.04

# 维护者信息

MAINTAINER wanneng/wanneng001@simplecloud.cn

# 镜像操作命令

RUN apt-get -yqq update && apt-get install -yqq apache2

# 容器启动命令

CMD [“/usr/sbin/apache2ctl”, “-D”, “FOREGROUND”]

通过阅读上述内容中我们熟悉的一些 linux 指令,可以很容易的知道该 Dockerfile 将创建一个 apache 镜像。

其中 FROM 指定基础镜像。RUN 命令默认使用 /bin/sh,并使用 root 权限执行。CMD 命令也是默认在 /bin/sh 中执行,但是只能有一条 CMD 指令,如果有多条则只有最后一条会被执行。

下面我们创建一个空目录,在其中编辑 Dockerfile 文件,然后基于此文件构建一个新的镜像:

# 首先创建目录并切换目录

$ mkdir /home/wanneng/test1 && cd /home、wanneng/test1

# 编辑 Dockerfile 文件,默认文件名为 `Dockerfile`,也可以使用其它值,使用其它值需要在构建时通过 `-f` 参数指定,这里我们使用默认值。并在其中添加上述示例的内容

$ vim Dockerfile # 使用 build 命令,`-t` 参数指定新的镜像

$ docker image build -t wanneng:1.0 .

在构建完成后,我们可以使用该镜像启动一个容器来运行 apache 服务,运行如下命令:

# 使用 -p 参数将本机的 8000 端口映射到容器中的 80 端口上。 $ docker container run -d -p 8000:80 –name wanneg002 wanneng:1.0

此时,容器启动成功后,并且配置了端口映射,我们就可以通过本机的 8000 端口访问容器 wanneng002 中的 apache 服务了。我们打开浏览器,输入 localhost:8000,显示结果如下图:

15 删除

删除 ubuntu:latest 镜像可以使用如下命令:

删除镜像

$ docker image rm ubuntu


copy
需要注意的是,如果该镜像正在被一个容器所使用,需要先将容器删除

入门日记运维DevOps

Docker简介与安装

2020-5-6 19:58:19

Linux基础入门日记

Centos7下安装和配置vim

2020-5-7 10:50:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索