type
status
date
slug
summary
tags
category
icon
password
容器
简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
如果认为虚拟机是模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及他们的必须运行环境。
容器是直接提供应用服务的组件,也是docker实现快速的启停和高效服务性能的基础。
创建容器
创建容器用到docker create和docker run。
docker create
docker create新建一个容器,但不会启动它,容器处于stop状态,使用docker start可以启动它
语法:docker [option] image
option
- —name 创建容器的同时命名容器名
实例
用镜像busybox创建名为mybox的容器docker create --name mybox busybox
docker run
docker run可用于:新建并启动基于指定镜像的容器,等价于docker create 后docker start当使用其来创建并启动容器,Docker后台会执行的标准操作:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器
- 分配一个文件系统给容器,并在只读的镜像层外挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后终止容器
语法:docker run [option] image [command] [arg...]
option:
- --name 新建容器同时给它命名容器名
- -i 让容器的标准输入保持打开
- -t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
一般将 -i 和-t 一起使用,意为分配一个保持打开的伪终端,让我们与容器交互tips:容器的标准输入是一种机制,用于将外部输入(如键盘输入或命令行输入)传递给容器内的进程,使用户能够与容器中的应用程序进行交互。[command] [arg...] 可选地,在容器中执行该命令和参数,您可以提供一个特定的命令或参数,以覆盖 Docker 镜像中定义的默认命令。在容器内可以使用exit或者按Ctrl
+d
来退出容器,容器退出后处于终止状态(stopped)
守护态运行
也就是后台运行容器,即在终端上没有直接可视的反馈。Docker在后台以守护态(Daemonized)形式运行。通过docker run 的一个选项 -d 实现
例如:运行docker run -d ununtu /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器在后台运行,循环输出的hello world不会显示在终端,相反如果使用-it选项就会显示在终端。如果想获取容器的输出信息,可使用docker logs
docker logs
获取容器的输出信息,一般是获取以守护态运行的容器的输出信息,可以搭配管道命令增强可读性。
语法: docker logs [option] [container]
终止容器
用到docker stop 和 docker kill,简单的说他们的区别,docker stop就像是优雅的按上笔记本电脑的关机键,docker kill则像是立刻拔出笔记本电脑的电池。
docker stop
终止一个或多个容器
语法:docker stop [option] container [container...]
option:
- -t 参数为int整形,设定终止容器前的等待时间,默认为秒
docker kill
立即强制终止一个或多个容器
语法:docker kill [option] container [container...]
docker stop与docker kill的区别
docker stop当使用该命令,一个硬件信号将会被发送到容器里面的进程。这个信号就是sigterm,他是terminate signal(终止信号)的缩写。这个信号会告诉进程:你要在我规定的时间内收拾好你自己的东西,卷铺盖走人!。
sigterm用于当你想终止容器里的某个进程或者终止某个容器,且你想给进程一点时间,让他做一些自我清理、保存等行为,或者在终止前你要做一些清理等操作使进程安全关闭。例如,在window中,如果有一些重要文件没保存,即使在按下关机后你也可以对他进行保存且系统也会给出相关提示。


docker kill使用该命令,sigkill信号会发送到容器里的主进程。kil(杀死他)意味着告诉进程,你必须停下手中的任何工作,立刻终止,死掉。
所以,为了给容器里的进程一些时间自我关闭、清理,我们一般使用docker stop来终止一个容器。除非docker stop关闭不了,容器无响应,这时就使用docker kill将其强制关闭。
docker start
启动一个或多个处于终止状态的容器
语法:docker start [option] container [container...]
需要指定容器的容器名或者id来启动
docker restart
将一个运行中的容器终止,然后重新启动它
语法:docker restart container
需要指定容器的容器名或者id来重启
进入容器
背景:在使用-d参数时,容器启动后进入后台,我们无法只管看到容器中的信息。有时候如果需要进行容器进行操作,就有方法如下:docker attach、docker exec和nsenter工具等
docker attach
Attach local standard input, output, and error streams to a running container
语法:docker attach [option] contariner
注意是进入一个正在运行的容器中。docker attach有时使用并不方便。当多个窗口同时使用docker attach进入同一个容器时,所有窗口都会同步显示在该容器中的输出。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
docker exec
Execute a command in a running container
自docker1.3版本起便提供了一个更加方便的工具exec,它可以直接在容器内运行命令。
语法:docker exec [option] container command [arg...]
实例:在名为test的容器中启动一个bash
docker exec -ti test /bin/bash注:-t Docker分配一个伪终端,并将输出绑定到容器的标准输出;-i 让容器的标准输入保持打开
nsenter工具
What is Nsenter used for?
nsenter is a Linux utility that allows you to run a command in the namespace of a running process. Namespaces are a feature of the Linux kernel that provide isolated environments for processes, and are used by container technologies like Docker to create isolated containers.
未学习,先放着
删除容器
docker rm
remove one or more containers
语法:docker rm [option] container [container...]
option:
- f 强制删除一个正在运行的程序,本质向其发送SIGLL信号,立即终止其中的应用
- v 删除容器挂载的数据卷
导入和导出容器
docker export
export a container's filesystem as a tar archive
导出用tar档案包打包好的容器的文件系统
容器的运行状态不影响导出
语法:docker export [options] container
option:
- o, --output 指定导出路径、文件名,文件名自拟.tar结尾,路径不可自拟,该路径必须存在
也可以用重定向符来替换它
实例:将名为test的容器导出到/home/test.tar中
docker export -o /home/test.tar test或者docker export > /home/test.tar test注意:如果目标目录不存在导出失败
docker import
import the contents from a tarball to create a filesystem image
将tar包导入,使其成新的本地镜像,需要注意的是其导入的镜像不会保留构建历史记录和元数据信息,不会保存原镜像的tag和镜像名。相比docker load 导入镜像文件,镜像存储文件保存镜像的完整记录。
语法:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
格式好长,莫怕,下面娓娓道来~file|URL|- 这部分指定要导入镜像的获取方式。注意了当中的' | '符号意为或者,不是管道命令符。其说明镜像文件可以是文件路径、URL 或短横线-
。短横线-
表示从标准输入中读取数据。标准输入就是从外部输出(键盘输出、命令行输出的结果作为输入)例:从文件导入镜像docker import tset.tar reposName:tag从URL导入镜像docker import https://example.com/image.tar reposName:tag从标准输入导入镜像cat image.tar | docker import - reposName:tag//这样理解:这里是将cat输出的内容作为标准输入导入镜像,如果是键盘输出,就要自己码出镜像文件的内容!//cat image.tar | docker import - reposName:tag中符号' - '的意义:使用-
作为输入文件名的方式告诉docker import命令从标准输入中读取数据,而不是从文件或URL中读取。这种方式在需要从管道或其他命令输出中导入镜像时很有用。在这种情况下,docker import命令会将从标准输入接收到的数据作为镜像的内容进行导入。[REPOSITORY[:TAG]] 可选参数,用于指定导入的镜像的仓库和标签。格式为仓库名:标签。如果未提供仓库名和标签,默认为<none>:<none>
欢迎您在底部评论区指正