Docker容器的常用操作

1.获取镜像

获取镜像的命令:docker pull,格式为:

docker pull [选项] [Docker Registry 地址[:端口]]/仓库名[:标签]
  • Docker Registry 地址: 包括主域名加端口号
  • 仓库名:这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 docker.io,如果不给出用户名,则默认为 library,也就是官方镜像

2.运行容器

[root@wtao-test-3 ~]# docker run -it --rm ubuntu:16.04 /bin/bash
root@e7961c9273af:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

docker run就是运行容器的命令,参数具体作用如下:

  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t :打开一个终端。如果需要以交互式终端的方式运行,则添加此参数
  • –rm:容器退出后随之将其删除。一般情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,并不需要保存什么结果,因此使用--rm可以避免浪费空间。
  • ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
  • bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 16.04.4 LTS 系统。最后可通过 exit /ctrl+d退出这个容器。

3.列出镜像

通过docker image ls查看所有镜像:

[root@wtao-test-3 ~]# docker image ls
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu                                     16.04               c522ac0d6194        3 days ago          126 MB
docker.io/weaveworks/weave-npc                       2.6.5               420d4d5aac6f        4 weeks ago         36.8 MB
docker.io/weaveworks/weave-kube                      2.6.5               e9dd2f85e51b        4 weeks ago         123 MB
registry.aliyuncs.com/google_containers/kube-proxy   v1.18.0             43940c34f24f        3 months ago        117 MB
registry.aliyuncs.com/google_containers/pause        3.2                 80d28bedfe5d        4 months ago        683 kB

查询出的内容包括了仓库(REPOSITORY)、标签(TAG)、镜像ID(IMAGE ID)、大小(SIZE),一个镜像可以有多个标签。

4.查看镜像、容器、数据卷所占用的空间

Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

通过docker system df可查看镜像、容器、数据卷所占用的空间:

[root@wtao-test-3 ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   5                   397.8 MB            5.578 MB (1%)
Containers          11                  5                   4.588 kB            2.294 kB (50%)
Local Volumes       0                   0                   0 B                 0 B

5.新建并启动一个容器

所需要的命令主要为docker run。 例如,下面的命令输出一个 “Hello Docker!”,之后终止容器。

[root@wtao-test-3 ~]# docker run ubuntu:16.04 /bin/echo 'Hello Docker!'
Hello Docker!

下面以交互方式打开一个伪终端与用户进行交互的形式运行容器:

[root@wtao-test-3 ~]# docker run -it ubuntu:16.04 /bin/bash
root@bfff06f01056:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@bfff06f01056:/# pwd
/

当利用docker run来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载镜像,存在则执行以下步骤
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

6.启动已终止的容器

通过docker container ls -a查看所有的容器,包括已经停止的:

[root@wtao-test-3 ~]# docker container ls -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS                           PORTS               NAMES
bfff06f01056        ubuntu:16.04                                        "/bin/bash"              5 minutes ago       Exited (127) 7 seconds ago                           gallant_wiles

可以利用docker container start命令,直接将一个已经终止的容器启动运行。

[root@wtao-test-3 ~]# docker container start bfff06f01056
bfff06f01056

再次查看发现该容器已正常运行。

7.后台运行

大多数情况下,我们并不需要让 Docker把执行命令的结果输出到当前宿主机下,此时,可以通过添加-d参数来实现在后台运行。

不使用-d参数运行容器:

[root@wtao-test-3 ~]# docker run ubuntu:16.04 /bin/sh -c 'while true; do echo Hello Docker!; sleep 1; done'
Hello Docker!
Hello Docker!
Hello Docker!
...

使用-d参数运行容器:

9edfa68b4a34054d85fe5a572d2eab2c427b024845b783194ab2e3c30e811358
[root@wtao-test-3 ~]# docker container ls
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS               NAMES
9edfa68b4a34        ubuntu:16.04                                        "/bin/sh -c 'while..."   15 seconds ago      Up 13 seconds                           blissful_fermi
[root@wtao-test-3 ~]# docker container logs 9edfa68b4a34
Hello Docker!
Hello Docker!
Hello Docker!
Hello Docker!

添加-d参数后,输出结果并不会打印在宿主机终端上,需要通过docker container logs <container id or name>来查看容器的输出信息。

8.终止容器

可以使用docker container stop来终止一个运行中的容器。此外,当 Docker 容器中指定的应用终结时,容器也自动终止。

[root@wtao-test-3 ~]# docker container stop 9edfa68b4a34
9edfa68b4a34

可以用docker container ls -a 命令查看是否已经终止。

9.连接容器

在使用-d参数后,容器启动后会进入后台运行。再次需要进入容器进行操作时,需要:exec 命令 -i -t 参数

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

[root@wtao-test-3 ~]# docker container ls
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS               NAMES
bfff06f01056        ubuntu:16.04                                        "/bin/bash"              2 hours ago         Up 2 hours                              gallant_wiles
[root@wtao-test-3 ~]# docker exec -i bfff06f01056 bash
pwd
/

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

[root@wtao-test-3 ~]# docker exec -it bfff06f01056 bash
root@bfff06f01056:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@bfff06f01056:/# pwd
/

10.删除容器

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

[root@wtao-test-3 ~]# docker container ls -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS                     PORTS               NAMES
9edfa68b4a34        ubuntu:16.04                                        "/bin/sh -c 'while..."   2 hours ago         Exited (137) 2 hours ago                       blissful_fermi
686ad3668047        ubuntu:16.04                                        "/bin/sh -c 'while..."   2 hours ago         Exited (0) 2 hours ago                         elated_brattain
[root@wtao-test-3 ~]# docker container rm 9edfa68b4a34
9edfa68b4a34
[root@wtao-test-3 ~]# docker container ls -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS                     PORTS               NAMES
686ad3668047        ubuntu:16.04                                        "/bin/sh -c 'while..."   2 hours ago         Exited (0) 2 hours ago                         elated_brattain
bfff06f01056        ubuntu:16.04                                        "/bin/bash"              2 hours ago         Up 2 hours                                     gallant_wiles

也可用使用docker rm <container name>来删除,如果要删除一个运行中的容器,可以添加-f参数。Docker 会发送 SIGKILL信号给容器。

如果数量太多要一个个删除可能会很麻烦,用docker container prunedocker ps -aq命令可以清理掉所有处于终止状态的容器。

[root@wtao-test-3 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
686ad36680476253592c5ee62d9a14155595d9403e4e0202615e3ee7ff132c5e
......
c85ac528ff42c2058b6dbb8ab8b12a6599e2033cbb6ae11bbef1683b4d31032e

11.删除本地镜像

如果要删除本地的镜像,可以使用docker image rmdocker rmi命令,其格式为:

$ docker image rm [options] <image1> [<image2> ...]
$ docker rmi image-name

或者用 ID、镜像名、摘要删除镜像 。