如何进入docker 进入容器容器

迈出使用Docker的第一步,学习第一个Docker容器 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了384150字,被732人关注,获得了1983个喜欢
迈出使用Docker的第一步,学习第一个Docker容器
在本文中,我们将迈出使用Docker的第一步,学习第一个Docker容器。本章还会介绍如何与Docker进行交互的基本知识。
1 确保Docker已经就绪
首先,我们会查看Docker是否能正常工作,然后学习基本的Docker的工作流:创建并管理容器。我们将浏览容器的典型生命周期:从创建、管理到停止,直到最终删除。
第一步,查看docker程序是否存在,功能是否正常,如代码清单3-1所示。
代码清单3-1 查看docker程序是否正常工作
$ sudo docker info
Containers: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
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的基本配置。
在前面几章我们已经介绍过,Docker是基于客户端-服务器构架的。它有一个docker程序,既能作为客户端,也可以作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求(如请求返回守护进程自身的信息),然后再对返回来的请求结果进行处理。
2 运行我们的第一个容器
现在,让我们尝试启动第一个Docker容器。我们可以使用docker run命令创建容器,如代码清单3-2所示。docker run命令提供了Docker容器的创建到启动的功能,在本书中我们也会使用该命令来创建新容器。
代码清单3-2 创建第一个容器
$ sudo docker run -i -t ubuntu /bin/bash
Pulling repository ubuntu from https://index.docker.io/v1
Pulling image 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu
Pulling 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c metadata
Pulling 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c fs layer
Downloading /? (n/a)
Pulling image b750fea3c593ef05ba02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu
Pulling image 27cf () from ubuntu
root@fcd78e1a3569:/#
{提示}官方文档列出了完整的Docker命令列表,你也可以使用docker help获取这些命令。此外,你还可以使用Docker的man页(即执行man docker-run)。
代码清单3-3所示命令的输出结果非常丰富,下面我们来逐条解析。
代码清单3-3 docker run命令
$ sudo docker run -i -t ubuntu /bin/bash
首先,我们告诉Docker执行docker run命令,并指定了-i和-t两个命令行参数。-i标志保证容器中STDIN是开启的,尽管我们并没有附着到容器中。持久的标准输入是交互式shell的“半边天”,-t标志则是另外“半边天”,它告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数已经是最基本的参数了。
{提示}官方文档上列出了docker run命令的所有标志,此外还可以用命令docker help run查看这些标志。或者,也可以用Docker的man页(也就是执行man docker-run命令)。
接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker HubRegistry上。
你可以用 ubuntu 基础镜像(以及类似的 fedora、debian、centos等镜像)为基础,在你选择的操作系统上构建自己的镜像。这里,我们基于此基础镜像启动了一个容器,并且没有对容器进行任何改动。
那么,在这一切的背后又都发生了什么呢?首先Docker会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么Docker就会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个Bash shell。
当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,这时我们就可以看到容器内的shell了,就像代码清单3-4所示。
代码清单3-4 第一个容器的shell
root@f7cbdac22a02:/#
{注意}在第4章中,我们将会看到如何构建自己的镜像并基于该镜像创建容器的基础知识。
3 使用第一个容器
现在,我们已经以root用户登录到了新容器中,容器的ID f7cbdac22a02``,乍``看起来有些令人迷惑的字符串。这是一个完整的Ubuntu系统,你可以用它来做任何事情。下面我们就来研究一下这个容器。首先,我们可以获取该容器的主机名,如代码清单3-5所示。
代码清单3-5 检查容器的主机名
root@f7cbdac22a02:/# hostname
f7cbdac22a02
可以看到,容器的主机名就是该容器的ID。我们再来看看/etc/hosts文件,如代码清单3-6所示。
代码清单3-6 检查容器的/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
Docker以在hosts文件中为该容器的IP地址添加了一条主机配置项。我们再来看看容器的网络配置情况,如代码清单3-7所示。
代码清单3-7 检查容器的接口
root@f7cbdac22a02:/#
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网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程,如代码清单3-8所示。
代码清单3-8 检查容器的进程
root@f7cbdac22a02:/#
PID %CPU %MEM
STAT START
TIME COMMAND
0:00 /bin/bash
0:00 ps -aux
接下来我们要干些什么呢?安装一个软件包怎么样?如代码清单3-9所示。
代码清单3-9 在第一个容器中安装软件包
root@f7cbdac22a02:/# apt-get update && apt-get install vim
通过上述命令,我们就在容器中安装了Vim软件。
你可以继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。
这个容器现在怎样了?容器现在已经停止运行了!只有在指定的/bin/bash命令处于运行状态的时候,我们容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。
但容器仍然是存在的,我们可以用docker ps -a命令查看当前系统中容器的列表
默认情况下,当执行docker ps命令时,只能看到正在运行的容器。如果指定-a标志,选项的话,那么docker ps命令会列出所有容器,包括正在运行的和已经停止的。
{提示}你也可以为docker ps命令指定-l标志,该选项会列出最后一次运行的容器,包括正在运行和已经停止的。
从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)。我们还可以看到,每个容器都有一个名称。
{注意}有三种方式可以指代唯一容器:短UUID(如f7cbdac22a02)、长UUID(如f7cbdac22a02e03ce54db9d20cfa2ac1fc872e74778)或者名称(如gray_cat)。
4 容器命名
Docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面我们刚刚创建的容器就被命名为gray_cat。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现,如代码清单3-10所示。
代码清单3-10 给容器命名
$ 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_.-])。
在很多Docker命令中,我们都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了。我推荐大家都使用容器名称,以更加方便地管理容器。
容器的命名必须是唯一的。如果我们试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。
5 重新启动已经停止的容器
bob_the_container容器已经停止了,接下来我们能对它做些什么呢?如果愿意,我们可以用下面的命令重新启动一个已经停止的容器,如代码清单3-11所示。
代码清单3-11 启动已经停止运行的容器
$ sudo docker start bob_the_container
除了容器名称,我们也可以用容器ID来指定容器,如代码清单3-12所示。
代码清单3-12 通过ID启动已经停止运行的容器
$ sudo docker start aa3f365f0f4e
{提示}我们也可以使用docker restart命令来重新启动一个容器。
这时运行不带-a标志的docker ps命令,就应该看到我们的容器已经开始运行了。
6 附着到容器上
Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。此外,我们也可以用docker attach命令,重新附着到该容器的会话上,如代码清单3-13所示。
代码清单3-13 附着到正在运行的容器
$ sudo docker attach bob_the_container
我们也可以使用容器ID,重新附着到容器的会话上,如代码清单3-14所示。
代码清单3-14 通过ID附着到正在运行的容器
$ sudo docker attach aa3f365f0f4e
现在,我们又重新回到了容器的Bash提示符,如代码清单3-15所示。
代码清单3-15 重新附着到容器的会话
root@aa3f365f0f4e:/#
{提示}你可能需要按下回车键才能进入该会话。
如果退出容器的shell,容器也会随之停止运行。
7 创建守护式容器
除了这些交互式运行的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。下面我们就来启动一个守护式容器,如代码清单3-16所示。
代码清单3-16 创建长期运行的容器
$ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c " sleep 1; done"
affe44a335b382c09a887aa9f95cbb7db3
我们在上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。
我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。
通过组合使用上面的这些参数,你可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在主机的命令行之中。如果我们执行docker ps命令,可以看到一个正在运行的容器,如代码清单3-17所示。
代码清单3-17 查看正在运行的daemon_dave容器
CONTAINER ID IMAGE
PORTS NAMES
af ubuntu:14.04 /bin/sh -c 'while tr 32 secs ago
daemon_dave
8容器内部都在干些什么
现在我们已经有了一个在后台运行while循环的守护型容器。为了探究该容器内部都在干些什么,我们可以用docker logs命令来获取容器的日志,如代码清单3-18所示。
代码清单3-18 获取守护式容器的日志
$ sudo docker logs daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
这里,我们可以看到while循环正在向日志里打印hello world。Docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令非常相似,如代码清单3-19所示。
代码清单3-19 跟踪守护式容器的日志
$ sudo docker logs -f daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
{提示}可以通过Ctrl+C退出日志跟踪。
我们也可以跟踪容器日志的某一片段,和之前类似,只需要在tail命令后加入-f --lines标志即可。例如,可以用docker logs --tail 10 daemon_dave获取日志的最后10行内容。另外,也可以用docker logs --tail 0 -f daemon_dave命令来跟踪某个容器的最新日志而不必读取整个日志文件。
为了让调试更简单,我们还可以使用-t标志为每条日志项加上时间戳,如代码清单3-20所示。
代码清单3-20 跟踪守护式容器的最新日志
$ sudo docker logs -ft daemon_dave
[May 10 13:06:17.934] hello world
[May 10 13:06:18.935] hello world
[May 10 13:06:19.937] hello world
[May 10 13:06:20.939] hello world
[May 10 13:06:21.942] hello world
{提示}同样,可以通过Ctr+C退出日志跟踪。
9 查看容器内的进程
除了容器的日志,我们也可以查看容器内部运行的进程。要做到这一点,要使用docker top命令,如代码清单3-21所示。
代码清单3-21 查看守护式容器的进程
$ sudo docker top daemon_dave
该命令执行后,我们可以看到容器内的所有进程(主要还是我们的while循环)、运行进程的用户及进程ID,如代码清单3-22所示。
代码清单3-22 docker``top命令的输出结果
USER COMMAND
root /bin/sh - sleep 1; done
1123 root sleep 1
10 在容器内部运行进程
在Docker 1.3之后,我们也可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shell的任务,交互式任务是很实用的。下面我们先来看一个后台任务的例子,如代码清单3-23所示。
代码清单3-23 在容器中运行后台任务
$ sudo docker exec -d daemon_dave touch /etc/new_config_file
这里的-d标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在daemon_dave容器内创建了一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。
我们也可以在daemon_dave容器中启动一个诸如打开shell的交互式任务,如代码清单3-24所示。
代码清单3-24 在容器内运行交互命令
$ sudo docker exec -t -i daemon_dave /bin/bashVersion:
和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。
{注意}docker exec命令是Docker 1.3引入的,早期版本并不支持该命令。对于早期Docker版本,请参考第6章中介绍的nsenter命令。
11 停止守护式容器
要停止守护式容器,只需要执行docker stop命令,如代码清单3-25所示。
代码清单3-25 停止正在运行的Docker容器
$ sudo docker stop daemon_dave
当然,也可以用容器ID来指代容器名称,如代码清单3-26所示。
代码清单3-26 通过容器ID停止正在运行的容器
$ sudo docker stop c2c4e57c12c4
{注意}docker stop命令会向Docker容器进程发送SIGTERM信号。如果你想快速停止某个容器,也可以使用docker kill命令来向容器进程发送SIGKILL信号。
要想查看已经停止的容器的状态,则可以使用docker ps命令。还有一个很实用的命令docker ps -n x,该命令会显示最后x个容器,不论这些容器正在运行还是已经停止。
12 自动重启容器
如果由于某种错误而导致容器停止运行,我们还可以通过--restart标志,让Docker自动重新启动该容器。--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器。
代码清单3-27是一个在docker run命令中使用—restart标志的例子。
代码清单3-27 自动重启容器
$ sudo docker run --restart=always --name daemon_dave -d ubuntu /
bin/sh -c " sleep 1; done"
在本例中,--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure``还接受``一个可选的重启次数参数,如代码清单3-28所示。
代码清单3-28 为on-failure指定count参数
--restart=on-failure:5
这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。
{注意}--restart标志是Docker1.2.0引入的选项。
13 深入容器
除了通过docker ps命令获取容器的信息,我们还可以使用docker inspect``来获得更多的容器信息,如代码清单3-29所示。
代码清单3-29 查看容器
$ sudo docker inspect daemon_dave
"ID": "c2c4e57c12c4cd64b20b5d784430bcbd0f",
"Created": "T11:49:01.Z",
"Path": "/bin/sh",
" sleep 1; done"
"Config": {
"Hostname": "c2c4e57c12c4",
docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
我们也可以用-f或者--format标志来选定查看结果,如代码清单3-30所示。
代码清单3-30 有选择地获取容器信息
$ sudo docker inspect --format='{{ .State.Running }}' daemon_dave
上面这条命令会返回容器的运行状态,示例中该状态为false。我们还能获取其他有用的信息,如容器IP地址,如代码清单3-31所示。
代码清单3-31 查看容器的IP地址
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' \
daemon_dave
172.17.0.2
{提示}--format或者-f标志远非表面看上去那么简单。该标志实际上支持完整的Go语言模板。用它进行查询时,可以充分利用Go语言模板的优势。
我们也可以同时指定多个容器,并显示每个容器的输出结果,如代码清单3-32所示。
代码清单3-32 查看多个容器
$ sudo docker inspect --format '{{.Name}} {{.State.Running}}' \
daemon_dave bob_the_container
/daemon_dave false
/bob_the_container false
我们可以为该参数指定要查询和返回的查看散列(inspect hash)中的任意部分。
{注意}除了查看容器,你还可以通过浏览/var/lib/docker目录来深入了解Docker的工作原理。该目录存放着Docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers目录下。
14 删除容器
如果容器已经不再使用,可以使用docker rm命令来删除它们,如代码清单3-33所示。
代码清单3-33 删除容器
$ sudo docker rm 1
{注意}需要注意的是,运行中的Docker容器是无法删除的!你必须先通过docker stop或docker kill命令停止容器,才能将其删除。
目前,还没有办法一次删除所有容器,不过可以通过代码清单3-34所示的小技巧来删除全部容器。
代码清单3-34 删除所有容器
docker rm `docker ps -a -q`
上面的docker ps命令会列出现有的全部容器,-a标志代表列出所有(all)容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm命令,从而达到删除所有容器的目的。
在本章中我们介绍了Docker容器的基本工作原理。这里学到的内容也是本书剩余章节中学习如何使用Docker的基础。
本文摘自《第一本Docker书》
全球第一本Docker书
Docker公司前服务与支持副总裁力作!
全球第一本Docker技术图书!
学习Docker必备的第一本书!
购买入口:
ptpressitbooks二维码
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
程序员的最佳技术书推荐,技术书书讯,欢迎大家投搞给程序员书屋。联系小编请新浪微博@出版圈郭志敏 。
郭志敏:出版圈里的媒体运营
...
· 9417人关注
把我知道的都告诉你
· 2068人关注
· 372人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:当前位置:
在容器中安装新的程序
<dd data-toggle='tooltip' data-placement='top' data-original-title='添加时间: 20:18:56 '>
<dd data-toggle='tooltip' data-placement='top' data-original-title='作者:王春生 '> 王春生
<dd data-toggle='tooltip' data-placement='top' data-original-title='阅读:121297 '> 121297
最后编辑:王春生 于
简介:在docker容器中安装新的程序。
在容器中安装新的程序
下一步我们要做的事情是在容器里面安装一个简单的程序(ping)。我们之前下载的tutorial镜像是基于ubuntu的,所以你可以使用ubuntu的apt-get命令来安装ping程序:apt-get install -y ping。
备注:apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
在learn/tutorial镜像里面安装ping程序。
在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。
正确的命令:
$docker run learn/tutorial apt-get install -y ping
关键词:docker安装程序
max volume
full screen
Update Required
To play the media you will need to either update your browser to a recent version or update your .atiger77 的BLOG
用户名:atiger77
文章数:11
访问量:1429
注册日期:
阅读量:5863
阅读量:12276
阅读量:364563
阅读量:1059798
51CTO推荐博文
前言:& & & 在几个月前搭建了一个架构可以通过网页形式访问并对Docker中的容器进行操作,现将其进行整理一并发出。此篇文章我会将Docker部分的部署过程详细写出,这里对Docker的介绍就不在进行多余的讲解了有需要的朋友可以自行百度下,下面的架构图第一次用这种形式展示画的不好还请见谅。架构分析:1.整体拓扑图a.HaProxy本次架构中haproxy充当负载均衡的工作,当client端访问容器时,ha会自动为客户切换后端的guacamoleserver达到负载均衡的目的。b.GuacamoleALLINONE-01/02:这里提供提供两台GuacamoleALLINONE服务器(包括guacamoleclient端和guacamoleserver端)c.DockerServer:在DockerServer中会运行着很多的container,为了从网页中更好的看到效果container中安装了vnc并将其端口进行转出。d.Dockerhub:这里搭建了一个私有的dockerhub用来存放使用的镜像。2.用户访问过程:当用户点击对应的容器时,首先会经过Haproxy将为客户选择一个guacamoleserver,再有guacamoleserver访问dockerserver中对应的container,完成打开的一个流程。注释:由于将整个架构的具体配置写在一篇中较为冗长,这里主要使用一台guacamoleALLINONE一台docker来完成最基础的架构,最后会模拟client进行访问。环境配置:a.操作系统:centos6.6(kernel2.6.32)b.java-version:1.8.0_25c.guacamole-version:0.93d.MVN-version:3.2.3e.docker-version:1.5.0注释:这里只讨论下两个问题,其一centos版本的选择,之前配置时对使用内核2.6还是内核3.0做了一番思考最终还是决定使用2.6的内核(主要还是考虑到centos7操作与之前的版本有很大的不同,操作起来还是不上手),仅仅做这个测试用2.6的内核是完全没有问题的,如果用docker跑其他的服务比如zookeeper可能会出现问题其导致的原因是内核版本过低,倘若公司没有内核开发的团队使用docker跑线上的业务还是建议按照官方文档所说使用3.0内核。其二容器要不要给swap,这里用腾讯的Gaia给大家举个例子(Gaia是腾讯自己开发的万台规模Docker应用),经过测试最后是将容器的swap全部取消了,取消之后发现性能比之前更加的稳定了,这里大家懂了把。Guacamole-Server配置过程:1.升级yum源rpm&-ivh/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm&&-ivhhttp://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm2.安装依赖包yum&install&freerdp-devel&pango-devel&libssh2-devel&libtelnet-devel&libvncserver-devel&&libpng-devel&cairo-devel&uuid-devel&gcc&tomcat&fontforge&&-y3.上传所需包到服务器jdk-8u25-linux-x64.rpmapache-maven-3.2.3-bin.targuacamole-client-0.9.3.tar.gz && & & & guacamole-server-0.9.3.tar.gz注释:这里由于我本地已经下载完成了,jdk的包建议去oracle官网下载对应版本,guacamole的相关包可以去guacamole官网下载,如果不需要密码访问还需要上传一个名为guacamole-auth-noauth-0.9.3.tar.gz的包。4.安装上传的java包#rpm&-ivh&jdk-8u25-linux-x64.rpm修改/etc/profile文件,在profile文件下面追加写入下面信息:exportJAVA_HOME=/usr/java/jdk1.8.0_25
export&&&CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export&PATH=$PATH:$JAVA_HOME/bin保存退出,执行:source /etc/profile#source&/etc/profile完成后查看java是否安装成功:#&java&-version
&&&javaversion&"1.8.0_25"
&&&Java(TM)&SERuntime&Environment&(build&1.8.0_25-b17)
&&&JavaHotSpot(TM)&64-Bit&Server&VM&(build&25.25-b02,&mixed&mode)5.安装MVN将apache-maven-3.2.3-bin.tar.gz 解压至当前目录:#tar&-zxvfapache-maven-3.2.3-bin.tar.gz重命名文件夹:#mv&apache-maven-3.2.3&apache-maven执行&vi /etc/profile&文件,插入如下内容:export&M2_HOME=/xxx(解压位置)/apache-maven
PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin保存退出,执行以下命令:#source&/etc/profile完成后查看MVN是否安装成功:#mvn&-v
Apache&Maven&3.2.3&(33f8c3e1027c3ddde99d3cdebadfdf4;&T04:58:10+08:00)
Maven&home:&/root/apache-maven
Java&version:&1.8.0_25,&vendor:&Oracle&Corporation
Java&home:&/usr/java/jdk1.8.0_25/jre
Default&locale:&en_US,&platform&encoding:&UTF-8
OS&name:&"linux",&version:&"2.6.32-504.el6.x86_64",&arch:&"amd64",&family:&"unix"6.安装guacamole-server解压文件包&#&tar&-xzf&guacamole-server-0.9.3.tar.gz进入目录执行#&./configure&&--with-init-dir=/etc/init.d全部YES为安装成功&Librarystatus:
&&&&&freerdp.............&yes
&&&&&pango...............&yes
&&&&&libssh2.............&yes
&&&&&libssl..............&yes
&&&&&libtelnet...........&yes
&&&&libVNCServer&........&yes
&&&&&libvorbis...........&yes
&&&&&libpulse............&no
&&&Protocolsupport:
&&&&&&RDP.......&yes
&&&&&&SSH.......&yes
&&&&&&Telnet&....yes
&&&&&&VNC.......&yes注释:libpulse是音频相关的库没有不会影响后续的操作,如果显示库为no说明安装环境时少装了包,这里都至需要安装devel的相关开发包,下面的为支持的协议用的较多的是ssh和vnc两种。检查通过以后进行编译安装make&&&&make&install7.安装guacamole-client解压文件包后进入该文件夹#tar&-xzf&guacamole-client-0.9.3.tar.gz执行mvn package命令#mvn&package看到类似一下信息表示已成功执行完成[INFO]&------------------------------------------------------------------------
[INFO]&Reactor&Summary:
[INFO]&guacamole-common&...................................&SUCCESS&[04:16&min]
[INFO]&guacamole-common-js&................................&SUCCESS&[19:21&min]
[INFO]&guacamole&..........................................&SUCCESS&[03:02&min]
[INFO]&guacamole-ext&......................................&SUCCESS&[&&7.094&s]
[INFO]&guacamole-client&...................................&SUCCESS&[&&0.566&s]
[INFO]&------------------------------------------------------------------------
[INFO]&BUILD&SUCCESS
[INFO]&------------------------------------------------------------------------
[INFO]&Total&time:&26:48&min
[INFO]&Finished&at:&T01:01:22+08:00
[INFO]&Final&Memory:&36M/87M
[INFO]&------------------------------------------------------------------------复制war文件#cp&&/root/guacamole-client-0.9.3/guacamole/target/guacamole-0.9.3.war&/var/lib/tomcat/webapps/guacamole.war新建两个文件夹&#mkdir&/etc/guacamole
#mkdir/usr/share/tomcat/.guacamole将example中的配置文件复制到/etc/guacamole下#&cp&/root/guacamole-client-0.9.3/guacamole/doc/example/guacamole.properties&&&/etc/guacamole/guacamole.properties对guacamole.properties 文件做链接#ln&-s&/etc/guacamole/guacamole.properties&/usr/share/tomcat/.guacamole/修改配置文件#vi&/etc/guacamole/guacamole.properties
basic-user-mapping:/etc/guacamole/user-mapping.xml注释:只需要修改这一行,修改path指定到/etc/guacamole下。新建user-mapping.xml#vi&/etc/guacamole/user-mapping.xml
&user-mapping&
&&&&&&&&&authorize&username="admin"&password="admin"&(这里的用户名和密码为网页登录时的所需的用户和密码)
&&&&&&&&&&&&&&&&&connectionname="vnc"&&(显示的名称)
&&&&&&&&&&&&&&&&&protocol&ssh&/protocol&(链接的方式)
&&&&&&&&&&&&&&&&&paramname="hostname"&localhost&/param&
&&&&&&&&&&&&&&&&&paramname="port"&22&/param&(端口号)
&&&&&&&&&&&&&&&&&paramname="password"&xxxxx&/param&(连接机器密码)
&&&&&&&&&&&&&&&&&/connection&&
&&&&&&&&&&&&&&&&
&&&&&&&&&/authorize&
&/user-mapping&注释:guacamole配置文件比较坑的一点就是只要打错固定格式的一个字符登录时候失败。重启guacd和tomcat服务并让其下次开机启动/etc/init.d/guacd&start
/etc/init.d/tomcat&start
chkconfig&guacd&on
chkconfig&tomcat&on打开浏览器访问进行测试,访问地址为xxx.xxx.xxx.xxx:8080/guacamole在填写设置用户名和密码(user-mapping.xml中authorize定义)后进入界面注释:图1中点击“Wechat:atiger77”后会要求输入Login姓名,在输入root后自动进入系统,这里的设置都在user-mapping.xml配置文件中。DockerServer:安装docker#yum&install&docker-io&-y注释:如果使用centos7安装docker执行"yum install docker -y"即可。修改配置文件使容器间相互不进行通信other_args="--icc=flase"
DOCKER_CERT_PATH=/etc/docker重启docker服务并让其下次启动#/etc/init.d/docker&restart&&&&chkconfig&docker&on制作docker镜像我将写的Dockerfile与大家分享注释:Dockerfile的RUN次数越多,生成的Image文件就会越大,这是因为docker镜像是一层叠一层的每一个step都是一层镜像,它的好处是当下一个镜像步骤和已有镜像相同时不会去重新执行而是直接调用省去了很多时间。这里在dockerfile中安装了一个xfce轻量级的图形化桌面,在做测试时对GNOME,KDE,XFCE都进行了性能比较,最后还是XFCE所占用资源更小。dockerfile只提供给大家一种思路,根据自己的需求对其进行添加服务~在dockerfile文件夹中执行以下命令#docker&build&-t="zzjl/guacavnc"&.注释:我给的标签是zzjl/guacavnc,这里给大家一个小贴士在写标签的时候注意需要多于4个字母,标签取的要有规律方便管理。docker会根据dockerfile中所写的内容逐行读取,这里可以泡一杯咖啡当中过程不需要人工干预,只需静静的看下如果网络出现不稳定的情况会yum会提示超时导致很多包不会安装直接跳过导致最后无法连接到容器。完成后执行docker images查看镜像注释:zzjl/guacavnc就是由dockerfile生产的镜像。生成一台容器然后查看状态[root@Docker&dockervnc]#&docker&ps
CONTAINER&ID&&&&&&&&IMAGE&&&&&&&&&&&&&&&&&&COMMAND&&&&&&&&&&&&&CREATED&&&&&&&&&&&&&&STATUS&&&&&&&&&&&&&&PORTS&&&&&&&&&&&&&&&&&&&&&&NAMES
9a1daeb1ff35&&&&&&&&zzjl/guacavnc:latest&&&"/run.sh"&&&&&&&&&&&About&a&minute&ago&&&Up&About&a&minute&&&0.0.0.0:4/tcp&&&angry_hodgkin注释:这里我生成的时候限定了容器的最大使用内存和cpu上限,使用ps参数可以查看到该容器的情况,这里可以看到容器的端口情况,我们记录端口号添加到guacamoleserver服务器的user-mapping.xml配置文件中。修改guacamoleServer的user-mapping.xml配置文件重启guacamoleserver上的tomcat和guacd服务/etc/init.d/guacd&restart
/etc/init.d/tomcat&restart再次访问http://xxx.xxx.xxx.xxx:8080/guacamole,点击docker01注释:点击后就能成功连接到xfce的桌面了。7.批量测试当初搭建完成后写了测试脚本,在guacamoleserver上安装salt-master,dockerserver上安装salt-minion,通过在guacamoleserver上远程执行命令,让dockerserver自动生产指定容器随后将docker ps中的信息抓取放入配置文件,最后重启guacd和tomcat的过程,实现自动化的一个操作,这里将代码献上:atiger77.sh#!/bin/bash
#######################
#Author:zhujialin
#Version:V1.0
#Wechat:atiger77
#######################
USERUID=$(echo&$UID)
if&[&$USERUID&!=&0&];then&&&&&&&&
echo&"Please&use&root&run&this&script!"&&&&&&
else&&&&&&
read&-p&"Please&input&a&Number&for&simulation&environment:&"&a
for&i&in&`seq&$a`
&&&salt&-E&'.*'&cmd.run&'docker&run&-d&-p&15900&build/vnc'&&&&&/dev/null
&&&salt&-E&'.*'&cmd.run&"docker&ps&&&&/tmp/dockerps.txt"&&&&/dev/null
&&&sed&&-i&'s/&\/configs&//'&/etc/guacamole/noauth-config.xml
&&&echo&'&&&&config&name="Demon1111"&protocol="vnc"&'&&&&&/etc/guacamole/noauth-config.xml
&&&sed&-i&'s/Demon1111/zjl'"$i"'/'&/etc/guacamole/noauth-config.xml
&&&echo&'&&&&&&&param&name="hostname"&value="192.168.35.164"/&'&&&&&/etc/guacamole/noauth-config.xml
&&&echo&'&&&&&&&param&name="port"&value="1100"/&'&&&&/etc/guacamole/noauth-config.xml
&&&salt&-E&'.*'&cmd.run&'sh&/root/zjl.sh&'&&&/root/port.txt
&&&c=`sed&-n&2p&/root/port.txt&|&sed&'s/^[&\t]*//g'`
&&&sed&-i&'s/1100/'"$c"'/'&/etc/guacamole/noauth-config.xml
&&&echo&'&&&&/config&'&&&&&/etc/guacamole/noauth-config.xml
&&&echo&'&/configs&'&&&&&/etc/guacamole/noauth-config.xml
&&&salt&-E&'.*'&cmd.run&'rm&-rf&/tmp/dockerps.txt'&&&&/dev/null
&&&rm&-rf&/root/port.txt
service&tomcat&restart&&&&/dev/null
echo&"Completed!&Shell&will&exit&in&3S."
exit&0cat zjl.shsed&-n&2p&/tmp/dockerps.txt&|&awk&'{print&$12}'|&awk&-F:&'{print&$2}'|awk&-F-&'{print&$1}'8.拓展说明& & 我们想的远一点这个架构可以进行二次开发,变成一个私有云形式根据用户的需求安装不同的组件打包成镜像分发给用户,用户只要一个浏览器就可以开始玩了。本来就想简单介绍下,一些发现写了很多,测试中有问题请与我联系~本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 docker 进入一个容器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信