容器
(Container)是Docker
的核心组件之一,它是用于运行镜像
的一个沙箱环境,是一个从镜像
创建的应用运行实例,镜像
打包、构建完成后最终都会运行于容器
中。容器
具有良好的隔离性,容器
之间是相互隔离、互不可见。本文将介绍Docker
容器的创建与管理,并以容器的生命周期为主线介绍容器的创建、管理、停止,到最终删除。
-
检查
Docker
状态 -
创建、运行
Docker
容器-
2.1
docker run
创建并运行容器 - 2.2 容器的交互
- 2.3 命名容器
- 2.4 创建守护式容器
-
2.1
-
容器的一些操作
- 3.1 容器的启动
- 3.2 附着到容器
- 3.3 容器日志查看
- 3.4 容器内进程查看
- 3.5 容器内运行进程
- 3.6 容器状态查看
- 3.7 容器详细信息
- 停止容器
- 删除容器
1. 检查Docker
状态
首先,检查下Docker
是否存在,运行状态是否正常:
$ sudo docker info Containers: 1 Running: 1 Paused: 0 Stopped: 0 Images: 1 Server Version: 1.13.0 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 4.9.4-moby Operating System: Alpine Linux v3.5 OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 1.952 GiB Name: moby ID: JUX2:WLWM:UFGS:PWPS:INCJ:ETK4:RIAW:DXGO:5MZS:3UCW:XO7E:NFLV Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): true File Descriptors: 23 Goroutines: 32 System Time: 2017-01-27T00:46:27.630232318Z EventsListeners: 1 No Proxy: *.local, 169.254/16 Registry: https://index.docker.io/v1/ Experimental: true Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false
在这里,我们通过docker info
命令来检查Docker
状态信息。其返回信息包括:所有容器数量及各运行状态的容器数量、镜像数量、存储驱动等。
注:Docker
命令格式为docker COMMAND
,可以通过docker help
、docker --help
或docker
查看Docker
的使用帮助页;还可以通过docker COMMAND --help
或docker help COMMAND
查看每个COMMAND
的帮助信息。
2. 创建、运行Docker
容器
2.1 docker run
创建并运行容器
运行一个Docker
容器使用docker run
命令,该命令提供了Docker
容器的创建和启动功能。
运行一个Ubuntu
容器:
$ sudo docker run -i -t ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 8aec416115fd: Pull complete 695f074e24e3: Pull complete 946d6c48c2a7: Pull complete bc7277e579f0: Pull complete 2508cbcde94b: Pull complete Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950 Status: Downloaded newer image for ubuntu:latest
docker run
命令格式如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
在这个命令中,我们执行了docker run
命令,并指定了-i
、-t
两个参数。其中,-i
是保证容器STDIN
是开启状态;-t
是告诉Docker
为创建的容器分配一个伪TTY
终端。这样我们就创建了一个能在命令行下与之交互的容器。
然后,我们告诉Docker
使用什么镜像来创建容器。在本例中,我们使用了ubuntu
镜像。ubuntu
镜像是Docker
官方提供的一个基础(base)镜像,存储于Docker Hub Registry
上。基础镜像又称为常备镜像,类似的镜像还有centos
、debian
、fedore
等,我们可以以这些镜像为基础的操作系统,并在此之上构建自己的镜像。在本例中,我们只以基础镜像启动了一个容器,并没有对容器增加其它东西。
最后,告诉Docker
要在容器中执行什么命令及命令的参数。在本例中,我们运行了/bin/bash
。容器创建完毕之后,就会执行/bin/bash
命令,这时我们就可以看到类似如下界面:
root@af2099536638:/#
docker run
命令的执行过程下:
- 首先检查本地是否
ubuntu
镜像 - 如果没有,连接
Docker Hub Registry
查看是否有名为ubuntu:latest
镜像的镜像,该镜像指向latest LTS
- 找到镜像,将镜像下载到本地
-
Docker
在文件系统内部使用这个镜像创建一个新容器,这个容器会有自已的网络、IP地址以及一个与本地宿主机通讯的桥接网络接口 - 容器创建完成后,执行所要执行的命令
注:docker run
命令的所有运行参数,可以通过docker run --help
或docker help run
查看。
2.2 容器的交互
在前面,我创建了一个交互式容器。创建完成后,就已经以root
用户登录到了新创建的容器中,容器的ID是af2099536638
。
创建容器时,我们使用了基础镜像ubuntu
,因此所创建的容器也是一个具有完整功能的Ubuntu
系统,而容器的ID就是所创建容器的主机名:
root@af2099536638:/# hostname af2099536638
检查/etc/hosts
文件:
root@af2099536638:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 af2099536638
Docker
为该主机的添加了一条主机配置项。
像普通主机一样,我们也可以在容器中安装软件:
root@af2099536638:~# apt-get update & apt-get install vim
在容器中工作结束后,可以通过exit
命令退出并返回宿主机:
root@af2099536638:~# exit exit
退出后,/bin/bash
程序结束,容器也会随之停止。这时,可以通过docker ps
查看容器列表:
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af2099536638 ubuntu "/bin/bash" 4 hours ago Exited (0) 5 minutes ago thirsty_shaw
docker ps
命令只能看到正在运行中的容器,查看所有容器需要增加-a
参数。通过docker ps
命令,还可以看到很多容器信息,如:容器ID、创建容器的镜像、创建时间、运行/退出状态(如果退出状态是0,则表示容器是正常退出,如上例)等。
注意:docker ps
命令,除-a
参数外,常用的还有-l
参数,用于列出最后一个运行的容器(无论容器是否运行)。更多参数请使用docker help ps
或docker ps --help
查看。
2.2 docker create
创建但不运行容器
docker run
命令会创建并运行容器,如果仅想创建但不运行容器,可以使用docker create
命令:
$ sudo docker create ubuntu 7d31bae2b5fa86675de61ad3473bf05c95ce28c26b915a434991efa966042b07
使用docker create
创建不运行容器,可以方便我们进行一些精细化的控制。如上所示,创建成功后会返回所创建容器的UUID,该UUID是一个长UUID,可以使用该ID做为容器标识,进行后续操作。
2.3 命名容器
创建容器时,如果不指定名称,Docker
会为容器指定一个随机名称,如,在前面示例中容器名为thirsty_shaw
。如果需要为容器指定一个名称,可以在创建容器时添加--name
参数。
如,创建并命名容器:
$sudo docker run -i -t --name itbilu_ubuntu ubuntu /bin/bash root@0f5a0e713219:/#
这样我们就创建了一个名为itbilu_ubuntu
的容器。容器的短UUID、长UUID、名称都可以做为容器的标识使用,但名称会比随机生成的名称或容器ID要好记,和易于管理。大多数docker
命令都可以使用名称代替ID,更推荐使用容器名称来代替ID使用,以更方便的进行管理。
容器命名必须唯一,如果名称重复时会创建失败。这时,可以傅和docker rm
命令先将容器移除再重新创建。
2.4 创建守护式容器
与容器存在交互式会话的容器,称之为交互式容器(interactive container)。除交互式容器容器外,还可以创建没有交互会话的、长期运行的守护式容器(daemonized container)。实际上,我们使用容器在后台运行程序或服务,大多时候创建的都是守护式容器。
如,创建一个守护式容器:
$ sudo docker run --name daemon_ubuntu -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 04e31cefe605bd3636a4d3908fd0083421b1c6d321e4f07beabfead4b633a528
在这个示例中,我们创建了一个名为daemon_ubuntu
的容器。创建容器时,我们使用了-d
参数,这个参数会告诉Docker
在后台运行容器。这个容器创建成功后,不会进入shell
会话,而是会返回容器的UUID。
在这个容器中,我们还使用了一个while
循环,这个循环会每秒打印一次hello world
。
通过docker ps
命令,可以看到这个容器:
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 04e31cefe605 ubuntu "/bin/sh -c 'while..." 14 hours ago Up 5 minutes daemon_ubuntu
容器的自动重启
容器可能会由于某些错误而异常退出,默认情况下容器停止后不会自动重启。在运行容器时,可以设置--restart
参数,容器退出时,--restart
参数会检查容器的退出代码,并依此决定是否重启容器。该参数默认值为no
,即:不会自动重启。可选值有:
-
always
- 无论容器的退出代码是什么总是在退出后自动重启 -
no-failure[:NUM]
- 退出代码非0
时才自动重启。该参数还接受一个可选的NUM
参数,表示尝试重启的次数
如,创建一个总是在退出后自动重启的守护式容器:
$ sudo docker run --restart=always --name daemon_ubuntu -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
如,创建一个守护式容器,异常退出后尝试自动重启5次:
$ sudo docker run --restart=no-failure:5 --name daemon_ubuntu -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
3. 容器的一些操作
3.1 容器的启动
容器停止后,可以通过docker start
或docker restart
重新启动容器。
如,启动容器itbilu_ubuntu
:
$ sudo docker start itbilu_ubuntu itbilu_ubuntu
启动后就可以通过docker ps
而不用加-a
参数看到刚启动的容器。
3.2 附着到容器
通过docker run
命令并添加-i
、-t
启动了一个交互式的shell。但容器退出后,再通过docker start
命令启动时后,容器会在后台运行。这时,可以通过docker attach
命令重新附着到容器的会话上:
$ sudo docker attach itbilu_ubuntu root@0f5a0e713219:/#
命令输入完成,并回车确认,即可进行会话界面。需要注意的是docker attach
只有容器处理运行状态的容器才会附着成功。而退出容器shell后,容器会再次停止。
3.3 容器日志查看
在2.4节中,我们创建一个在后台运行的守护式容器。在这个容器中,每秒会输出一次hello world
到STDOUT
。为了获取容器的日志信息,可以使用docker logs
命令。
docker logs
命令格式如下:
docker logs [OPTIONS] CONTAINER
如,查看容器daemon_ubuntu
的日志信息:
$ sudo docker logs daemon_ubuntu hello world hello world hello world …
在上例中,会看到容器的所有日志信息。查看日志时,还可以添加-f
参数,该参数类似tail -f
命令,会看到实时看到日志输出。
$ sudo docker logs -f daemon_ubuntu hello world hello world hello world …
为了显示更为友好,还可以通过--tail
参数指定最后显示的日志行数。如,查看最后5行日志:
$ sudo docker logs -f --tail 5 daemon_ubuntu hello world hello world hello world hello world hello world ……
注:请使用docker help logs
或docker logs --help
查看日志的详细参数
3.4 容器内进程查看
对容器进行管理时,有时会需要查看容器内正在运行的进程。容器内进程查看可以使用docker top
命令。
如,查看容器daemon_ubuntu
内的进程:
$ sudo docker top daemon_ubuntu PID USER TIME COMMAND 16411 root 0:03 /bin/sh -c while true; do echo hello world; sleep 1; done
在这个容器中,我们只运行了一个用于打印日志的/bin/sh
进行。通过docker top
命令,可以看到进行的PID
、进程用户等。
3.5 容器内运行进程
不仅可以查看容器内正在运行的进程,通过docker exec
命令还可以启动新进程。在容器内启动的进程分为两类:后台任务和交互式任务。后台任务运行于容器内部没有交互需要。而交互式任务则会保持在前台,如果需要在容器内打开shell
,则很适用创建交互式任务。
docker exec
命令格式如下:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
如果要创建后台任务,则需要在执行docker exec
命令时指定-d
参数。
如,在容器daemon_ubuntu
内创建一个空的配置文件:
$ sudo docker exec -d daemon_ubuntu touch /etc/a_config_file
创建交互式任务,与运行交互式容器时一样,需要添加-t
、-i
参数。如:
$ sudo docker exec -t -i daemon_ubuntu /bin/bash root@04e31cefe605:/#
创建交互式任务并退出后,并不会导致守护式容器的停止。
注意:docker exec
命令在Docker 1.3+
版本才可用。docker exec
使用说明及详细参数请使用docker help exec
或docker exec --help
查看。
3.6 容器状态查看
在查看容器内进程时,我们使用了docker top
命令。除此之外,还可以使用docker stats
来查看容器的详细使用统计信息,该命令可以同时查看一个或多个容器的统计信息。
如,查看容器daemon_ubuntu
的使用统计:
$ sudo docker stats daemon_ubuntu
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS daemon_ubuntu 0.08% 616 KiB / 1.952 GiB 0.03% 15 kB / 1.35 kB 0 B / 0 B 2
docker stats
与docker top
统计内容有所不同,统计内容包括:CPU、内存、网络I/O、存储I/O使用情况等。统计形式也有所不同,docker stats
是实时统计。
docker stats
可以同时统计多个容器的使用情况,指定多个需要统计的容器ID或名称即可,也可以通过-a
参数对所有容器进行统计:
$ sudo docker stats daemon_ubuntu itbilu_ubuntu
注意:docker stats
命令在Docker 1.5+
版本才可用。docker stats
使用说明及详细参数请使用docker help stats
或docker stats --help
查看。
3.7 容器详细信息
通过docker ps
命令,我们可以看到容器的一些基本信息。除此之外,docker
还提供了一个docker inspect
命令,该命令会返回容器的详细配置信息。包括:名称、命令、运行状态、网络配置等。
其语法格式如下:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
如,查看容器daemon_ubuntu
的详细信息:
$ sudo docker inspect daemon_ubuntu [ { "Id": "04e31cefe605bd3636a4d3908fd0083421b1c6d321e4f07beabfead4b633a528", "Created": "2017-01-27T12:54:11.923454273Z", "Path": "/bin/sh", "Args": [ "-c", "while true; do echo hello world; sleep 1; done" ], "State": { "Status": "running", …
docker inspect
命令有一个很有用的参数-f
或--format
,这个参数支持完整的GO
语言模板,可以对输出结果进行格式化、筛选等。
如,查看容器daemon_ubuntu
的运行状态:
$ sudo docker inspect -f '{{.State.Running}}' daemon_ubuntu true
如,查看容器daemon_ubuntu
的IP地址:
$ sudo docker inspect -f '{{.NetworkSettings.IPAddress}}' daemon_ubuntu 172.17.0.2
4. 停止容器
停止守护式容器时,需要手工调用docker stop
命令。停止容器时,
如,停止容器daemon_ubuntu
:
$ sudo docker stop daemon_ubuntu
也可以使用容器ID:
$ sudo docker stop 04e31cefe605
停止容器时,docker stop
命令会向容器进程发送SIGTERM
信号,收到该信号进程完成处理后结束。如果想快速停止可以使用docker kill
,该命令会向容器进程发送SIGKILL
信号。
5. 删除容器
容器不再使用后,可以使用docker rm
命令将其删除。
如,删除容器daemon_ubuntu
:
$ sudo docker rm daemon_ubuntu
如果容器正在运行中,会删除失败。这时,可以先使用docker stop
命令停止容器后再删除。或者使用-f
参数强制删除:
$ sudo docker rm -f daemon_ubuntu
相关推荐
### 掌握 Docker 容器管理:优雅地停止和删除的艺术 #### Docker 容器管理基础知识 Docker 是一种革命性的技术,它提供了一种全新的方式来打包、部署和运行应用程序。通过容器化,开发人员可以将应用程序及其依赖...
详细描述了如何进度docker容器,以及详细描述了如何退出docker容器而不会导致容器退出,本文只是记录平时遇到的问题解决方案
镜像是 Docker 容器技术的基础,下面是镜像管理的常用命令: * `docker search keyword`:搜索镜像。 * `docker pull imageName`:拉取镜像。 * `docker images`:查看镜像列表。 * `docker rmi imageName`:删除...
本文介绍了Docker如何进入启动容器,分享给大家,具体如下: ...docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[=true]] Container 支持三个主要选项: ·–detach-keys[=[]]:指定退出attach模式的快
本文将详细介绍如何针对新创建的以及已存在的Docker容器,通过调整配置来限制日志文件的大小和数量,以达到有效管理和节约存储空间的目的。 #### 新容器日志管理 对于新创建的Docker容器,可以通过修改或添加系统...
### Docker 容器生命周期管理详解 #### 一、概述 Docker 容器生命周期管理是 Docker 使用中的核心概念之一,涉及到容器的创建、运行、停止、重启等多个阶段。通过掌握这些基本操作,可以帮助开发者和运维人员更加...
理解并熟练运用这些方法,能帮助你更有效地管理和操作Docker容器。记住,Docker容器的IP地址可能因网络模式(如桥接网络或用户自定义网络)而有所不同,所以检查网络设置也是理解容器网络行为的重要部分。同时,当...
### 修改已运行Docker容器的端口映射 在日常的开发与运维工作中,我们经常会遇到需要调整已部署Docker容器端口映射的情况。比如,当本地机器上安装了MySQL数据库并占用3306端口时,而之前通过Docker容器运行的MySQL...
2. 容器(Container):Docker 容器是从镜像创建的实例,包含了应用程序和其依赖项,可以独立运行。 3. 卷(Volume):Docker 卷是用于存储数据的目录,可以被多个容器共享。 Docker 的安装和使用: 1. 安装 ...
### 实现跨宿主机多Docker容器间的数据共享 #### 概述 本文将详细介绍如何在不同的宿主机之间实现多个Docker容器之间的数据共享。为了达成这一目标,我们将使用GlusterFS作为网络文件系统,它能够提供分布式、可...
Docker容器轻量级、隔离且易于管理,是现代微服务架构中的核心组件。为了确保Docker容器的健康运行,我们需要定期检查它们的状态,包括是否正在运行、网络连接是否正常、是否有异常日志等。 Shell脚本可以利用...
docker-ssh, 按名称在所有本地 Docker 容器中 docker允许使用ssh连接到所有本地 Docker 容器,如下所示:ssh container-name.docker如果 container-name 是容器的名称,ssh正在运行。 为当前用户自动安装
3. 容器(Container):容器是 DockerCompose 中的最小单元,是一个独立的容器实例。 DockerCompose 的优点包括: 1. 简化容器管理:DockerCompose 可以自动管理容器之间的依赖关系,简化容器的管理。 2. 提高开发...
将 nginx docker 容器部署到 heroku 部署 单击以下按钮将存储库部署到 heroku。 手动部署 要手动部署存储库,您必须安装: git clone https://github.com/muhammadhanif/heroku-nginx-docker-container.git cd ...
此外,在 Docker 容器开发模式中,还有其他六种模式,包括 The Build Container、The CI/CD Container、The Debug Container、The Release Container、The Deployment Container 和 The Monitoring Container 等,每...
用于 Docker 容器管理的 Concourse CI 资源已经可用,但仍在进行中。去做: 添加对端口配置的更好支持例子: resources:- name: docker type: docker-container source: host: ...
Docker 容器技术是现代云计算和微服务大规模集群管理部署的强有力的技术支撑。 Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装 ...
Docker 是一个基于 Linux 容器(Container)的虚拟化技术,能够将应用程序和其依赖项打包成一个容器中,实现了应用程序的隔离和管理。Docker 容器平台提供了一个轻量级、可移植、灵活的解决方案,能够满足现代软件...
Docker 容器技术作为云计算和微服务大规模集群管理部署的强有力的技术支撑,已经成为企业不可或缺的技术战略。 Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可...
Docker 容器是轻量级的运行环境,可以快速部署和管理应用程序。镜像是容器的模板,包含了容器运行所需的环境和依赖项。本文将详细介绍 Docker 容器与镜像的使用方法,包括获取镜像、启动容器、停止容器、导入和导出...