容器是 Docker 的另一个核心概念。简单来说,容器是镜像的一个运行实例。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
创建容器
新建容器 docker create
[root@h244 ~]# docker create -it ubuntu:latest
5d05ba725c395dbc351da29253c077bf82b4f711ea332687b09d03e3c1aa046b
[root@h244 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d05ba725c39 ubuntu:latest "bash" 5 seconds ago Created nifty_chandrasekhar
使用 docker create 命令新建的容器处于停止状态,可以使用 docker start 命令来启动。
容器是整个 Docker 技术的核心,创建容器的选项十分复杂,主要包裹几个大类:
- 与容器运行模式相关
- 与容器环境配置相关
- 与容器资源限制
- 与安全保护相关
![](https://img.haomeiwen.com/i1455014/2022faefe8e8ad28.png)
![](https://img.haomeiwen.com/i1455014/536f47f3240e35d1.png)
![](https://img.haomeiwen.com/i1455014/6d1e7d993dc84138.png)
![](https://img.haomeiwen.com/i1455014/382a34351de517a6.png)
启动容器 docker start
[root@h244 ~]# docker start 5d05ba725c39
5d05ba725c39
[root@h244 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d05ba725c39 ubuntu:latest "bash" About a minute ago Up 1 second nifty_chandrasekhar
此时,通过 ps 命令查看就会发现容器是运行状态了。
新建并启动容器 docker run
docker run,其等价于先执行 docker create,在执行 docker start 命令。
[root@h244 ~]# docker run ubuntu:latest /bin/echo 'hello world'
hello world
执行上面命令其实和本地执行 /bin/echo 'hello world' 几乎感觉不出任何区别。
当执行 docker run 来创建并启动容器时,docker 在后台操作如下:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建一个容器,并启动该容器。
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
- 从网桥的地址池配置一个 IP 地址给容器。
- 执行用户指定的应用程序。
- 执行完毕后容器被自动退出运行。
下面我们在 run 一个容器,运行 bash 终端进行交互
[root@h244 ~]# docker run -it ubuntu:latest /bin/bash
root@e99229bb9570:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@e99229bb9570:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
9 pts/0 00:00:00 ps
root@e99229bb9570:/# exit
exit
[root@h244 ~]#
-t 选项让 Docker 分配一个伪终端并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。
在容器内用 ps 命令查看进程,可以看到,只运行了 bash 应用,并没有运行其他无关的进程。当我们 exit 退出 bash 进程之后,容器也会自动退出。
守护态运行
很多时候,需要让 docker 容器在后台以守护态形式运行。我们可以通过添加 -d 参数来实现。
[root@h244 ~]# docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
8538511dbb52c78b7b7b4b1cfa38f981ef484713ad0595fda2647724e12acf90
容器启动后会返回一个唯一的 id, 可以通过 docker ps 来查看容器信息。
[root@h244 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8538511dbb52 ubuntu:latest "/bin/sh -c 'while t…" 2 seconds ago Up 1 second wizardly_hugle
查看容器输出
[root@h244 ~]# docker logs -f 8538511dbb52
hello world
hello world
hello world
hello world
hello world
.....
通过 docker logs 可以查看容器的输出。
-details 打印详细信息
-f,-follow 持续保持输出
-since string 输出从某个时间开始得日志
-tail string 输出最近的若干日志
-t,-timestamps 显示时间戳信息
-until string 输出某个时间之前的日志
停止容器
暂停容器
[root@h244 ~]# docker pause 8538511dbb52
8538511dbb52
[root@h244 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8538511dbb52 ubuntu:latest "/bin/sh -c 'while t…" 7 minutes ago Up 7 minutes (Paused) wizardly_hugle
[root@h244 ~]# docker unpause 8538511dbb52
8538511dbb52
[root@h244 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8538511dbb52 ubuntu:latest "/bin/sh -c 'while t…" 8 minutes ago Up 8 minutes wizardly_hugle
当执行 pause 之后容器状态就会变成 Paused,然后可以通过 unpause来恢复到运行状态
终止容器
[root@h244 ~]# docker stop 8538511dbb52
8538511dbb52
[root@h244 ~]#
使用 docker stop 来终止一个运行中的容器,该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发送 SIGKILL 信号来终止容器。
进入容器
在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行 操作。这个时候如果需要进入容器进行操作,我们可以使用 exec 命令。
[root@h244 ~]# docker exec -it dc138363f794 /bin/bash
root@dc138363f794:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@dc138363f794:/# cd /home/
root@dc138363f794:/home# ls
root@dc138363f794:/home# pwd
/home
root@dc138363f794:/home#
可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与 容器进行交互。
exec 比较重要的参数如下:
-d, --detach 在容器中后台执行命令
--detach-keys="" 指定将容器切回后台的按键
-e, --env=[] 指定环境变量列表
-i,--interactive=true|false 打开标准输入接受用户输入命令,默认值为 false
-- privileged=true|false 是否给执行命令以最高权限,默认值为 false
-t, -tty=true|false 分配伪终端, 默认值为 false
-u, --user="" 执行命令的用户名或 ID
删除容器
我们可以通过 docker rm 命令来删除处于终止或退出状态的容器。
[root@h244 ~]# docker rm -f dc138363f794
dc138363f794
[root@h244 ~]#
-f, --force=false 是否强行终止并删除一个运行中的容器
-l, --link=false 删除容器的连接,但保留容器
-v, --volumes=false 删除容器挂载的数据卷
执行 docker container prune 命令清除掉所有处于停止状态的容器
导入和导出容器
有时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,这也是 Docker 自身提供的一个重要特性。
导出容器
[root@h244 home]# docker export -o run_ubuntu_export.tar 8538511dbb52
[root@h244 home]# ls
run_ubuntu_export.tar
[root@h244 home]# docker export 8538511dbb52 > stop_ubuntu_export.tar
[root@h244 home]# ls
run_ubuntu_export.tar stop_ubuntu_export.tar
上面两个命令都可以将容器导出
导入容器
执行下面命令就可以将导出的 tar 文件导入系统中
[root@h244 home]# docker import run_ubuntu_export.tar test/ubuntu:v1
sha256:6dda819276c34cd2a8c6cc7a2f79caa188e5e5d1e432ecad9e8fffa738149d2d
[root@h244 home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 6dda819276c3 2 seconds ago 72.8MB
实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使 用 docker [container] import 命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。
查看容器
查看容器详情
[root@h244 ~]# docker container inspect 8538511dbb52
[
{
"Id": "8538511dbb52c78b7b7b4b1cfa38f981ef484713ad0595fda2647724e12acf90",
"Created": "2021-08-25T06:30:59.638701387Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 104436,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-25T07:57:45.41899904Z",
"FinishedAt": "2021-08-25T06:40:51.275889779Z"
},
"Image": "sha256:1318b700e415001198d1bf66d260b07f67ca8a552b61b0da02b3832c778f221b"
.....
执行 inspect 命令会以 json 格式返回容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息。
查看容器内进程
[root@h244 ~]# docker container top 8538511dbb52
UID PID PPID C STIME TTY TIME CMD
root 97740 104436 0 09:49 ? 00:00:00 sleep 1
root 104436 104419 0 8月25 ? 00:00:28 /bin/sh -c while true; do echo hello world; sleep 1; done
docker top 类似于 linux 系统中的 top 命令,会打印出容器内的进程信息,包括 PID、用户、时间、命令等。
查看统计信息
[root@h244 ~]# docker stats --no-stream 8538511dbb52
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8538511dbb52 wizardly_hugle 0.18% 304KiB / 7.62GiB 0.00% 656B / 0B 0B / 0B 2
[root@h244 ~]#
docker container stats 命令会显示 CPU、内存、存储、网络等使用情况的统计信息。
-a,-all 输出所有容器统计信息,默认仅在运行中的容器
--format string 格式化输出信息
--no-stream 不持续输出,默认会自动实时刷新数据
--no-trunc 不截断输出信息
主机与容器之间文件复制
复制文件到容器里
docker cp ./text.txt 8538511dbb52:/tmp/
上面这个命令把 text.txt 文件复制到容器里的 tmp 目录下
从容器里面复制文件到主机上
docker cp 8538511dbb52:/tmp/text.txt ./
上面那个命令把容器里的 text.txt 文件复制到主机的当前目录下。
-a, -archive 打包模式,复制文件会带有原始的 uid/gid 信息
-L, -follow-link 跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
查看容器文件系统变更
[root@h244 ~]# docker container diff 8538511dbb52
C /tmp
A /tmp/text.txt
[root@h244 ~]#
使用 diff 命令可以查看容器内文件系统的变更。
查看容器端口映射
root@POLY-SERVER:~# docker container port af38a226694e
9555/tcp -> 0.0.0.0:9555
8848/tcp -> 0.0.0.0:8848
port 命令可以查看容器的端口映射情况
更新配置
docker update 命令可以更新容器的一些运行时配置主要是一些资源限制份额。
[root@h244 ~]# docker update --restart always 8538511dbb52
8538511dbb52
[root@h244 ~]#
执行上面命令就可以调整容器退出后的重启策略为 always。
支持修改的配置
网友评论