(四)运行第一个容器
设置Docker镜像仓库
我这里为了下载镜像速度更快,使用了阿里的云加速,你只需注册即可使用。如下图:
修改配置文件/lib/systemd/system/docker.service
1
|
sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd --registry-mirror=https://qxx96o44.mirror.aliyuncs.com|g" /etc/systemd/system/docker .service
|
也可以直接添加,建议在daemon.json文件中添加。
重启服务
创建第一个容器:
创建一个容器很容易,我们使用docker run命令就可以完成,如下图:
1
2
3
|
docker run -i -t centos:6.6 /bin/bash
#可以写成如下形式,多个参数可以合并 docker run -it centos:6.6 /bin/bash
|
run命令是docker命令中的一个子命令,作用是运行一个容器
参数 | 说明 |
-i | 即使不连接到容器,也保持容器中的STDIN是打开的,也就是标准输入 |
-t | 为容器开启一个伪TTY终端 |
--name (两个短横线) |
为容器设定一个名称 |
--restart= (两个短横线) |
这个参数的含义是,如果容器意外关闭,是否自动重启,只要容器退出代码为非0,才会执行重启动作 always:总是自动重启 none:不重启 on-failure:# 重启,但最多重启#次 |
centos:6.6 |
这个是镜像名称,这里适用的是官方镜像,centos是仓库名称,6.6是标签。一个仓库可能有多个镜像,如果不指定具体标签(TAG),则默认会适用latest的,也就是仓库中最新的。 如果是适用非官方镜像他人或者你自己构建的镜像,这里的各式是 用户名/仓库名 如果第一次你不知道镜像仓库名称和标签,请访问 https://hub.docker.com/ |
/bin/bash |
容器启动后运行的程序,不是必须的 |
命令执行完毕后会自动进入容器中,正向上图显示的那样的命令提示符号是 [email protected]86 ,这一串字符是你建立容器的ID,同时也是默认的容器主机名称,如下图:
如果使用 --name 参数可以设置容器的名字,但是容器ID和系统主机名还是随机生成的。
docker run命令运行的过程是这样的:
1
|
docker run -it --name test1 centos:6.6 /bin/bash
|
首先docker会检查本地的镜像是否包含centos:6.6,如果有就使用本地镜像,如果没有就连接官方的Docker Hub Registry去下载,如果找到就会下载然后保存到本机中,然后尝试使用该镜像创建一个容器,最后运行指定的命令。这个容器拥有自己的独立的文件系统、网络(默认为桥接网络)。最后我们告诉新容器要运行什么命令,这里我们写的是/bin/bash,也就是在容器中运行一个Bash shell终端。
查看网络:
可以看到你会像使用普通Linux系统那样使用容器,同时默认使用了桥接网络。另外我们还可以安装软件
使用exit命令退出容器
一旦我们执行了exit命令,/bin/bash命令也就结束了,同时容器也停止了。但是容器还是存在的,可以通过下面的命令查看:
1
2
3
4
|
#查看所有容器,包括运行和退出的 docker ps -a
#仅查看当前运行的容器 docker pa |
如何重启启动或停止一个容器:
使用下面的命令重新启动一个容器
1
2
|
docker start 容器名称或者容器ID docker stop 容器名称或者容器ID |
我们看到 UP 标志,但是这个容器是后台运行的,那我们如何连接到这个容器的shell呢?
重新连接到运行中的容器:
必须要先启动一个容器,才能连接
1
|
docker attach 容器名称或者容器ID |
注意:运行命令后,会出现停滞的情况,其实不是停滞,你需要再次按一下回车才会进入到容器的命令提示符(有时可能需要)。当你再次执行exit后,容器会再次停止。
创建后台运行的容器:
如果需要长期运行容器,我们就要创建没有交互式会话的守护式容器,生产环境中基本都是这么运行运行的。我们使用下面的命令来后台运行容器:
使用-d参数来设置后台运行;--name的含义是设置一个容器名称,这样以后重启、删除就可以使用命令了。
1
2
3
4
5
|
docker run --name 容器名称 -d -i -t 镜像:版本 COMMAND #或者 docer run -itd --name 容器名称 镜像标签:版本 COMMAND #或者,不打开STDIN和TTY docker run -d --name 容器名称 镜像标签:版本 COMMAND |
注意:上图创建容器后列出了一长串字符,这个是长UUID,一般我们使用短UUID或者容器名称来操作容器。
看一下状态
连接到容器
注意:无论是交互式容器还是后台运行的容器,你只要连接进去再exit退出,容器都会终止运行。不过如果你的COMMAND是一个一次性命令,那么即使你使用-d参数,在容器创建成功以后,该命令会执行一次,然后该容器就会推出。
在容器内运行进程或者命令:
如果想在容器内部运行一个命令或者一个进程,可以不用连接到容器内部。使用下面的命令:
1
|
docker exec -d 容器名称或者ID COMMAND #-d是后台运行,如果不加则会在当前控制台暑促
|
如果我们想停止这个后台进程,你不能使用docker top输出的PID号,必须获取在容器中真正的PID号,然后进行KILL。
如果我们通过attach来附着到一个容器,然后再执行exit,那么容器也会退出,这时候如果我们进入容器执行命令,但是最后退出容器而不让容器也退出的话可以用下面的命令:
这个命令的含义是在容器中执行/bin/bash,也就是打开一个shell,由于有-it参数,就开启了STDIN和TTY,这样就进入了容器。
1
|
docker exec -it 容器名称或者ID /bin/bash
|
删除一个容器:
要想删除容器必须要先停止容器,然后再进行删除
1
2
|
docker stop 容器名称或者ID docker rm 容器名称或者ID
|
容器内部:
一个后台运行的容器有时我们需要知道它内部在做什么,所以我们可以通过日志功能来查看它现在正在执行任务或者通过其他命令查看它里面正在运行的进程。
我在一个容器中执行了一个PING命令
查看容器日志:
然后通过命令查看日志,它将查看整个日志
1
|
docker logs 容器名称或者ID |
也可以通过使用参数来实现日志追踪,也就是类似于Linux命令tail -f。通过这些参数就会只显示最新更新的日子,并持续显示,而不是显示整个日志。
参数 | 说明 |
--details |
查看详细日志 |
-f | 日志追踪 |
--since <string> | 表示从哪个时间戳开始显示 |
--tailf <stringr> | 表示显示第几行,0表示显示最新行 |
-t | 表示日志增加时间戳 |
1
|
docker logs -- tail 0 -f 容器名称或者ID
|
另外可以增加-t参数来给日志增加一个时间戳
查看容器内部运行的进程:
1
2
|
#该命令和进入容器运行ps命令显示的结果一样 docker top 容器名称或者ID
|
查看宿容器资源使用信息:
1
2
3
4
5
|
#显示指定容器的资源使用情况 docker stats 容器名称1 容器名称2 ...... #显示正在运行的容器资源使用情况 docker satas #显示所有(运行和退出的)容器的资源使用情况 |
注意:如果容器启动时不设置内存限制,那么上图中LIMIT则显示物理机内存大小,表示容器可以用的最大内存为多少。
查看容器详细信息:
1
|
docker inspect 容器名称或者容器ID |
但是如果信息太多也不利于分辨,有时我们只需要获取特定信息即可,这样就用到--format参数,比如我们想要获取容器是否在运行?
1
|
docker inspect -- format = '{{ .State.Running }}' 容器名称
|
这里就有一个问题,到底可以获取哪些信息,以及格式该如何写呢,其实这个很简单,我们看下图:
这都是一级一级的,有一级的,有二级的
下面我们获取IP地址
结合起来有没有看出点规律呢?
注意:花括号里面的ITEM,是区分大小写的。
本文转自linuxjavachen 51CTO博客,原文链接http://blog.51cto.com/littledevil/1863552:,如需转载请自行联系原作者