1、什么是容器
镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,基于同一镜像可以创建若干个不同的容器。
每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环境打包而成的集装箱。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,容器进程在属于自己的独立的命名空间内进行。
2、容器的基本信息
使用docker ps -a命令可以输出本机上的全部容器列表
[root@docker-2322030238 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd0ba3b089e49 ubuntu "/bin/bash" 5 weeks ago Exited (0) 5 weeks ago elastic_kepler446cd6f8f8cc hello-world "/hello" 5 weeks ago Exited (0) 5 weeks ago brave_swartz
上述列表反映了容器的基本信息。CONTAINER ID列表示容器ID,IMAGE列表示容器所用镜像的名称,COMMAND列表示启动容器时执行的命令,CREATED列表示容器的创建时间,STATUS列表示容器运行的状态(UP表示运行中,Exited表示已停止),POPTS列表示容器对外发布的端口号,NAMES列表示容器名称。
容器ID能保证唯一性,但难于记忆,因此可以通过容器名称来代替容器ID引用容器。可以在执行docker run命令时通过--name选项自行指定。还可以使用docker rename命令为现有容器重命名。
docker rename d0ba3b089e49 ubuntu_server
3、可写的容器层
容器与镜像的主要不同之处是容器顶部的可写层。一个镜像由多个可读的镜像层组成,正在运行的容器会在这个镜像上面增加一个可写的容器层,所有写入容器的数据(包括添加的新数据或修改的已有数据)都保存在这个可写层中。当容器被删除时,这个可写层也会被删除,但是底层的镜像层保持不变。因此,任何对容器的操作均不会影响到其镜像。
由于每个容器都有自己的可写容器层,所有的改变都存储在这个容器层中,因此多个容器可以共享访问同一个底层镜像,并且仍然拥有自己的数据状态。
4、磁盘上的容器大小
使用docker ps -s 命令查看一个运行中的容器的大小,SIZE 列会显示两个不同的值
[root@docker-a ~]# docker run -d httpd495355dcccdb5ff7f0a52a1dd3ff231daa590b7cd16b99911a5bec6b64a88975# 查看该容器的大小CONTAINER ID IMAGE COMMAND ... NAMES SIZE495355dcccdb httpd "httpd-foreground" ... peaceful_pike 2B (virtual 148MB)
SIZE列第1个值表示每个容器的可写层当前所用的数据大小。第2个值是虚拟大小,表示该容器所用只读镜像的数据量加上容器可写层大小的和。
磁盘上正在运行的容器所用的磁盘空间是每个容器大小和虚拟大小值的总和。
5、写时复制策略
写时复制是一个高效率的文件共享和复制策略。共享有助于减小镜像大小。复制使容器效率更高。
大致步骤:
1、从镜像各层中搜索要修改的文件,从最新的层开始直到最底层,一次一层,被找到的文件将被添加到缓存中以加速后续操作。
2、对找到文件的第1个副本执行copy up操作,将其复制到容器的可写层中。
6、容器操作指令
Docker 提供了相当多的容器操作命令,既包括创建、启动、停止、删除、暂停等容器生命周期管理操作。
Docker还提供了一个统一的容器管理命令docker container,基本语法如下:
docker container 子命令
docker container子命令 | docker子命令 | 功能 |
---|---|---|
docker container attach | docker attach | 进入容器 |
docker container commit | docker commit | 从当前容器创建新的镜像 |
docker container cp | docker cp | 在容器和本地文件系统之间复制文件和目录 |
docker container create | docker create | 创建新的容器 |
docker container diff | docker diff | 检查容器创建以来其文件系统上文件或目录的更改 |
docker container exec | docker exec | 从正在运行的容器中执行命令 |
docker container export | docker export | 将容器的文件系统导出为一个归档文件 |
docker container inspect | docker inspect | 显示一个或多个容器的详细信息 |
docker container kill | docker kill | 杀死”一个正在运行的容器 |
docker container logs | docker logs | 获取容器的日志信息 |
docker container ls | docker ps | 输出容器列表 |
docker container pause | docker pause | 暂停一个或多个容器内的所有进程 |
docker container port | docker port | 列出容器的端口映射或特定的映射 |
docker container prune | 无 | 删除所有停止执行的镜像 |
docker container rename | docker rename | 对容器重命名 |
docker container restart | docker restart | 重启一个或多个容器 |
docker container rm | docker rm | 删除一个或多个容器 |
docker container run | docker run | 创建一个新的容器并执行命令 |
docker container start | docker start | 启动一个或多个已停止的容器 |
docker container stats | docker stats | 显示容器资源使用统计信息的实时流 |
docker container stop | docker stop | 停止一个或多个正在运行的容器 |
docker container top | docker top | 显示容器正在运行的进程 |
docker container unpause | docker unpause | 恢复一个或多个容器内被暂停的所有进程 |
docker container update | docker update | 更新一个或多个容器的配置 |
docker container wait | docker wait | 阻塞一个或多个容器的运行,直到容器停止运行,然后输出 |
7、操作
7.1、创建并同时启动容器
使用docker run命令运行一个容器,基本语法:
docker run[选项]镜像[命令][参数···]
-d(--detach):后台运行容器,并返回容器ID。
-i(--interactive):让容器的标准输入保持打开,通常与-t选项同时使用。
-t(--tty):为容器重新分配一个伪输入终端(Pseudo TTY),通常与-i选项同时使用。
-p(--publish):设置端口映射,格式为“主机端口:容器端口”。
--dns:指定容器使用的DNS服务器,默认和主机上的DNS设置一致。
--name:为容器指定一个名称。
--rm:容器退出时自动删除。
# 启动容器执行命令后自动终止容器,不常用,主要用来测试[root@docker-a ~]# docker run ubuntu /bin/echo "这是一个自动终止的容器"这是一个自动终止的容器# 启动容器并允许用户交互# 将-1和-t两个选项合并在一起,-t让Docker分配一个伪终端并绑定到容器的标准输入中,则让容器的标准输入保持打开状态,自动进入容器的交互模式,此时可通过终端执行命令[root@docker-a ~]# docker run -it ubuntu /bin/bashroot@d9778e5b51e2:/# root@d9778e5b51e2:/# ls # 列出当前目录下的文件bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr varroot@d9778e5b51e2:/# exit # 退出容器exit# 启动容器并让其以守护进程的形式在后台运行[root@docker-a ~]# docker run -d -p 80:80 --name testweb httpd # 启动-个Web服务器的容器8320b75a0036c01bc5d1ffda24fbcaa92ad2f61c0a3d81164fb78b9c0563ce5b# 容器启动后在后台运行,并返回一个唯一的容器ID,可以通过该ID 对容器进行进一步操作。也可以通过docker ps命令来查看正在运行的容器的信息[root@docker-a ~]# docker psCONTAINER ID IMAGE ... STATUS PORTS NAMES8320b75a0036 httpd ... Up 48 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp testweb# 由于在后台运行,容器不会将输出直接显示在主机上,使用 docker logs 命令来获取容器的输出信息[root@docker-2322030238 ~]# docker logs testwebAH00558: httpd: Could...
执行docker run命令创建并启动容器时,Docker在后台运行的操作步骤如下:
- 检查本地是否存在指定的镜像,如果没有就从镜像仓库自动下载这个镜像。
- 基于镜像创建一个容器并启动它。
- 为容器分配一个文件系统,并在镜像层顶部增加一个可读写的容器层。
- 从主机配置的网桥接口中将一个虚拟接口桥接到容器。
- 从网桥的地址池中给容器分配一个IP地址。
- 运行用户指定的应用程序。
- 根据设置决定是否终止容器运行。
这种在后台运行容器的方式又称分离(Detached)模式,与之相对的是前台(Foreground)模式。
7.2、创建容器
使用docker create 命令创建一个新的容器,但不启动它,其基本语法
docker create[选项] 镜像 [命令][参数···]
# 基于busybox镜像创建一个容器[root@docker-a ~]# docker create -i -t busyboxUnable to find image 'busybox:latest' locallylatest: Pulling from library/busybox7b2699543f22: Pull complete Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966Status: Downloaded newer image for busybox:latestdb0b8744590de26b9c4df8ea942fc06d2499770314dc7c44541687c082749208
这个容器处于已创建(Created)但未启动的状态,最后一行返回的是容器ID,可以使用docker start命令启动容器
7.3、启动容器
使用docker start命令启动一个或多个处于停止状态的容器,其基本语法
docker start[选项]容器[容器…]
# 启动上述容器
[root@docker-a ~]# docker start db0b8744...
db0b8744...
运行中的容器,可以使用docker restart命令重新启动它。
7.4、停止容器
使用docker stop命令停止一个或多个处于运行状态的容器,其基本语法
docker stop [选项]容器[容器···]
# 停止上述容器
[root@docker-a ~]# docker stop db0b8744...
db0b8744...
也可以使用 docker pause命令暂停容器中所有的进程
docker unpause命令,恢复容器中被暂停的所有进程
还可以使用docker kill命令“杀死(强制停止)”一个或多个容器。
docker kill [选项]容器[容器…]
7.5、重命名容器
使用docker rename命令为现有的容器重新命名,以便于后续的容器操作,基本语法
docker rename 容器 容器名称
[root@docker-a ~]# docker run -d httpd
36801b2a29907a711eb89affbdc28d8c4f5111ea53eadffcc14829f940f71390
[root@docker-a ~]# docker rename 36801b2a29907a711 myweb
[root@docker-a ~]# docker ps -l
CONTAINER ID IMAGE ... STATUS PORTS NAMES
36801b2a2990 httpd ... Up 31 seconds 80/tcp myweb
7.6、显示容器列表
使用docker ps命令显示容器列表,基本语法
docker ps [选项]
主要选项说明如下。
-a(--all):显示所有的容器,包括未运行的容器。
-f(--filter):根据条件过滤显示的容器。
-l(--latest):显示最近创建的容器。
-n(--lastint):列出最近创建的n个容器。
--no-trunc:不截断输出,显示完整的容器信息。
-q(--quiet):采用静默模式,只显示容器ID。
-s(--size):显示总的文件大小。
不带任何选项执行该命令会列出所有正在运行的容器信息。可以使用-a选项列出所有的容器
[root@docker-a ~]# docker ps -a
CONTAINER ID IMAGE STATUS ... PORTS NAMES
36801b2a2990 httpd Up 2 minutes ... 80/tcp myweb
...
-f选项可以通过多种条件过滤容器,如id(容器ID)、name(容器名称)、label(由键值对定义的元数据)、status(状态,可用值有created、restarting、running、removing、paused、exited、dead等。
# 列出了已停止的容器
[root@docker-2322030238 ~]# docker ps --filter status=exited
CONTAINER ID IMAGE ... STATUS PORTS NAMES
db0b8744590d busybox ... Exited (137) 10 minutes ago modest_feistel
...
通过shell命令替换docker ps命令可以完成容器的批量操作。
# 暂停正在运行的所有容器
docker pause $(docker ps -f status=running -q)
7.7、查看容器详细信息
使用docker inspect命令来查看容器的详细信息,也就是元数据。
[root@docker-a ~]# docker inspect --format='{{.Name}}' 36801b2a2990
/myweb
通过JSON格式的State子节获取容器的状态元数据。
[root@docker-a ~]# docker inspect --format='{{json .State}}' myweb
{"Status":"paused","Running":true...
7.8、进入容器
方法一:使用docker attach命令连接到正在运行的容器,其语法格式
docker attach [选项] 容器
# 连接到一个运行中的容器并从中退出的过程
[root@docker-a ~]# docker run -d --name topdemo ubuntu /usr/bin/top -b
73c97d3a43c30c0c4b03574c3a79a56e5da66d372c36427769eaf5c5db9026d3
[root@docker-2322030238 ~]# docker attach topdemo
...
top - 10:07:41 up
...
[root@docker-a ~]# docker ps -a | grep topdemo
73c97d3a43c3 ubuntu "/usr/bin/top -b" 39 seconds ago Exited (0) 13 seconds ago topdemo
按 Ctrl+C 组合键不仅会从容器退出(脱离容器),而且会导致容器停止。要使容器依然运行,就需要在执行Docker run 命令运行容器时加上--sig-proxy=false 选项,确保按 Ctrl+C 组合键或Ctrl+D组合键不会停止容器
docker attach --sig-proxy=false topdemo
这个命令比较过时,更多的Docker用户会考虑使用docker exec命令来实现相同的功能
方法二:使用docker exec命令在正在运行的容器中执行命令,其语法格式
docker exec [选项]容器 命令[参数···]
-d选项表示分离模式, 在后台运行命令;-i选项表示即使没有连接上也保持标准输入处于打开状态是一种交互模式;-t选项用于分配一个伪终端。
# 进入一个运行中的容器,交互执行命令,并从容器中退出的过程
[root@docker-2322030238 ~]# docker start topdemo
topdemo
[root@docker-2322030238 ~]# docker exec -it topdemo /bin/bash
root@73c97d3a43c3:/# psPID TTY TIME CMD7 pts/0 00:00:00 bash15 pts/0 00:00:00 ps
root@73c97d3a43c3:/# exit
exit
[root@docker-2322030238 ~]#
7.9、删除容器
使用docker rm命令删除一个或多个容器,基本语法
docker rm [选项] 容器 [容器…]
默认情况下,只能删除没在运行的容器。要删除正在运行的容器,需要使用-f(--force)选项通过SIGKILL信号强制删除:
[root@docker-2322030238 ~]# docker rm -f topdemo
topdemo
还有两个选项与网络连接和数据卷有关:-l(--link)选项设置是否删除容器的网络连接,而保留容器本身;-v(--volumes)选项设置是否删除与容器关联的卷。