要理解 Docker 内部构建,需要理解以下三大核心概念:

  • Docker 镜像 - Docker images
  • Docker 仓库 - Docker repository
  • Docker 容器 - Docker container

只有理解了这三个核心概念,才能顺利地理解Docker容器的整个生命周期。

Docker镜像

999 Docker镜像是Docker容器运行时的只读模板,镜像可以用来创建Docker容器。每一个镜像由一系列的层 (layers) 组成。Docker使用UnionFS(联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。)来将这些层联合到单独的镜像中。UnionFS允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker是如此的轻量。当你改变了一个Docker镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发Docker 镜像变得简单和快速。例如:centos镜像中安装nginx,就成了“nginx镜像”,其实在此时Docker镜像的层级概念就体现出来了。底层一个centos操作系统镜像,上面叠加一个nginx层,就完成了一个nginx镜像的构建。层级概念就不难理解,此时我们一般centos操作系统镜像称为nginx镜像层的父镜像。 image.png 镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。

不要将Docker仓库和仓库注册服务器(Registry)混为一谈。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。仓库注册服务器的示例如图所示。 image.png 根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。

当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。

Docker容器

Docker利用容器来运行应用,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker 容器都是从Docker 镜像创建的,是通过镜像创建的运行实例。Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台,彼此相互隔离、互不可见。

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

与虚拟机相比,容器有一个很大的差异,它们被设计用来运行"单进程",无法很好地模拟一个完整的环境。Docker设计者极力推崇“一个容器一个进程的方式”,如果你要选择在一个容器中运行多个进程,那唯一情况是:出于调试目的。容器是设计来运行一个应用的,而非一台机器。你可能会把容器当虚拟机用,但你将失去很多的灵活性,因为Docker提供了用于分离应用与数据的工具,使得你可以快捷地更新运行中的代码/系统,而不影响数据。

Docker命令操作指南

image.png

一. 使用Docker镜像

镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。

Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器的仓库),用户也可以通过配置,使用自定义的镜像仓库。

接下来将介绍更多关于docker images的内容,包括:

  • 使用和管理本地主机上的images
  • 创建一个基础的images
  • 上传images到docker hub (公共images仓库)
  • 列出本地主机上已经存在的images

1.1 搜索镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为docker search关键字,支持的参数主要包括:

  • -f, –filter filter 根据提供的条件过滤输出
  • –format string 使用Go模板进行漂亮的打印搜索
  • –limit int 最大搜索结果数(默认值25)
  • –no-trunc 不要截断输出
  • -f、–使用Go模板格式化字符串打印搜索–限制int最大搜索结果数(默认值25)
  • –no trunc不截断输出

例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,默认的输出结果将按照星级评价进行排序,如下所示:

# docker search   nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16591     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      121                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   39
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [OK]
rancher/nginx-ingress-controller                                                                  10
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4
bitnami/nginx-ldap-auth-daemon                                                                    3
bitnami/nginx-exporter                                                                            2
circleci/nginx                                    This image is for internal use                  2
rancher/nginx-ingress-controller-defaultbackend                                                   2
vmware/nginx                                                                                      2
vmware/nginx-photon                                                                               1
rancher/nginx                                                                                     1
bitnami/nginx-intel                                                                               1
wallarm/nginx-ingress-controller                  Kubernetes Ingress Controller with Wallarm e…   1
rancher/nginx-conf                                                                                0
rancher/nginx-ssl                                                                                 0
continuumio/nginx-ingress-ws                                                                      0
ibmcom/nginx-ppc64le                              Docker image for nginx-ppc64le                  0
rancher/nginx-ingress-controller-amd64                                                            0
ibmcom/nginx-ingress-controller-ppc64le           Docker Image for IBM Cloud Private-CE (Commu…   0
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   0
rancher/nginx-proxy                                                                               0
wallarm/nginx-ingress-controller-amd64            Kubernetes Ingress Controller with Wallarm e…   0
ibmcom/nginx-ingress-controller-s390x

#NAME:镜像名称

#DESCRIPTION:描述

#STARS:星级,代表受欢迎程度

#OFFICIAL:是否官方创建

#AUTOMATED:是否自动创建

1.2 获取镜像

镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。可以使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG]。其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息例如:[root[@docker01 ](/docker01 ) ~]# docker pull ubuntu:14.

[root@git ~]# docker pull ubuntu:14.
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete
95201152d9ff: Pull complete
5f63a3b65493: Pull complete
Digest:
sha256:63fce984528cec8714c365919882f8fb64c8a3edf23fdfa0b218a2756125456f
Status: Downloaded newer image for ubuntu:14.
docker.io/library/ubuntu:14.

对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。

下面的例子将从Docker Hub的Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像。

[root@docker01 ~]# docker pull ubuntu

从下载过程中可以看出,镜像文件一般由若干层(layer)组成,bae382666908这样的串是层的唯一id(实际上完整的id包括 256 比特,由 64 个十六进制字符组成)。使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储层的一份内容,减小了需要的存储空间。

严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,只是我们默认使用的是Docker Hub服务,该前缀可以忽略。例如, docker pull ubuntu:14.04命令相当于docker pull registry.hub.docker.com/ubuntu:14.04命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为14.04的镜像。

如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:14.04镜像,可以使用如下命令,此时下载的镜像名称为:hub.c.163.com/public/ubuntu:14.04 , 相应命令为:

$ docker pull hub.c.163.com/public/ubuntu:14.

1.3 查看镜像信息

使用docker images命令可以列出本地主机上已有镜像的基本信息。

[root@git ~]# docker images
REPOSITORY TAG IMAGE ID
CREATED SIZE
ubuntu 14.04 df043b4f0cf1 2
weeks ago 197MB
192.168.154.50:5000/liyi888/lamp latest a497bdf2133a 5
months ago 834MB
gitlab/gitlab-ce latest 3305b1332634 5
months ago 1.92GB
registry latest 708bc6af7e5e 8
months ago 25.8MB
192.168.154.50:5000/hello-world latest bf756fb1ae65 9
months ago 13.3kB

在列出的信息中,可以看到以下几个字段信息。

  • 来自于哪个仓库:比如ubuntu仓库用来保存ubuntu系列的基础镜像;
  • 镜像的标签信息:比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容;TAG信息用来标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本。
  • 镜像的ID(唯一标识镜像):如果镜像ID相同,说明实际上指向同一个镜像;在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID
  • 创建时间:说明镜像最后的更新时间;
  • 镜像大小:优秀的镜像往往体积都较小。镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。

为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。例如添加一个新的mynginx:latest镜像标签:

[root@docker01 devicemapper]# docker tag nginx:latest mynginx:latest
[root@docker01 devicemapper]# docker images

可以看到mynginx和nginx的镜像ID是一致的,它们实际上指向同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。

使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:

 docker inspect nginx

返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture:

[root@docker01 devicemapper]# docker inspect -f {{".Architecture"}} nginx
amd

使用history命令查看镜像历史

1 [root@docker01 devicemapper]# docker history nginx

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。

1.4 删除镜像

使用标签删除镜像使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。

例如,要删除掉mynginx:latest镜像,可以使用如下命令:

[root@docker01 devicemapper]# docker rmi mynginx
Untagged: myubuntu:latest

使用镜像ID删除镜像

1 [root@docker01 devicemapper]# docker rmi 747cb2d60bbe

当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。如果要想强行删除镜像,可以使用-f参数。注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

1.5 创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

基于已有镜像的容器创建

该方法主要是使用docker commit命令。命令格式为docker commit [OPTIONS] CONTAINER[REPOSITORY[:TAG]],主要选项包括:

  • -a, –author="":作者信息;
  • -c, –change=[]:提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m, –message="":提交消息;
  • -p, –pause=true:提交时暂停容器运行。

下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:

$ docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

记住容器的ID为a925cb40b3f0。此时该容器跟原ubuntu:14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:

$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f
test:0.
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f

顺利的话,会返回新创建的镜像的ID信息,例如9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。此时查看本地镜像列表,会发现新创建的镜像已经存在了:我们可以再做一个mariadb的数据库镜像先启动一个centos的容器

[root@docker01 ~]# docker run -it centos /bin/bash
[root@d0e74c7810dd /]#

然后在容器里面安装mariadb-server软件包

1 [root@d0e74c7810dd /]# yum install mariadb-server -y

当结束后,我们使用exit来退出,现在我们的容器已经被我们改变了,使用docker commit命令来提交相应的副本。

[root@docker01 ~]# docker commit -m "add mariadb server" -a "docker li"
d0e74c7810dd mariadb:1.
sha256:0b618ba65b672d80d48443e17891ca9a8f80d69048aae6334d4848855d40ef

可以查看到相应的mariadb镜像

1 [root@docker01 ~]# docker images

基于本地模板导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。命令格式为docker import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]。

要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为 http://download.openvz.org/template/precreated/

例如,下载了fedora-23-x86_64.tar.gz的模板压缩包,之后使用以下命令导入:

1 [root@docker01 ~]# cat fedora-23-x86_64.tar.gz | docker import - fedora:

然后查看新导入的镜像,会发现它已经在本地存在了:

1.6 存出和载入镜像

用户可以使用docker save和docker load命令来存出和载入镜像

存出镜像

如果要导出镜像到本地文件,可以使用docker save命令。例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,可以如下所示:

[root@docker01 ~]# docker save -o ubuntu_14.04.tar ubuntu:14.
[root@docker01 ~]# ls -lh ubuntu_14.04.tar
-rw------- 1 root root 189M Nov 7 15:39 ubuntu_14.04.tar
[root@docker01 ~]#

之后,用户就可以复制ubuntu_14.04.tar文件将该镜像分享给他人使用了

载入镜像

可以使用docker load将导出的tar文件再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表,如下所示:

[root@docker01 ~]# docker load --input ubuntu_14.04.tar
或者:
[root@docker01 ~]# docker load < ubuntu_14.04.tar

这将导入镜像及其相关的元数据信息(包括标签等)。导入成功后,可以使用docker images命令进行查看。

1.7 上传镜像

用户可以通过docker push命令,把自己创建的镜像上传到仓库中来共享。默认上传到Docker Hub官方仓库(需要登录),官网地址:https://hub.docker.com。

命令格式为:

docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
  1. 首先申请一个docker hub帐号

image.png

  1. 注册成功后,登录到docke hub点击一下按钮:create —> create repository ,取个名字,这里我们最终创建的仓库名称:lidnyun/kube-apiserver-amd64 ,这个lidnyun是帐号,kube-apiserver-amd64是其中一个仓库名。如图所示:

image.png

  1. 为存在于本地的镜像打标签,命令如下:
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

这里的tag不指定就是latest。 具体样例如下:

# docker tag gcr.io/google_containers/kube-apiserver-amd64:v1.5.5
lidnyun/kube-apiserver-amd64:v1.5.5
##lidnyun是步骤一提到的账户名
##kube-apiserver-amd64是步骤一提到的仓库名称
##v1.5.5是tag版本。
  1. 在本地登录docker hub帐号,命令如下:
root@master:~# docker login
Username: lidnyun
Password:
Email: 邮箱地址
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
  1. push镜像,命令如下:

docker push <hub-user>/<repo-name>:<tag>具体样例如下:

root@master:~# docker push lidnyun/kube-apiserver-amd64:v1.5.
The push refers to a repository [docker.io/lidnyun/kube-apiserver-amd64]
48ca1ee39728: Pushing [==> ]
6.097 MB/124.8 MB
c0de73ac9968: Pushing [==================================================>]
1.312 MB
v1.5.5: digest:
sha256:7dd91e4670b3563de04fee77c3206d84ca556ea88f95a40ee510ca2b77dc49d7 size:
739
  1. 可以有以下两种方式进行验证
  • 网址方式。登录到docker hub网站,查看一下刚才创建的仓库名称,如图:

image.png

  • 命令方式。通过命令拉取一下镜像看看是否成功。命令如下:docker pull /:,具体样例如下:
docker pull lidnyun/kube-apiserver-amd64:v1.5.5

二. docker容器

容器是docker的另一个核心概念。简单的说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,容器就是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell环境等。

本节将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

$ docker pull lidnyun/kube-apiserver-amd64:v1.5.

2.1 创建容器

新建容器

可以使用docker create命令新建一个容器,例如:

[root@docker01 ~]# docker create -it ubuntu:latest
ab85dc9f67eb068b3d22fd30fa1893008d833664f169e71a04e96e26d1bd72f
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab85dc9f67eb ubuntu:latest "/bin/bash" 9 seconds ago Created
dreamy_wing
  • -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -i 选项让容器的标准输入保持打开(即交互式)
  • –name 可以给容器起个形象的名称

启动容器

使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

[root@docker01 ~]# docker start dreamy_wing
dreamy_wing
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
ab85dc9f67eb ubuntu:latest "/bin/bash" 7 minutes ago Up 6 seconds
dreamy_wing

新建并启动容器

可以直接新建并启动容器,所需命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。下面的命令输出一个“Hello World”,之后终止容器。

[root@nextcloud ~]# docker run -it ubuntu:latest /bin/echo 'hello world'
hello world

这跟在本地直接执行 /bin/echo ‘hello world’ 几乎感觉不出任何区别。当利用docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从网桥的地址池配置一个IP地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

下面的命令则启动一个 bash 终端,允许用户进行交互。

[root@nextcloud ~]# docker run -it ubuntu:latest /bin/bash
root@1b90760520d0:/#

在交互模式下,用户可以通过所创建的终端来输入命令,例如

root@1b90760520d0:/# apt-get update
root@1b90760520d0:/# apt-get install iproute2 net-tools
root@1b90760520d0:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state
UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth
valid_lft forever preferred_lft forever

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用ps或 top 来查看进程信息。

root@1b90760520d0:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
635 pts/0 00:00:00 ps

可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。如果这个时候我们正常退出,输入exit 或者Ctrl+d命令后,容器就自动处于退出(Exited)状态了。docker ps –a 查看容器处于Exit 状态。

[root@nextcloud ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
1b90760520d0 ubuntu:latest "/bin/bash" 21 minutes
ago Exited (0) 9 seconds ago blissful_cray

也可以退出容器而不结束容器进程,输入Ctrl-q + Ctrl-p ,就像先按 CTRL -p 然后 CTRL –q 退出伪终端,而不结束容器。

[root@nextcloud ~]# docker run -it ubuntu:latest /bin/bash
root@9c791b5c1bc0:/# [root@nextcloud ~]#
[root@nextcloud ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
9c791b5c1bc0 ubuntu:latest "/bin/bash" 36 seconds
ago Up 35 seconds heuristic_perlman

发现退出容器了,但是容器依然在运行,可以随时进入容器:

[root@nextcloud ~]# docker exec -it heuristic_perlman /bin/bash
root@9c791b5c1bc0:/#

守护态运行

更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d参数来实现。例如下面的命令会在后台运行容器。

[root@nextcloud ~]# docker run -d centos:latest /bin/sh -c "while true;do
echo weibo; sleep 1;done"
4dcb6f572bc5726fb091f5320dfcebdbd137015ffc7f322f89ae411bbffdf39d
[root@nextcloud ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
4dcb6f572bc5 centos:latest "/bin/sh -c 'while t..." 4 seconds
ago Up 3 seconds tender_villani
9c791b5c1bc0 ubuntu:latest "/bin/bash" 4 minutes
ago Up 4 minutes heuristic_perlman
d3487007f196 nginx:latest "/docker-entrypoint...." 19 minutes
ago Up 19 minutes 80/tcp test

此时,如果要获取容器的输出信息,可以使用docker logs命令

[root@nextcloud ~]# docker logs 4dcb6f572bc
weibo
weibo
weibo
.......

2.2 常用容器操作命令:

[root@docker01 ~]# docker stop d17f8988a49e 停止一个容器
[root@docker01 ~]# docker start d17f8988a49e 启动一个容器
[root@docker01 ~]# docker restart d17f8988a49e 重启一个容器
[root@docker01 ~]# docker inspect d17f8988a49e 查看容器详细信息

可以使用inspect查看容器IP地址:

[root@nextcloud ~]# docker inspect -f '{{.NetworkSettings.IPAddress}}'
4dcb6f572bc
172.17.0.

还可以查看主机名

[root@nextcloud ~]# docker inspect -f '{{.Config.Hostname}}' 4dcb6f572bc
4dcb6f572bc

2.3 进入容器

在使用 -d 参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或docker exec命令。

使用docker attach进入容器

[root@nextcloud ~]# docker attach 4dcb6f572bc
weibo
weibo
weibo
  • docker attach 允许我们进入后台进程;
  • –sig-proxy=false 不使用容器转发信号,允许我们使用 ctrl -c 来退出,执行docker ps查看在后台运行

但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

[root@nextcloud ~]# docker attach --sig-proxy=false 4dcb6f572bc
weibo
weibo
weibo
^C

可以执行docker exec进入运行的容器

格式:docker exec -it 容器ID/名称 /bin/bash以上命令返回一个命令界面,exec代表直接在容器中运行命令

[root@nextcloud ~]# docker exec -it 9c791b5c1bc0 /bin/bash
root@9c791b5c1bc0:/# pwd
/

2.4 容器导入和导出

导出容器

格式:docker export [容器 id] > [导出文件]如果要导出本地某个容器,可以使用docker export 命令。

[root@nextcloud ~]# docker export d3487007f196 > nginx.tar

这样将导出容器快照到本地文件

[root@nextcloud ~]# ls nginx.tar
nginx.tar

导入容器

可以使用docker import ,从容器快照文件中再导入为镜像

[root@nextcloud ~]# cat nginx.tar | docker import - centos:test
sha256:c99474903125e82bbe00391ccb0823380bb8b83b05bd01295b42fbd2dee7312f
[root@nextcloud ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
centos test1 c99474903125 10 seconds ago
149MB
nginx latest 7baf28ea91eb 2 days ago
133MB
centos latest 300e315adb2f 6 days ago
209MB
ubuntu latest f643c72bc252 2 weeks ago
72.9MB
nextcloud latest c664af0d9c67 3 weeks ago
807MB
hello-world latest bf756fb1ae65 11 months ago
13.3kB

此外,也可以通过指定 URL 或者某个目录来导入,例如

备注:用户既可以使用docker load 来导入镜像存储文件到本地镜像库,也可以使用docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

$ docker import http://example.com/exampleimage.tgz example/imagerepo

2.5 删除容器

  • 可以使用docker rm来删除一个处于终止状态的容器。
  • 如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送SIGKILL信号给容器。
# docker rm [容器 id/容器 name]
批量删除多个容器
# docker rm $(docker ps –a –q)