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 prune
或docker 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 rm
或docker rmi
命令,其格式为:
$ docker image rm [options] <image1> [<image2> ...]
$ docker rmi image-name
或者用 ID、镜像名、摘要删除镜像 。