有多种方法:
1、把端口用 --publish forward 进容器里,或者说把端口发布出来。如 docker run -p 80:80 nginx。
2、把某个虚拟或物理 interface bridge 进容器里,可以用一个叫 pipework 的工具:
3、直接不对容器网络做虚拟化/隔离,用 --net=host。
准备工作
在使用 weave 之前,你需要在所有宿主机上安装 Docker 环境,参考这些教程,在 Ubuntu 或 CentOS/Fedora 发行版中安装 Docker。
Docker 环境部署完成后,使用下面的命令安装 weave:
$ wget https://github.com/zettio/weave/releases/download/latest_release/weave。
$ chmod a+x weave。
$ sudo cp weave /usr/local/bin。
注意你的 PATH 环境变量要包含 /usr/local/bin 这个路径,请在 /etc/profile 文件中加入一行(LCTT 译注:要使环境变量生效,你需要执行这个命令: source /etc/profile):
export PATH="$PATH:/usr/local/bin"。
在每台宿主机上重复上面的操作。
Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系统开启了防火墙,请确保这两个端口不会被防火墙挡住。
在每台宿主机上启动 Weave 路由器。
当你想要让处于在不同宿主机上的容器能够互相通信,第一步要做的就是在每台宿主机上启动 weave 路由器。
第一台宿主机,运行下面的命令,就会创建并开启一个 weave 路由器容器(LCTT 译注:前面说过了,weave 路由器也是一个容器):
$ sudo weave launch。
第一次运行这个命令的时候,它会下载一个 weave 镜像,这会花一些时间。下载完成后就会自动运行这个镜像。成功启动后,终端会输出这个 weave 路由器的 ID 号。
下面的命令用于查看路由器状态:
$ sudo weave status。
第一个 weave 路由器就绪了,目前为止整个 peer 对等网络中只有一个 peer 成员。
你也可以使用 docker 的命令来查看 weave 路由器的状态:
$ docker ps
第二台宿主机部署步骤稍微有点不同,我们需要为这台宿主机的 weave 路由器指定第一台宿主机的 IP 地址,命令如下:
$ sudo weave launch <first-host-IP-address>。
当你查看路由器状态,你会看到两个 peer 成员:当前宿主机和第一个宿主机。
当你开启更多路由器,这个 peer 成员列表会更长。当你新开一个路由器时,要指定前一个宿主机的 IP 地址,请注意不是第一个宿主机的 IP 地址(LCTT 译注:链状结构)。
现在你已经有了一个 weave 网络了,它由位于不同宿主机的 weave 路由器组成。
把不同宿主机上的容器互联起来
接下来要做的就是在不同宿主机上开启 Docker 容器,并使用虚拟网络将它们互联起来。
假设我们创建一个私有网络 10.0.0.0/24 来互联 Docker 容器,并为这些容器随机分配 IP 地址。
如果你想新建一个能加入 weave 网络的容器,你就需要使用 weave 命令来创建,而不是 docker 命令。原因是 weave 命令内部会调用 docker 命令来新建容器然后为它设置网络。
下面的命令是在宿主机 hostA 上建立一个 Ubuntu 容器,然后将它放到 10.0.0.0/24 网络中,分配的 IP 地址为 10.0.0.1:
hostA:~$ sudo weave run 10.0.0.1/24-t -i ubuntu。
成功运行后,终端会显示出容器的 ID 号。你可以使用这个 ID 来访问这个容器:
hostA:~$ docker attach <container-id>。
在宿主机 hostB 上,也创建一个 Ubuntu 容器,IP 地址为 10.0.0.2:
hostB:~$ sudo weave run 10.0.0.2/24-t -i ubuntu。
访问下这个容器的控制台:
hostB:~$ docker attach <container-id>。
这两个容器能够互相 ping 通,你可以通过容器的控制台检查一下。
如果你检查一下每个容器的网络配置,你会发现有一块名为“ethwe”的网卡,你分配给容器的 IP 地址出现在它们那里(比如这里分别是 10.0.0.1 和 10.0.0.2)。
Weave 的其他高级用法
weave 提供了一些非常巧妙的特性,我在这里作下简单的介绍。
应用分离
使用 weave,你可以创建多个虚拟网络,并为每个网络设置不同的应用。比如你可以为一群容器创建 10.0.0.0/24 网络,为另一群容器创建 10.10.0.0/24 网络,weave 会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:
首先开启一个容器,运行在 10.0.0.0/24 网络上:
$ sudo weave run 10.0.0.2/24-t -i ubuntu。
然后让它脱离这个网络:
$ sudo weave detach 10.0.0.2/24<container-id>。
最后将它加入到 10.10.0.0/24 网络中:
$ sudo weave attach 10.10.0.2/24<container-id>。
现在这个容器可以与 10.10.0.0/24 网络上的其它容器进行通信了。这在当你创建一个容器而网络信息还不确定时就很有帮助了。
将 weave 网络与宿主机网络整合起来。
有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave 允许虚拟网络与宿主机网络整合。
举个例子,在宿主机 hostA 上一个容器运行在 10.0.0.0/24 中,运行使用下面的命令:
hostA:~$ sudo weave expose 10.0.0.100/24。
这个命令把 IP 地址 10.0.0.100 分配给宿主机 hostA,这样一来宿主机 hostA 也连到了 10.0.0.0/24 网络上了。显然,你在为宿主机选择 IP 地址的时候,需要选一个没有被其他容器使用的地址。
现在 hostA 就可以访问 10.0.0.0/24 上的所有容器了,不管这些容器是否位于 hostA 上。
1,首先建议你先杀毒。
2,看了你的问题,开机就出现runtime。
error!program:c:\program。
files\risini\rfw\rfwsrv.exe。不知道你的系统运行的是xp还是2003?如果是这两个的其中的任何一个的话,我想你肯定升级了xp的sp2,或者2003的sp1了吧?
3,如果确实你进行了xp的sp2,或者2003的sp1的升级。那么请你尽快升级瑞星防火墙。因为瑞星防火墙的17.32以下版本与上述补丁不兼容,就会导致出现你的错误。
4,如果你并没有升级sp2或者2003的sp1,那么你的瑞星已经遭到破坏,建议先卸载瑞星,然后再重新安装。并升级到最新版本。
5,关于在新窗口中打开的问题,你可以这样设置:
“我的电脑”-“工具”-“文件夹选项”-“常规”
然后在“浏览文件夹”中选择“在同一窗口打开所有文件夹”。
步骤1:为我们的容器创建第一个镜像#以centos镜像作为基础镜像,我们启动自己的容器并在其中执行/bin/bash命令#注:-t-i参数用于创建一个虚拟的命令行。sudodockerrun-t-icentos/bin/bash现在我们已经成功的运行了自己的第一个容器,并且进入到容器的命令行界面中。在容器中,我们执行下面的命令:yum-yupdate#更新软件包yuminstallwhich#安装which命令yuminstallgit#安装Git安装完成后,按Ctrl+d来退出容器的命令行。#执行sudodockerps-a,可以看到被我们终止的容器CONTAINERIDIMAGECOMMANDCREATED……da9031d3568fcentos:6.4/bin/bash5minutesago…..把我们所做的改变提交到一个新的容器:#这里我们创建一个自己的基础容器,容器中安装好了文章中所需的常用工具。读者的容器id可能与文章中的有所不同,以上一步dockerps-a的结果为准。sudodockercommitda90custom/base容器成功提交后,执行sudodockerimages,我们会看到刚才提交的容器(如下面的结果所示)。我们就以这个容器为基础容器,再来创建一个新的容器。REPOSITORYTAGIMAGEIDCREATEDcustom/baselatest05b6cecd370b2minutesagocentos6.4539c0211cd7610monthsagocentoslatest539c0211cd7610monthsago…步骤2:创建新的容器,并安装apache#以custom/base容器为基础,运行一个新的容器。sudodockerrun-t-icustom/base/bin/bash#安装httpdyuminstallhttpd步骤3:再次提交新的容器按Ctrl+d来退出容器的命令行,然后执行命令:#这个命令会把步骤2中我们安装httpd带来的改变提交到新的名为custom/httpd的容器镜像中。你的容器id可能会和文章中有所不同,以sudodockerps-a命令的结果为准。sudodockercommitaa6e2fc0b94ccustom/httpd你应该已经发现了,我们创建了一个带有http服务器并可以复用的容器镜像。你可以根据这种思想,为自己所需的每个组件都创建一个容器,然后把这些容器复用于开发环境或者生产环境。步骤7:运行http服务器#-vwillMountavolumefromVMtothecontainerwhichwasalsosharedfromhosttoVagrantVM.#-v参数把主机共享给虚拟机的一个卷挂载到容器中#-pforwardVMport80tocontainerport80;VMport80ismappedtohostport8080inVagrantfile#-p参数把虚拟机的80端口映射到容器的80端口;虚拟机的80端口在Vagrantfile中被绑定到主机的8080端口,也就是:主机8080->虚拟机80->容器80sudodockerrun-t-i-p80:80-v/vagrant/htdocs:/var/www/htmlcustom/httpd/bin/bash#启动Apacheapachectl-kstart。
ubuntu下安装Docker。
Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法。更多的玩法还有大规模 web 应用、数据库部署、持续部署、集群、测试环境、面向服务的云计算、虚拟桌面 VDI 等等。
注意:由于Docker需要在Linux Kernel 3.8及以上才可以很好的工作【本人在ubuntu12.04 lts 内核3.2也正常安装】,官方更是推荐Ubuntu系统,这里有两种选择:Ubuntu 12.04 LTS或最新的Ubuntu 13.10 而本文比较喜欢倾向LTS,幸好有办法解决Kernel版本问题。
1、更新Ubuntu内核
使用如下命令行更新内核至3.8.0-25。
sudo apt-get install linux-image-3.8.0-25-generic。
sudo apt-get install linux-headers-3.8.0-25-generic。
完成后重启电脑,通过命令 “uname -r” 来查看内核是否成功更新。
2、安装lxc-docker
root@ubuntu: sudo apt-get install software-properties-common #增加 add-apt-repository 命令。
root@ubuntu: sudo apt-get install python-software-properties 。
root@ubuntu: sudo add-apt-repository ppa:dotcloud/lxc-docker #增加一个ppa源,如:ppa:user/ppa-name。
root@ubuntu: sudo apt-get update #更新系统。
root@ubuntu: sudo apt-get install lxc-docker。
3、测试doctor是否安装成功。
root@ubuntu:~# docker #出现如下信息表示docker安装成功。
Usage: docker [OPTIONS] COMMAND [arg...]。
-H=[tcp://127.0.0.1:4243]: tcp://host:port to bind/connect to or unix://path/to/socket touse。
A self-sufficient runtime for linux containers.。
...
4、Hello World
4.1、下载官方ubuntu image。
linjiqin@ubuntu:~$ sudo docker pull ubuntu #pull命令需要到国外的镜像仓库,拉取镜像,因为GFW的关系,拉取失败的可能性很大。
4.2、运行hello world。
linjiqin@ubuntu:~$ sudo docker run ubuntu /bin/echo hello world。
5、docker常用命令
5.1、docker三种命令运行模式。
docker有三种命令运行的方式:短暂方式、交互方式、daemon方式。
a、短暂方式:就是刚刚的那个”hello world”,命令执行完后,container就终止了,不过并没有消失,可以用 sudo docker ps -a 看一下所有的container,第一个就是刚刚执行过的container,可以再次执行一遍:
linjiqin@ubuntu:~$ sudo docker start container_id。
不过这次看不到”hello world”了,只能看到ID,用logs命令才能看得到:
linjiqin@ubuntu:~$ sudo docker logs container_id。
可以看到两个”hello world”,因为这个container运行了两次。
b、交互方式
linjiqin@ubuntu:~$ sudo docker run -i -t image_name /bin/bash #image_name为docker镜像名称。
c、daemon方式
即让软件作为长时间服务运行,这就是SAAS啊!
例如,一个无限循环打印的脚本(替换为memcached、apache等,操作方法仍然不变!):
linjiqin@ubuntu:~$ CONTAINER_ID=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done")。
在container外面查看它的输出。
linjiqin@ubuntu:~$ sudo docker logs $CONTAINER_ID。
或者连接上容器实时查看
linjiqin@ubuntu:~$ sudo docker attach $CONTAINER_ID。
终止容器
linjiqin@ubuntu:~$ sudo docker stop $CONTAINER_ID。
linjiqin@ubuntu:~$ sudo docker ps #看一下,已经没了。
5.2、docker ps命令。
linjiqin@ubuntu:~$ sudo docker ps #列出当前所有正在运行的container。
linjiqin@ubuntu:~$ sudo docker ps -l #列出最近一次启动的,且正在运行的container。
linjiqin@ubuntu:~$ sudo docker ps -a #列出所有的container。
注意:
a、其他用法请参考 sudo docker ps -h。
b、还有一种方式可以让程序在daemon模式下运行,就是在Dockerfile里设置USER为daemon。
5.3、docker export命令。
linjiqin@ubuntu:~$ container_id=`docker run -d <image_name> ls`。
linjiqin@ubuntu:~$ docker export $container_id > image.tgz。
5.4、docker import命令 。
linjiqin@ubuntu:~$ cat image.tgz | sudo docker import - simple_dev #simple_dev为自定义的镜像名称。
5.5、docker port命令。
linjiqin@ubuntu:~$ docker run -p 80:8080 <image> <cmd> #映射容器的8080端口到宿主机的80端口。
5.6、删除容器
5.6.1、删除所有容器
linjiqin@ubuntu:~$ sudo docker rm `sudo docker ps -a -q`。
5.6.1、删除具体某个容器
linjiqin@ubuntu:~$ sudo docker rm $CONTAINER_ID。
5.7、docker命令快速参考。
linjiqin@ubuntu:~$ sudo docker images #查看本地镜像。
linjiqin@ubuntu:~$ sudo docker attach $CONTAINER_ID #启动一个已存在的docker实例。
linjiqin@ubuntu:~$ sudo docker stop $CONTAINER_ID #停止docker实例。
linjiqin@ubuntu:~$ sudo docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行。
linjiqin@ubuntu:~$ sudo docker inspect $CONTAINER_ID #查看container的实例属性,比如ip等等。
sudo docker run -t -i -v /home/linjiqin/dev/docker:/home/mycontainer:rw -p 8000:8000 mydocker /bin/bash。
写在前面,运行我们的镜像的命令使用上面的为参考,这样会挂载本地文件夹,并且会映射container的8000端口到宿主机的8000端口。
/home/linjiqin/dev/docker为要挂载的本地文件夹,需提前创建。
/home/mycontainer为docker映射路径,执行上面命令会帮我们创建。
可能是本机80端口已经被占用导致,可以使用-P来随机分配一个端口起来后是否可以访问。
docker run -itd -P nginx。