Docker 笔记——Docker 基本操作

安装 Docker

使用环境为 LinuxMint 18(基于 Ubuntu 16.04),基本参照官方文档进行。

Docker 基本操作

查看信息

1
docker info

通过docker info 命令查看输出的容器、镜像数量和基本的配置信息。

运行第一个容器

下面来创建第一个 Docker 容器:

1
docker run -i -t ubuntu /bin/bash

-t 参数将给容器分配一个伪 tty 终端,使我们可以创建一个可以交互的容器。-t 参数保证没有附着到容器时,STDIN 为开启状态。基于 ubuntu 创建一个容器,容器基于镜像创建,本地没有 ubuntu 镜像将从官方 Registry pull 仓库。随后的 /bin/bash 启动了一个 bash shell。

1
root@a6548f35ae74:/# 

现在就可以在容器中进行一系列操作。

使用容器

当输入 exit 时退出容器。此时容器也停止了运行。

查看容器的运行状态。

1
docker ps -a

docker ps 命令可以列出正在运行的容器,加 -a 参数可以列出所有的容器,包括停止运行的容器。

1
2
3
4
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6548f35ae74 ubuntu "/bin/bash" 8 minutes ago Exited (0) 3 seconds ago goofy_shirley
7b7d1d2c4fd4 ubuntu "/bin/bash" 33 minutes ago Exited (0) 32 minutes ago naughty_turing

容器命名

Docker 在创建容器的是否分配一个随机名字,当然也是可以更改的:

1
docker rename OLD_NAME NEW_NAME

或者在创建容器的时候指定 --name 参数来命名新容器:

1
2
3
4
5
6
7
$ docker run --name new_container -t -i ubuntu /bin/bash
root@081d0ff60f8b:/# exit
exit

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
081d0ff60f8b ubuntu "/bin/bash" 17 seconds ago Exited (0) 12 seconds ago new_container

容器的命名唯一,试图创建两个名字相同的容器会报错。

重启容器

重新启动已停止的容器:

1
2
3
4
5
6
$ docker start test
test

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6548f35ae74 ubuntu "/bin/bash" About an hour ago Up 5 seconds test

可以看到容器已经重新启动。要与之进行交互,attach container:

1
2
3
$ docker attach a6548f35ae74 
root@a6548f35ae74:/#
root@a6548f35ae74:/#

守护式容器

除了上述交互式容器,还可以创建守护式容器:

1
2
$ docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
87b0002a9aff201d54511bba95a5fc6c7f7772f40a4a384ff82c5300b607605d

-d 参数将创建一个后台运行的容器。

1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87b0002a9aff ubuntu "/bin/sh -c 'while tr" About a minute ago Up About a minute daemon_dave

通过 docker logs 命令可以获取容器的日志:

1
2
3
4
$ docker logs daemon_dave 
hello world
hello world
hello world

监控并格式化输出日志:

1
2
3
4
5
6
$ docker logs -f -t daemon_dave 
2016-09-30T03:55:26.662176379Z hello world
2016-09-30T03:55:27.663102063Z hello world
2016-09-30T03:55:28.664941891Z hello world
2016-09-30T03:55:29.666235163Z hello world
...

Ctrl + C 退出日志监控。

查看容器内进程和查看宿主机进程相似,都用 top 命令:

1
2
3
4
$ docker top daemon_dave 
UID PID PPID C STIME TTY TIME CMD
root 5049 25010 0 12:05 ? 00:00:00 sleep 1
root 25010 24993 0 11:55 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done

要在容器中额外启动新进程,可以使用 docker exec 命令:

1
2
$ docker exec -i -t daemon_dave /bin/bash
root@87b0002a9aff:/#

上面的命令在我们的后台容器中启动了一个交互式终端。

停止一个守护式容器:

1
2
3
4
5
6
$ docker stop daemon_dave 
daemon_dave

$ docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87b0002a9aff ubuntu "/bin/sh -c 'while tr" 17 minutes ago Exited (137) 2 minutes ago daemon_dave

上面的 docker ps 命令中的 -n x 参数可以列出最后 x 个容器,无论容器是否运行。

自动重启容器

--restart 标志检查容器的退出代码,并据此决定是否要重启容器。

1
2
$ docker run --restart=always --name daemon_dave -d ubuntu bin/sh -c "while true; do echo hello world; sleep 1; done"
69aabbf9da1cee212ae1dc2baf9c133572d9fe8beccba127b2088f0d7e0a3e3d

上述代码将导致无论退出代码是什么,都会使容器重启。此外还有 on-failure 标志,使退出代码为非 0 值时才重启。它还可接受一个可选的重启次数参数 on-failure:10 。最多重启 10 次。

容器信息

docker inspect 命令可以获取容器的详细信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ docker inspect daemon_dave
[
{
"Id": "69aabbf9da1cee212ae1dc2baf9c133572d9fe8beccba127b2088f0d7e0a3e3d",
"Created": "2016-09-30T04:32:08.74050402Z",
"Path": "bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2016-09-30T04:32:09.72241889Z",
"FinishedAt": "2016-09-30T04:37:35.465017364Z"
},
...

通过 -f 参数来获取制定结果:

1
2
3
4
5
$ docker inspect -f '{{ .State }}' daemon_dave
{exited false false false false false 0 137 2016-09-30T04:32:09.72241889Z 2016-09-30T04:37:35.465017364Z <nil>}

$ docker inspect -f '{{ .State.Status }}' daemon_dave
exited

删除容器

1
2
$ docker rm daemon_dave 
daemon_dave

运行中的容器不能删除,需先停止容器才可以删除。

本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处! © 雨落