Docker 入门系列之4 命令操作

113次阅读

共计 4209 个字符,预计需要花费 11 分钟才能阅读完成。

启动容器

启动容器有两种方式

  • 基于镜像新建一个容器并启动
  • 将在终止状态(stopped)的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

新建并启动

所需要的命令主要为 docker run

例如,下面的命令输出一个 “Hello World”,之后终止容器。

[root@docker ~]# docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

这跟在本地直接执行 /bin/echo 'hello world' 几乎感觉不出任何区别。

下面的命令则启动一个 bash 终端,允许用户进行交互。

[root@docker ~]# docker run -t -i ubuntu:18.04 /bin/bash
root@fb55bebd07b5:/# 

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

在交互模式下,用户可以通过所创建的终端来输入命令,例如

root@fb55bebd07b5:/# pwd
/
root@fb55bebd07b5:/# 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 命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 pstop 来查看进程信息。

root@fb55bebd07b5:/# ps  
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   11 pts/0    00:00:00 ps

可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

后台运行

更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。

下面举两个例子来说明一下。

如果不使用 -d 参数运行容器。

[root@docker ~]# docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world

容器会把输出的结果 (STDOUT) 打印到宿主机上面

如果使用了 -d 参数运行容器。

[root@docker ~]# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
26e3a0f3c836da943f7ad1677bfede3ae87b7ba8b1a680b1997636c3a5552c84

此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。

注: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。

使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
26e3a0f3c836        ubuntu:18.04        "/bin/sh -c 'while t…"   12 seconds ago      Up 11 seconds                           frosty_johnson

要获取容器的输出信息,可以通过 docker container logs 命令。

[root@docker ~]# docker container logs 26e3a0f3c836
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
. . .

终止容器

可以使用 docker stop 来终止一个运行中的容器。

[root@docker ~]# docker stop 27ee12a35471
27ee12a35471

此外,当 Docker 容器中指定的应用终结时,容器也自动终止。

例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。

终止状态的容器可以用 docker ps -a 命令看到。例如

[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
27ee12a35471        ubuntu:18.04        "/bin/sh -c 'while t…"   37 seconds ago      Exited (137) 8 seconds ago                       competent_albattani                         backstabbing_pike

处于终止状态的容器,可以通过 docker start 命令来重新启动。

此外,docker restart 命令会将一个运行态的容器终止,然后再重新启动它。

进入容器

在使用 -d 参数时,容器启动后会进入后台。

某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令,原因会在下面说明。

attach命令

下面示例如何使用 docker attach 命令。

[root@docker ~]# docker run -dit ubuntu:18.04
d1e04dbec84bd378b3223dcb22a29ed2f57fe226d0a140e2fc5b94b7391ad298

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d1e04dbec84b        ubuntu:18.04        "/bin/bash"         7 seconds ago       Up 6 seconds                            friendly_proskuriakova

[root@docker ~]# docker attach d1e04dbec84b
root@d1e04dbec84b:/# 

注意: 如果从这个 stdin 中 exit,会导致容器的停止。

exec 命令

-i -t 参数

docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。

只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。

-i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

[root@docker ~]# docker run -dit ubuntu:18.04
c0b2edc0c5eeb38866e8ca1555e86c3bd0d4e17a93f7f9de497434a13aa14371

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c0b2edc0c5ee        ubuntu:18.04        "/bin/bash"         15 seconds ago      Up 14 seconds                           nice_proskuriakova

[root@docker ~]# docker exec -i c0b2edc0c5ee bash 
ls
bin
boot
dev
etc
home
lib
...

[root@docker ~]# docker exec -it c0b2edc0c5ee bash
root@c0b2edc0c5ee:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin

如果从这个 stdin 中 exit,不会导致容器的停止。这就是为什么推荐大家使用 docker exec 的原因## 导出和导入容器

导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
c0b2edc0c5ee        ubuntu:18.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
[root@docker ~]# docker export c0b2edc0c5ee > ubuntu.tar

这样将导出容器快照到本地文件。

导入容器快照

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

[root@docker ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0
sha256:0bbbaf44fab08a3302ff00199176f1d1d5ecc0a16d6e01ea203c281a82095298

[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                0bbbaf44fab0        2 seconds ago       64.2MB

此外,也可以通过指定 URL 或者某个目录来导入,例如

$ docker import http://example.com/exampleimage.tgz example/imagerepo
```## 删除容器

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

```bash
[root@docker ~]# docker rm c0b2edc0c5ee
c0b2edc0c5ee

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

清理所有处于终止状态的容器

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

$ docker container prune
正文完
 
mervinwang
版权声明:本站原创文章,由 mervinwang 2023-02-22发表,共计4209字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
文章搜索