三、Docker容器

本文介绍了Docker容器的创建与管理,包括使用dockercreate和dockerrun命令创建容器,通过dockerstart和dockerrestart启动及停止容器,以及使用dockerexec进入容器。还讨论了如何通过dockerexport和dockerimport导出和导入容器,以及如何删除容器。Docker的轻量级特性使得资源管理高效且便捷。
摘要由CSDN通过智能技术生成

本章介绍Docker容器的相关知识和操作

创建容器

Docker容器十分轻量级,用户可以随时创建或者删除容器
新建容器

[root@k8s-m1 ~]# docker create -it nginx 
8bf911a070921ca96a59d3b80f1621e4963b5c1e46ba3afa0db8bebe77db23eb
[root@k8s-m1 ~]# docker ps -a
CONTAINER ID   IMAGE                                               COMMAND                  CREATED              STATUS                         PORTS                NAMES
8bf911a07092   nginx                                        "/docker-entrypoint.…"   About a minute ago   Created                                             amazing_kirch

注意:通过create方式创建的容器是处于created状态的,docker ps不能看到,需要加-a参数,可以通过docker start 命令来启动它

新建并启动
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(exited)的容器重新启动。
所需要的命令主要为 docker run,等价于先执行docker create命令,再执行docker start 命令。
例如,下面的命令输出一个 “Hello World”,之后终止容器。

[root@k8s-m1 ~]# docker run  centos  /bin/echo "hello world"
hello world

这跟在本地直接执行 /bin/echo ‘hello world’ 几乎感觉不出任何区别。下面的命令则启动一个 bash 终端,允许用户进行交互。

[root@k8s-m1 ~]#docker run -it centos /bin/bash
root@996530b5dae1:/#

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,例如

root@996530b5dae1:/# ls
/
root@996530b5dae1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
启动已终止容器

可以利用 docker start 命令,直接将一个已经终止(exited)的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。
root@996530b5dae1:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

工作中经常用到的:
docker restart container_id
docker exec -it container_id /bin/bash
docker exec -it container_id /bin/sh
docker exec -it container_id /bash #某些镜像没有这些所谓的终端,就不能直接进入容器内。

守护态允许
多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
下面举两个例子来比较说明一下。
如果不使用 -d 参数运行容器。
[root@k8s-m1 ~]docker run centos /bin/sh -c “while true; do echo hello world; sleep 1; done”
hello world
hello world
hello world
容器会把输出的结果 (STDOUT) 打印到宿主机上面
如果使用了 -d 参数运行容器。
[root@k8s-m1 ~]docker run -d centos /bin/sh -c “while true; do echo hello world; sleep 1; done”
320d7375b3ddc9bd41ecbb753fa31172942ed3f124ddc8df39de7e385451d922
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。
注意: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。
如简单查看ls命令马上就会执行完成并退出容器,所有如果要容器长久运行,需要指定的命令能一直运行。

使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息。
[root@k8s-m1 ~]docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
320d7375b3dd centos “/bin/sh -c 'while t…” 5 minutes ago Up 5 minutes epic_albattani
要获取容器的输出信息,可以通过 docker container logs 命令。
[root@k8s-m1 ~]docker container logs [container ID or NAMES]
hello world
hello world
hello world
. . .

停止容器
可以使用 docker stop 来停止一个运行中的容器。
此外,当 Docker 容器中指定的应用终结时,容器也会自动停止。
例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 docker ps -a 命令看到。例如
[root@k8s-m1 ~]docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
320d7375b3dd centos “/bin/sh -c 'while t…” 7 minutes ago Exited (137) 12 seconds ago epic_albattani
处于停止状态的容器,可以通过 docker start 命令来重新启动。
此外,docker restart 命令会将一个运行态的容器停止,然后再重新启动它。

进入容器
在使用 -d 参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,通常我们使用 docker exec 命令,原因通过下面测试说明。
1)attach 命令

[root@k8s-m1 ~]docker run -dit centos
8c4ddb21020e3ed319c4b089394b4b65c806f3fb790791fdf3ce9681771d9bc9​
[root@k8s-m1 ~]docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8c4ddb21020e   centos                                              "/bin/bash"              10 seconds ago   Up 9 seconds                        romantic_keller​
**注意:命令为/bin/bash**
[root@k8s-m1 ~]docker attach 243c
root@243c32535da7:/# ctrl+d
[root@k8s-m1 ~]# docker ps -a   #发现容器处于退出状态
8c4ddb21020e   centos                                              "/bin/bash"              35 seconds ago   Exited (0) 6 seconds ago                        romantic_keller

注意: 如果从这个 stdin 中直接用ctrl+d退出,会导致容器的停止。而使用ctrl+p ctrl+q退出,不会导致容器退出。
如下:

[root@k8s-m1 ~]# docker attach 8c
[root@k8s-m1 ~]ctrl+p ctrl+q
[root@8c4ddb21020e /]# read escape sequence
[root@k8s-m1 ~]# docker ps -a #会发现容器仍然处于running状态

2)exec 命令
-i -t 参数
docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。
只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

[root@k8s-m1 ~]docker run -dit centos
8c4ddb21020e3ed319c4b089394b4b65c806f3fb790791fdf3ce9681771d9bc9​
[root@k8s-m1 ~]docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8c4ddb21020e   centos                                              "/bin/bash"              10 seconds ago   Up 9 seconds                        romantic_keller​
​
[root@k8s-m1 ~]# docker exec  -it 8c /bin/bash
[root@8c4ddb21020e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var​

如果从这个 stdin 中直接用ctrl+d退出,不会导致容器的停止。这就是为什么推荐大家使用 docker exec的直接原因。

attach和exec的更多区别
docker exec
#进入当前容器后开启一个新的终端,可以在里面操作,它不会带让我们进入到容器的PID 1。它将创建一个新的过程。 如docker exec -it <容器ID> bash。从容器中退出不会停止容器。(常用)
docker attach
docker attach用于获取容器的PID 1。因此docker attach 将进入bash终端,因为它是我们启动容器时提到的PID 1。从容器中退出将停止容器;多个窗口同时attach到同一个容器时,所有窗口同步显示;当某个窗口因命令阻塞,其他窗口也无法操作

也可以使用nsenter进入容器内部。 nsenter -m -u -n -p -i -t <容器的pid>
可以使用以下命令找到容器的PID:docker inspect <容器的id> | grep -i PID

[root@k8s-m1 ~]# docker inspect 8c | grep -i PID
[root@k8s-m1 ~]# nsenter -m -u -n -p -i -t 19030
[root@8c4ddb21020e /]#  ctrl+d
该方式也不会导致容器退出

镜像的导出和导入
1)导出容器
如果要导出本地某个容器,可以使用 docker export 命令。

[root@k8s-m1 ~]# docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED          STATUS          PORTS                NAMES
8c4ddb21020e   centos                                              "/bin/bash"              44 minutes ago   Up 20 minutes                        romantic_keller
[root@k8s-m1 ~]docker export 8c4ddb21020e   > centos.tar  #可以先在运行的容器按自己需求做一定的更改,然后再导出形成自己的业务镜像

2)导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,例如

[root@k8s-m1 ~]cat centos.tar | docker import - test/centos:v1.0
[root@k8s-m1 ~]docker image
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/centos         v1.0                7cd6ae6db41e        About a minute ago   231MB
此外,也可以通过指定 URL 或者某个目录来导入,例如
[root@k8s-m1 ~]docker import http://***

删除容器
可以使用 docker rm 来删除一个处于终止状态的容器。例如

[root@k8s-m1 ~]# docker stop 8c
8c
[root@k8s-m1 ~]# docker rm 8c

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

清理所有处于终止状态的容器
用 docker ps -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
[root@k8s-m1 ~]docker container prune

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

margu_168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值