系列文章目录
本系列主要分为以下六大部分,正在更新中,尽请期待!
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
提示:已经更新的或正在更新的文章前面打勾了哈!
文章目录
前言
容器是 Docker的另一个核心概念。
简单来说,容器是镜像的一个运行实例(Java中的对象与类)。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时容器中的应用进程处于运行状态。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。
那么 Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
一、创建容器
1.创建运行容器
使用 docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令新建的容器,如下:
docker create -it ubuntu:latest
使用 docker create命令新建的容器处于停止状态,可以使用 docker start [OPTIONS] CONTAINER [CONTAINER...]
命令来启动它,如下:
docker start
也可以直接新建并启动容器,docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
等价于先执行 docker create 再执行docker start 命令。
docker run ubuntu
当利用 docker run来创建并启动容器时, Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建一个容器,并启动该容器。
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
- 从网桥的地址池配置一个IP地址给容器。
- 执行用户指定的应用程序。
- 执行完毕后容器被自动终止。
OPTIONS说明:
-
-d
: 后台运行容器,并返回容器ID; -
-i
: 以交互模式运行容器,通常与-t
同时使用; -
-t
: 为容器重新分配一个伪输入终端,通常与-i
同时使用; -
-P
: 随机端口映射,容器内部端口随机映射到主机的端口; -
-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口; -
--name="nginx-lb"
: 为容器指定一个名称; -
-e username="ritchie"
: 设置环境变量; -
--env-file=[]
: 从指定文件读入环境变量; -
-m
:设置容器使用内存最大值; -
--link=[]
: 添加链接到另一个容器; -
--expose=[]
: 开放一个端口或一组端口;
某些时候执行 docker run时候因为命令无法正常执行容器会出错,直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
-
125
: Docker daemon执行出错,例如指定了不支持的 Docker命令参数; -
126
:所指定命令无法执行,例如权限出错; -
127
:容器内命令无法找到。
命令执行后出错,会默认返回命令的退出错误码。
2.守护态运行
更多的时候,需要让 Docker容器在后台以守护态( Demonized)形式运行。此时,可以通过添加 -d
参数来实现。
容器启动后会返回一个唯一的id,也可以通过 docker ps
或 docker container ls
命令来查看容器信息。
3.查看容器输出
要获取容器的输出信息,可以通过 docker logs [OPTIONS] CONTAINER
命令。
OPTIONS说明:
-
-details
:打印详细信息; -
-f, -follow
:持续保持输出; -
-since string
:输出从某个时间开始的日志; -
-tail string
:输出最近的若干日志; -
-t,- timestamps
:显示时间戳信息; -
-until string
:输出某个时间之前的日志。
我们可以使用 docker container help
命令查看 Docker支持的容器操作子命令。
二、进入容器
在启动Docker容器的时如果使用-d
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的 attach
或 exec
命令。
1.attach命令
使用docker attach [OPTIONS] CONTAINER
可以连接到正在运行中的容器,如下:
# 启动容器
docker run -d --name demo ubuntu /usr/bin/top -b
# 连接正在运行的容器
docker attach demo
但是使用 attach命令要注意:
- 当多个窗口同时 attach到同一个容器的时候,所有窗口都会同步显示;
- 当某个窗口因命令阻塞时,其他窗口也无法执行操作了;
2.exec命令
使用docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
在运行的容器中执行命令,如下:
OPTIONS说明:
-
-d, --detach
:在容器中后台执行命令; -
--detach-keys=""
:指定将容器切回后台的按键; -
-e,--env=[]
:指定环境变量列表; -
-i, --interactive=true|false
: 打开标准输入接受用户输人命令,默认值为false; -
--privileged=true| false
:是否给执行命令以高权限,默认值为false; -
-t , --tty= true false
:分配伪终端,默认值为 false; -
-u, --user=""
: 执行命令的用户名或ID;
例如:进入到刚创建的容器中,并启动一个bash
docker exec -it e9df568dfad7 /bin/bash
可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。
注意:通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。通过 exec 命令对容器执行操作是最为推荐的方式
三、停止容器
1.暂停容器
使用docker pause
命令暂停容器,处于paused状态的容器,可以使用 docker unpause
命令来恢复到运行状态。
大家可以自己动手试试:
# 查看当前处于运行状态的容器
docker ps
#暂停一个容器
docker pause NAME
# 查看当前处于运行状态的容器
docker ps
2.终止容器
终止容器常见有以下几种方式:
- 使用
docker stop
命令终止容器。
该命令会首先向容器发送SIGTERM
信号,等待一段超时时间后(默认为10秒),再发送SIGKILL
信号来终止容器。 - 执行
docker container prune
命令,会自动清除掉所有处于停止状态的容器。 - 还可以通过
docker kill
直接发送SIGKILL
信号来强行终止容器。 - 当 Docker容器中指定的应用终结时,容器也会自动终止。
例如:只启动了一个终端的容器,用户通过exit
命令或Ctrl + d
来退出终端时,所创建的容器立刻终止,处于 stopped状态。
我们可以用 docker ps -qa
命令看到所有容器的ID。
四、删除容器
可以使用 docker rm [OPTIONS] CONTAINER [CONTAINER...]
命令来删除处于终止或退出状态的容器。
OPTIONS说明:
-
-f, --force= false
: 是否强行终止并删除一个运行中的容器; -
-l, --link=false
: 删除容器的连接,但保留容器; -
-v,--volumes=false
: 删除容器挂载的数据卷;
例如:查看处于终止状态的容器并删除:
#查看处于终止状态的容器
docker ps -a
#删除f8988cc08e1a
docker rm f8988cc08e1a
#查看处于终止状态的容器
docker ps -a
如下图:
默认情况下,docker rm命令只能删除已经处于终止或退岀状态的容器,并不能删除还处于运行状态的容器。
如果要直接删除一个运行中的容器,可以添加-f参数。 Docker会先发送SIGKILL
信号给容器,终止其中的应用,之后强行删除。
看看本专栏文章有哪些吧!
本系列文章目录:
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
可以看出来本系列文章将会带你从-1到1的学习云原生的,一起加油吧!
总结
容器是直接提供应用服务的组件,也是 Docker整个技术栈中最为核心的概念。围绕容器,Docker提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期。