2. 容器使用
获取镜像
如果本地没有ubuntu镜像,可使用docker pull
下载:
root@cg:~/Desktop# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
root@cg:~/Desktop#
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数表示以命令行模式进入该容器:
root@cg:~/Desktop# docker run -it ubuntu /bin/bash
root@77bf8684f60d:/#
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里需要使用交互式方式Shell访问容器,因此用的是 /bin/bash。
要退出终端,直接输入 exit
:
root@77bf8684f60d:/# exit
exit
root@cg:~/Desktop#
启动已停止运行的容器
查看所有的容器命令如下:
root@cg:~/Desktop# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 8 minutes ago Exited (0) 7 minutes ago strange_euclid
efdb36b237c5 ubuntu:16.04 "/bin/bash -c 'while\u2026" 14 hours ago Exited (137) 13 hours ago naughty_hellman
4eda574d7063 hello-world:latest "/hello" 14 hours ago Exited (0) 14 hours ago vigilant_nobel
root@cg:~/Desktop#
注意:docker ps
命令只显示当前正在运行的容器,-a选项表示显示所有容器,包括停止运行的容器。
从 Status 一列中可以看出容器 77bf8684f60d 已处于停止运行状态。
使用 docker start 启动一个已停止的容器:
root@cg:~/Desktop# docker start 77bf8684f60d
77bf8684f60d
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 14 minutes ago Up 1 second strange_euclid
root@cg:~/Desktop#
可以看出,容器 77bf8684f60d 已顺利启动。
后台运行
在大部分的场景下,docker 的服务是在后台运行的,可以通过 -d 指定容器的运行模式。
root@cg:~/Desktop# docker run -itd --name ubuntu_test ubuntu /bin/bash
7eb79964161ba593d39f40cecabb581178b080fcefdb724bfebf365dd837c379
root@cg:~/Desktop#
注意:加了 -d 参数默认不会进入容器,可通过 docker exec
命令进入容器(后续详细介绍)。
停止一个容器
停止容器的命令为:docker stop <容器 ID>
示例如下:
root@cg:~/Desktop# docker stop 7eb79964161b
7eb79964161b
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 29 minutes ago Up 6 minutes strange_euclid
root@cg:~/Desktop# docker restart 7eb79964161b
7eb79964161b
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb79964161b ubuntu "/bin/bash" 11 minutes ago Up 5 seconds ubuntu_test
77bf8684f60d ubuntu "/bin/bash" 29 minutes ago Up 6 minutes strange_euclid
root@cg:~/Desktop#
除了docker start
外,停止的容器也可以通过命令docker restart <容器 ID>
重启:
进入容器
在使用 -d 参数时,容器启动后会在后台运行。此时想要进入容器,可通过以下命令进入:
- docker attach
- docker exec
推荐使用 docker exec
命令,因为使用该命令退出容器终端后,不会导致容器停止运行。
attach 命令
下面演示了 docker attach
命令的使用。
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb79964161b ubuntu "/bin/bash" 2 hours ago Up 9 seconds ubuntu_test
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
root@cg:~/Desktop# docker attach 7eb79964161b
root@7eb79964161b:/# exit
exit
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
root@cg:~/Desktop#
可以看出,使用 docker attach 命令进入容器后,如果从该容器退出,会导致容器停止运行。
exec 命令
下面演示了 docker exec
命令的使用。
root@cg:~/Desktop# docker start 7eb79964161b
7eb79964161b
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb79964161b ubuntu "/bin/bash" 2 hours ago Up 3 seconds ubuntu_test
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
root@cg:~/Desktop# docker exec -it 7eb79964161b /bin/bash
root@7eb79964161b:/# exit
exit
root@cg:~/Desktop# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb79964161b ubuntu "/bin/bash" 2 hours ago Up 11 seconds ubuntu_test
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
root@cg:~/Desktop#
可以看出,使用 docker exec命令进入容器后,从容器退出不会导致容器停止运行。因此,推荐使用 docker exec 命令。
请使用 docker exec --help 命令查看 docker exec 命令的更多参数说明。
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
root@cg:~/Desktop# docker export 7eb79964161b -o ubuntu_test.tar
root@cg:~/Desktop# ls -l ubuntu_test.tar
-rw------- 1 root root 66572800 Jan 28 05:56 ubuntu_test.tar
root@cg:~/Desktop#
导出容器 7eb79964161b 快照到本地文件 ubuntu_test.tar ,从上图中可以看出桌面上生成了文件 ubuntu_test.tar 。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下命令将快照文件 ubuntu_test.tar 导入为镜像 cg/my_ubuntu:v1:
root@cg:~/Desktop# docker import ubuntu_test.tar cg/my_ubuntu:v1.0
sha256:66b77375323c9e42044fd09d9f09f083a7bb43bcd5a627555b161fe33575e7af
root@cg:~/Desktop# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cg/my_ubuntu v1.0 66b77375323c 3 seconds ago 64.2MB
ubuntu 16.04 96da9143fb18 12 days ago 124MB
ubuntu latest ccc6e87d482b 12 days ago 64.2MB
hello-world latest fce289e99eb9 13 months ago 1.84kB
root@cg:~/Desktop#
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tar example/imagerepo
删除容器
删除容器使用 docker rm 命令:
root@cg:~/Desktop# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb79964161b ubuntu "/bin/bash" 2 hours ago Up 19 minutes ubuntu_test
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
efdb36b237c5 ubuntu:16.04 "/bin/bash -c 'while\u2026" 16 hours ago Exited (137) 15 hours ago naughty_hellman
4eda574d7063 hello-world:latest "/hello" 17 hours ago Exited (0) 17 hours ago vigilant_nobel
root@cg:~/Desktop# docker stop 7eb79964161b
7eb79964161b
root@cg:~/Desktop# docker rm 7eb79964161b
7eb79964161b
root@cg:~/Desktop# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
efdb36b237c5 ubuntu:16.04 "/bin/bash -c 'while\u2026" 16 hours ago Exited (137) 15 hours ago naughty_hellman
4eda574d7063 hello-world:latest "/hello" 17 hours ago Exited (0) 17 hours ago vigilant_nobel
root@cg:~/Desktop#
可见通过 docker rm 删除容器7eb79964161b后,在容器列表中已经移除了该容器。
通过 docker container prune
命令可将处于终止状态的容器全部删除。
以下操作演示了该命令的使用,首先使用 ubuntu 镜像创建三个容器,并将其终止,
root@cg:~/Desktop# docker run -itd --name ubuntu_test1 ubuntu
be9afaab456869f0c5606b483de9fb064757c8d4217a07f2e29c2e71d41cd974
root@cg:~/Desktop# docker run -itd --name ubuntu_test2 ubuntu
77925c6165783ae7d2320b277a8e5be0c4f6e7d56dcda76aa0d089a74e31eb49
root@cg:~/Desktop# docker run -itd --name ubuntu_test3 ubuntu
5c34d8507ad3e4a2a73f44e0094a843d3b9f2635d0919b47f76c564010c2a571
root@cg:~/Desktop# docker stop ubuntu_test1
ubuntu_test1
root@cg:~/Desktop# docker stop ubuntu_test2
ubuntu_test2
root@cg:~/Desktop# docker stop ubuntu_test3
ubuntu_test3
root@cg:~/Desktop#
然后使用docker container prune
删除停止的容器,操作如下:
root@cg:~/Desktop# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c34d8507ad3 ubuntu "/bin/bash" 55 seconds ago Exited (0) 37 seconds ago ubuntu_test3
77925c616578 ubuntu "/bin/bash" 59 seconds ago Exited (0) 42 seconds ago ubuntu_test2
be9afaab4568 ubuntu "/bin/bash" About a minute ago Exited (0) 48 seconds ago ubuntu_test1
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
efdb36b237c5 ubuntu:16.04 "/bin/bash -c 'while\u2026" 16 hours ago Up 2 minutes naughty_hellman
4eda574d7063 hello-world:latest "/hello" 17 hours ago Exited (0) About a minute ago vigilant_nobel
root@cg:~/Desktop#
root@cg:~/Desktop# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5c34d8507ad3e4a2a73f44e0094a843d3b9f2635d0919b47f76c564010c2a571
77925c6165783ae7d2320b277a8e5be0c4f6e7d56dcda76aa0d089a74e31eb49
be9afaab456869f0c5606b483de9fb064757c8d4217a07f2e29c2e71d41cd974
4eda574d7063857dcdcee7cd3da3679ab8e2856121fde3fa76ee28a33b4757be
Total reclaimed space: 0B
root@cg:~/Desktop# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77bf8684f60d ubuntu "/bin/bash" 2 hours ago Up 2 hours strange_euclid
efdb36b237c5 ubuntu:16.04 "/bin/bash -c 'while\u2026" 16 hours ago Up 2 minutes naughty_hellman
root@cg:~/Desktop#
首先使用 docker ps -a
查看所有容器状态,可以看到ubuntu_test1、ubuntu_test2、ubuntu_test3这三个容器都已经处于终止状态。
docker container prune
命令执行后,再使用 docker ps -a
查看,可以发现ubuntu_test1、ubuntu_test2、ubuntu_test3这三个容器都已删除。
注意:实验环境中还存在一个已经停止运行的hello-world容器,该容器也被 docker container prune
命令删除。这个hello-world容器是运行其他实验时遗留的容器,如果你的环境中不存在该容器也不用担心。