docker
程序是否存在,功能是否正常
$ sudo docker info
Containers: 0
Images: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 144
Execution Driver: native-0.1
Kernel Version: 3.8.0-29-generic
Registry: [https://index.docker.io/v1/]
在这里我们调用了docker
可执行程序的info
命令,该命令会返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。
2 运行我们的第一个容器
我们可以使用docker run
命令创建容器
$ sudo docker run -i -t ubuntu /bin/bash
Pulling repository ubuntu from https://index.docker.io/v1
Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu
Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c metadata
Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c fs layer
Downloading 58337280/? (n/a)
Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu
Pulling image 27cf784147099545 () from ubuntu
root@fcd78e1a3569:/#
$ sudo docker run -i -t ubuntu /bin/bash
首先,我们告诉Docker执行docker run
命令,并指定了-i
和-t
两个命令行参数。-i
标志保证容器中STDIN
是开启的,尽管我们并没有附着到容器中。持久的标准输入是交互式shell的“半边天”,-t
标志则是另外“半边天”,它告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数已经是最基本的参数了。
3 使用第一个容器
检查容器的主机名
root@f7cbdac22a02:/# hostname
f7cbdac22a02
检查容器的/etc/hosts文件
root@f7cbdac22a02:/# cat /etc/hosts
172.17.0.4 f7cbdac22a02
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
检查容器的接口
root@f7cbdac22a02:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
inet6 fe80::1450:3aff:feb6:f2cc/64 scope link
valid_lft forever preferred_lft forever
我们可以看到,这里有lo
的环回接口,还有IP为172.17.0.4
的标准eth0
网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程
检查容器的进程
root@f7cbdac22a02:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 18156 1936 ? Ss May30 0:00 /bin/bash
root 21 0.0 0.0 15568 1100 ? R+ 02:38 0:00 ps -aux
在第一个容器中安装软件包
root@f7cbdac22a02:/# apt-get update && apt-get install vim
4 容器命名
给容器命名
$ sudo docker run --name bob_the_container -i -t ubuntu /bin/bash
root@aa3f365f0f4e:/# exit
上述命令将会创建一个名为bob_the_container
的容器。一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-]
)。
5 重新启动已经停止的容器
启动已经停止运行的容器
$ sudo docker start bob_the_container
除了容器名称,我们也可以用容器ID来指定容器
6 附着到容器上
附着到正在运行的容器
$ sudo docker attach bob_the_container
7 创建守护式容器
创建长期运行的容器
$ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
1333bb1a66af402138485fe44a335b382c09a887aa9f95cb9725e309ce5b7db3
我们在上面的docker run
命令使用了-d
参数,因此Docker会将容器放到后台运行。
我们还在容器要运行的命令里使用了一个while
循环,该循环会一直打印hello world
,直到容器或其进程停止运行。如果我们执行docker ps
命令,可以看到一个正在运行的容器
8容器内部都在干些什么
获取守护式容器的日志
$ sudo docker logs daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
tail
命令后加入
-f --lines
标志即可。例如,可以用
docker logs --tail 10 daemon_dave
获取日志的最后10行内容。另外,也可以用
docker logs --tail 0 -f daemon_dave
命令来跟踪某个容器的最新日志而不必读取整个日志文件。
9 查看容器内的进程
查看守护式容器的进程
$ sudo docker top daemon_dave
该命令执行后,我们可以看到容器内的所有进程(主要还是我们的while
循环)、运行进程的用户及进程ID
docker``top
命令的输出结果
PID USER COMMAND
977 root /bin/sh -c while true; do echo hello world; sleep 1; done
1123 root sleep 1
10 在容器内部运行进程
在容器中运行后台任务
$ sudo docker exec -d daemon_dave touch /etc/new_config_file
这里的-d
标志表明需要运行一个后台进程,-d
标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在daemon_dave
容器内创建了一个空文件,文件名为/etc/new_config_file
。通过docker exec
后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。
在容器内运行交互命令
$ sudo docker exec -t -i daemon_dave /bin/bashVersion:
和运行交互容器时一样,这里的-t
和-i
标志为我们执行的进程创建了TTY并捕捉STDIN
。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave
容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。
11 停止守护式容器
停止正在运行的Docker容器
$ sudo docker stop daemon_dave
12 自动重启容器
自动重启容器
$ sudo docker run --restart=always --name daemon_dave -d ubuntu /
bin/sh -c "while true; do echo hello world; sleep 1; done"
在本例中,--restart
标志被设置为always
。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always
,我们还可以将这个标志设为on-failure
,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure``还接受``一个可选的
重启次数参数
为on-failure
指定count
参数
--restart=on-failure:5
这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。
13 深入容器
查看容器
$ sudo docker inspect daemon_dave
[{
"ID": "c2c4e57c12c4c142271c031333823af95d64b20b5d607970c334784430bcbd0f",
"Created": "2014-05-10T11:49:01.902029966Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Config": {
"Hostname": "c2c4e57c12c4",
. . .
docker inspect
命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
有选择地获取容器信息
$ sudo docker inspect --format='{{ .State.Running }}' daemon_dave
false
上面这条命令会返回容器的运行状态,示例中该状态为false
。我们还能获取其他有用的信息,如容器IP地址
查看容器的IP地址
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' \
daemon_dave
172.17.0.2
查看多个容器
$ sudo docker inspect --format '{{.Name}} {{.State.Running}}' \
daemon_dave bob_the_container
/daemon_dave false
/bob_the_container false
我们可以为该参数指定要查询和返回的查看散列(inspect hash)中的任意部分。
14 删除容器
删除容器
$ sudo docker rm 80430f8d0921
80430f8d0921
删除所有容器
docker rm `docker ps -a -q`
上面的docker ps
命令会列出现有的全部容器,-a
标志代表列出所有(all)容器,而-q
标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm
命令,从而达到删除所有容器的目的。
15 docker自定义IP网段
16基础镜像 Commit 生成镜像
除了通过 Dockerfile 来打包生成镜像外,也可以通过 Docker Commit 来生成镜像。通过 Commit 打包的镜像多是由于应用本身在部署时有大量的交互内容,无法通过命令来指定。 在通过 Commit 打包镜像时,我们需要如下操作:
1.启动一个基础镜像容器,并进入 console docker run -i – t centos:6.7
上面的命令创建了一个基于 CentOS 6.7 的容器,并进入到容器内
2.执行配置环境的命令 登陆容器后,可以执行各种 Linux 下的命令。
等配置完环境后,打开一个新的控制台 执行命令docker ps
,可以看到正在运行的容器,比如我的容器的 ID 就是 35f1c2ae1f7e
3.将容器打包成镜像 执行命令 docker commit 35f1c2ae1f7e mynewimage
就将容器35f1c2ae1f7e打包为新的镜像mynewimage了
可以执行docker images
查看镜像