(四)Docker 容器

2021-08-27  本文已影响0人  deve_雨轩

容器是 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 技术的核心,创建容器的选项十分复杂,主要包裹几个大类:

运行模式相关 环境配置相关 image.png image.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 在后台操作如下:

下面我们在 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。

支持修改的配置
上一篇 下一篇

猜你喜欢

热点阅读