文章目录
本文大部分内容来自Docker–从入门到实践
命令 | 功能 |
---|---|
docker images [-a] | 查看本地镜像 |
docker images -q | 只显示镜像的id 信息 |
docker rmi [-f] <镜像> | 删除指定镜像 |
docker ps [-a] | 查看当前正在运行的容器,-a 表示显示所有的容器 |
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] | 从 Docker 镜像仓库获取镜像 |
docker run <镜像> | 根据某个镜像创建容器,如果镜像不存在,就去远方拉取 |
docker run -d | 让容器在后台运行,其实就是一个进程 |
docker run --name NAME | 给容器指定一个名字 |
docker run -p [容器宿主机端口]:[容器端口] | 将容器的端口映射到宿主机的端口 |
docker exec -it <容器> [bash|/bin/bash|sh] | 进入到某个容器中,通过命令交互 |
镜像操作
获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull --help
命令看到,这里我们说一下镜像名称的格式。
- Docker 镜像仓库地址:地址的格式一般是
<域名/IP>[:端口号]
。默认地址是 Docker Hub。 - 仓库名:如之前所说,这里的仓库名是两段式名称,即
<用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为library
,也就是官方镜像。
docker pull ubuntu:18.04
# 18.04: Pulling from library/ubuntu
# 23884877105a: Pull complete
# bc38caa0f5b9: Pull complete
# 2910811b6c42: Pull complete
# 36505266dcc6: Pull complete
# Digest: sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f
# Status: Downloaded newer image for ubuntu:18.04
# docker.io/library/ubuntu:18.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 18.04
的镜像。
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256
的摘要,以确保下载一致性。
列出镜像
要想列出已经下载下来的镜像,可以使用 docker image ls
命令。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个 标签。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 c3c304cb4f22 4 weeks ago 64.2MB
gitlab/gitlab-ce latest 6597e56a80f3 5 weeks ago 1.92GB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
列出特定的某个镜像
# 仓库名列出镜像
$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest f753707788c5 4 weeks ago 127 MB
# 指定仓库名和标签
$ docker image ls ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 f753707788c5 4 weeks ago 127 MB
指定过滤器显示镜像
# mongo:3.2 之后建立的镜像
$ docker image ls -f since=mongo:3.2
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
# mongo:3.2 之前建立的镜像
$ docker image ls -f before=mongo:3.2
...
# 使用label过滤
$ docker image ls -f label=com.example.version=0.1
...
显示镜像摘要 DIGEST
$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
ubuntu 18.04 sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f c3c304cb4f22 4 weeks ago 64.2MB
gitlab/gitlab-ce latest sha256:9be324293de2447c7b19146b58b01d2fae5b8539364bc4b4e0b3ffc45625006e 6597e56a80f3 5 weeks ago 1.92GB
hello-world latest sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76 bf756fb1ae65 4 months ago 13.3kB
显示镜像的ID
$ docker image ls -q
c3c304cb4f22
6597e56a80f3
bf756fb1ae65
# 删除所有仓库名为 redis 的镜像:
$ docker image rm $(docker image ls -q redis)
# 删除所有在 mongo:3.2 之前的镜像:
$ docker image rm $(docker image ls -q -f before=mongo:3.2)
自定义显示列表,这里用到了Go 的模板语法。
$ docker image ls --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis
05a60462f8ba: nginx
# 以表格等距显示,并且有标题行
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
5f515359c7f8 redis latest
05a60462f8ba nginx latest
fe9198c04d62 mongo 3.2
删除本地镜像
docker image rm [选项] <镜像短 ID|镜像长 ID|镜像名|镜像摘要1> [<镜像2> ...]
Aliases:
rm, rmi, remove
容器操作
新建并启动容器
下面的命令于ubuntu:18.04
镜像新建一个容器并启动输出一个 “Hello World”,之后终止容器
docker run ubuntu:18.04 /bin/echo 'Hello world'
# Hello world
启动一个 bash 终端,允许用户进行交互
docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i
则让容器的标准输入保持打开。在交互模式下的操作,就跟使用一台虚拟机一样了。
当利用 docker run
来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
容器名字和映射端口
-p
参数用来指定容器和宿主机的映射端口,-name
用来指定容器的名字。
docker run --name webserver -d -p 80:80 nginx
后台运行
通过添加 -d
参数来实现
$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
启动已经终止的容器
docker <containerName|containerID> start
终止一个容器
docker <containerName|containerID> stop
终止状态的容器可以用 docker container ls -a
命令查看。
重启一个容器
docker <containerName|containerID> restart
进入容器
在使用 -d
参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,就可以使用exec
命令。
docker exec -it <containerName|containerID> /bin/bash
只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
$ docker exec -i 69d1 bash
ls
bin
boot
dev
...
$ docker exec -it 69d1 bash
root@69d137adef7a:/#
删除容器
可以使用 docker container rm
来删除一个处于终止状态的容器。例如
$ docker container rm <containerName|containerID>
trusting_newton
如果要删除一个运行中的容器,可以添加 -f
参数。Docker 会发送 SIGKILL
信号给容器。
清理所有处于终止状态的容器
用 docker container ls -a
命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune
容器的导入和导出
将文件拷贝到本机
docker container cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
docker container cp [containID]:[/path/to/file] .
查看日志
docker container logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令查看输出。
docker container logs [containerID]