去法国 流量卡旅游一个月手机流量怎么弄

docker(38)
转载:http://dockone.io/article/455
【编者的话】构建多容器应用程序,需要定义网络参数来设置容器间的通信,可以通过EXPOSE或者-expose暴露端口、使用-p发布特定端口,还可以用-link等等来实现,这些方法可能会得到一样的效果,但是这些方法之间是否有不同,应该选择什么样的方法,将是本文讨论的重点内容。
如果你已经构建了一些多容器的应用程序,那么肯定需要定义一些网络规则来设置容器间的通信。有多种方式可以实现:可以通过--expose参数在运行时暴露端口,或者在Dockerfile里使用EXPOSE指令。还可以在Docker
run的时候通过-p或者-P参数来发布端口。或者通过--link链接容器。虽然这些方式几乎都能达到一样的结果,但是它们还是有细微区别。那么到底应该使用哪一种呢?
使用-p或者-P来创建特定端口绑定规则最为可靠,EXPOSE可以看做是容器文档化的方式,谨慎使用--link的方式。
在比较这些不同方式之前,我们先分别了解细节。
通过EXPOSE或者-expose暴露端口
有两种方式可以用来暴露端口:要么用EXPOSE指令在Dockerfile里定义,要么在docker
run时指定--expose=1234。这两种方式作用相同,但是,--expose可以接受端口范围作为参数,比如&--expose=。但是,EXPOSE和--expose都不依赖于宿主机器。默认状态下,这些规则并不会使这些端口可以通过宿主机来访问。
基于EXPOSE指令的上述限制,Dockerfile的作者一般在包含EXPOSE规则时都只将其作为哪个端口提供哪个服务的提示。使用时,还要依赖于容器的操作人员进一步指定网络规则。和-P参数联合使用的情况,下文会进一步阐述。不过通过EXPOSE命令文档化端口的方式十分有用。
本质上说,EXPOSE或者--expose只是为其他命令提供所需信息的元数据,或者只是告诉容器操作人员有哪些已知选择。
实际上,在运行时暴露端口和通过Dockerfile的指令暴露端口,这两者没什么区别。在这两种方式启动的容器里,通过docker
inspect $container_id | $container_name查看到的网络配置是一样的:
&NetworkSettings&:&{
&PortMapping&:&null,
&Ports&:&{
&&&&&1234/tcp&:&null
&Config&:&{
&ExposedPorts&:&{
&&&&&1234/tcp&:&{}
可以看到端口被标示成已暴露,但是没有定义任何映射。注意这一点,因为我们查看的是发布端口。
ProTip:使用运行时标志--expose是附加的,因此会在Dockerfile的EXPOSE指令定义的端口之外暴露添加的端口。
使用-p发布特定端口
可以使用-p参数显式将一个或者一组端口从容器里绑定到宿主机上,而不仅仅是提供一个端口。注意这里是小写的p,不是大写。因为该配置依赖于宿主机器,所以Dockerfile里没有对应的指令,这是运行时才可用的配置。-p参数有几种不同的格式:
ip:hostPort:containerPort|&ip::containerPort&\
|&hostPort:containerPort&|&containerPort
实际中,可以忽略ip或者hostPort,但是必须要指定需要暴露的containerPort。另外,所有这些发布的规则都默认为tcp。如果需要udp,需要在最后加以指定,比如-p
/udp。如果只是用命令docker
my-image运行一个简单的应用程序,那么容器里运行在3000端口的服务在宿主机的8080端口也就可用了。端口不需要一样,但是在多个容器都暴露端口时,必须注意避免端口冲突。
避免冲突的最佳方法是让Docker自己分配hostPort。在上述例子里,可以选择docker
run -p 3000 my_image来运行容器,而不是显式指定宿主机端口。这时,Docker会帮助选择一个宿主机端口。运行命令docker
port $container_id | $container_name可以查看Docker选出的端口号。除了端口号,该命令只能显示容器运行时端口绑定信息。还可以通过在容器上运行docker
inspect查看详细的网络信息,在定义了端口映射时,这样的信息就很有用。该信息在Config、HostConfig和NetworkSettings部分。我们查看这些信息来对比不同方式搭建的容器间的网络区别。
ProTip:可以用-p参数定义任意数量的端口映射。
-expose/EXPOSE和-p对比
为了更好得理解两者之间的区别,我们使用不同的端口设置来运行容器。
运行一个很简单的应用程序,会在curl它的时候打印'hello world'。称这个镜像为no-exposed-ports:
FROM&ubuntu:trusty
MAINTAINER&Laura&Frank&&laura.&
CMD&while&&do&echo&'hello&world'&|&nc&-l&-p&8888;&done
实验时注意使用的是Docker主机,而不是boot2docker。如果使用的是boot2docker,运行本文示例命令前先运行boot2docker
注意,我们使用-d参数运行该容器,因此容器一直在后台运行。(端口映射规则只适用于运行着的容器):
$&docker&run&-d&--name&no-exposed-ports&no-exposed-ports
e18a76da06b3afafaedfd7e561cf49
这儿没有太多的信息,只是回显了容器的ID,提示服务已经成功启动。和预期结果一样,运行docker
port no-exposed-ports和docker
inspect no-exposed-ports时没显示什么信息,因为我们既没有定义端口映射规则也没有发布任何端口。
因此,如果我们发布一个端口会发生什么呢,-p参数和EXPOSE到底有什么区别呢?
还是使用上文的no-exposed-ports镜像,在运行时添加-p参数,但是不添加任何expose规则。在config.ExposedPorts里重新查看--expose参数或者EXPOSE指令的结果。
$&docker&run&-d&--name&no-exposed-ports-with-p-flag&-p&&no-exposed-ports
c876e590cfafa734f42a7b55bceba3a11afd8f17ca
$&docker&port&no-exposed-ports-with-p-flag
8888/tcp&-&&0.0.0.0:8888
太棒了!我们可以看到可用端口。注意默认这是tcp。我们到网络设置里看看还有什么信息:
&Config&:&{
&ExposedPorts&:&{
&&&&&8888/tcp&:&{}
&HostConfig&:&{
&PortBindings&:&{
&&&&&8888/tcp&:&[
&&&&&&&&&&&&&HostIp&:&&&,
&&&&&&&&&&&&&HostPort&:&&8888&
&NetworkSettings&:&{
&Ports&:&{
&&&&&8888/tcp&:&[
&&&&&&&&&&&&&HostIp&:&&0.0.0.0&,
&&&&&&&&&&&&&HostPort&:&&8888&
注意”Config“部分的暴露端口字段。这和我们使用EXPOSE或者--expose暴露的端口是一致的。Docker会隐式暴露已经发布的端口。已暴露端口和已发布端口的区别在于已发布端口在宿主机上可用,而且我们可以在“HostConfig”和“NetworkSettings”两个部分都能看到已发布端口的信息。
所有发布(-p或者-P)的端口都暴露了,但是并不是所有暴露(EXPOSE或--expose)的端口都会发布。
使用-P和EXPOSE发布端口
因为EXPOSE通常只是作为记录机制,也就是告诉用户哪些端口会提供服务,Docker可以很容易地把Dockerfile里的EXPOSE指令转换成特定的端口绑定规则。只需要在运行时加上-P参数,Docker会自动为用户创建端口映射规则,并且帮助避免端口映射的冲突。
添加如下行到上文使用的Web应用Dockerfile里:
EXPOSE&1000
EXPOSE&2000
EXPOSE&3000
构建镜像,命名为exposed-ports。
docker&build&-t&exposed-ports&.
再次用-P参数运行,但是不传入任何特定的-p规则。可以看到Docker会将EXPOSE指令相关的每个端口映射到宿主机的端口上:
$&docker&run&-d&-P&--name&exposed-ports-in-dockerfile&exposed-ports
63264dae9db85c5d667a37dac77e0da7c8d2d699f49b69baad3a
$&docker&port&exposed-ports-in-dockerfile
1000/tcp&-&&0.0.0.0:49156
2000/tcp&-&&0.0.0.0:49157
3000/tcp&-&&0.0.0.0:49158
很方便,不是么?
--link怎么样呢?
你可能在多容器应用程序里使用过运行时参数&--link
name:alias来设定容器间关系。虽然--link非常易于使用,几乎能提供和端口映射规则和环境变量相同的功能。但是最好将--link当做服务发现的机制,而不是网络流量的门户。
--link参数唯一多做的事情是会使用源容器的主机名和容器ID来更新新建目标容器(使用--link参数创建的容器)的/etc/hosts文件。
当使用--link参数时,Docker提供了一系列标准的环境变量,如果想知道细节的话可以查看。
虽然--link对于需要隔离域的小型项目非常有用,它的功能更像服务发现的工具。如果项目中使用了编排服务,比如Kubernetes或者Fleet,很可能就会使用别的服务发现工具来管理关系。这些编排服务可能会不管理Docker的链接,而是管理服务发现工具里包含的所有服务,在Panamax项目里使用的很多远程部署适配器正是做这个的。
哪一种网络选择更为适合,这取决于谁(或者哪个容器)使用Docker运行的服务。需要注意的是一旦镜像发布到Docker Hub之后,你无法知道其他人如何使用该镜像,因此要尽可能让镜像更加灵活。如果你只是从Docker Hub里取得镜像,使用-P参数运行容器是最方便迅速的方式,来基于作者的建议创建端口映射规则。记住每一个发布的端口都是暴露端口,但是反过来是不对的。
原文链接:(翻译:崔婧雯 校对:魏小红)&
===========================
崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:125617次
积分:2162
积分:2162
排名:第15080名
原创:65篇
转载:198篇
(8)(15)(10)(8)(6)(25)(25)(11)(7)(4)(4)(3)(6)(8)(3)(3)(7)(18)(13)(22)(12)(9)(31)(6)(2)怎么关闭dockerfile里面expose的端口?
最近在研究docker,用dockerfile创建了一个image。里面用expose 22开放了一个端口。在这个image里面安装好使用的软件后,发现22这个端口是不需要开放的。google了很久,就是不知道怎么关闭。现在这个image只要运行,22端口就开放了。。。
现在怎么关闭这个22端口?
是否理解为重新进入CONTAINER &, &docker exec 容器ID
引用来自“mrduanpeng”的评论 是否理解为重新进入CONTAINER &, &docker exec 容器ID
不是,是从这个image出来的任何container,都会开放22端口。而这个端口后来发现是不必要开放的。我想关闭它。。。
--- 共有 2 条评论 ---
: 我只是想知道,这个container怎么把先前暴露的22端口关闭。。。
那你把你的container 修改内容后,提交为新的IMAGE,不知道你是否明白了AUFS文件系统
是这里面的22端口,我不想暴露了。。。。Docker 删除一个&none&镜像失败
Ubuntu version:14.04
Docker version:1.0.1 build 990021a
docker run -p
但是,我看它在一个地方卡了很久等不及了。然后就用ctrl+c强制结束了它,后来又想用,就用命令
docker pull registry
但是失败了,看它给出的反馈好像是depedent什么东西找不到。然后,我就重启了一下。
docker images看了一下,发现多出好多&none&的镜像,而且删不掉。删的时候会提示
Error response from daemon: Error while getting parent image: Id can't be empty
19:09:19 Error: failed to remove one or more images
$&docker rmi $(docker images -q --filter "dangling=true")
--- 共有 1 条评论 ---
Error response from daemon: Error while getting parent image: Id can't be empty
还是得到这个错误。所有的&none&镜像都是提示这个错误
我直接把全部的镜像都删掉了,就成功了。但是,我觉得镜像下起来不容易,所以之前不想删。
docker rmi IMAGE_ID
--- 共有 2 条评论 ---
: 哦,没仔细看,抱歉.
那你到 docker 的 graph 下删除对应的文件夹应该可以
好好看看问题好吗,这么简单我还会来问吗。常用docker命令,及一些坑
常用docker命令,及一些坑
发布时间: 16:24:46
编辑:www.fx114.net
本篇文章主要介绍了"常用docker命令,及一些坑",主要涉及到常用docker命令,及一些坑方面的内容,对于常用docker命令,及一些坑感兴趣的同学可以参考一下。
常用docker命令,及一些坑
查看容器的root用户密码
docker logs &容器名orID& 2&&1 | grep '^User: ' | tail -n1
因为docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到redmine容器的root用户的密码了。
查看容器日志
docker logs -f &容器名orID&
查看正在运行的容器
docker ps -a为查看所有的容器,包括已经停止的。
删除所有容器
docker rm $(docker ps -a -q)
删除单个容器
docker rm &容器名orID&
停止、启动、杀死一个容器
docker stop &容器名orID&
docker start &容器名orID&
docker kill &容器名orID&
查看所有镜像
docker images
删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
运行一个新容器,同时为它命名、端口映射、文件夹映射。以redmine镜像为例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
一个容器连接到另一个容器
docker run -i -t --name sonar -d -link mmysql:db
tpires/sonar-server
容器连接到mmysql容器,并将mmysql容器重命名为db。这样,sonar容器就可以使用db的相关的环境变量了。
docker pull &镜像名:tag&
docker pull sameersbn/redmine:latest
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
docker save busybox-1 & /home/save.tar
使用scp将save.tar拷到机器b上,然后:
docker load & /home/save.tar
构建自己的镜像
docker build -t &镜像名& &Dockerfile路径&
如Dockerfile在当前路径:
docker build -t xx/gitlab .
重新查看container的stdout
# 启动top命令,后台运行
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
# 获取正在running的container的输出
$ sudo docker attach $ID
top - 02:05:52 up
load average: 0.01, 0.02, 0.05
1 running,
0 sleeping,
0 stopped,
0.0%ni, 99.7%id,
373572k total,
355560k used,
18012k free,
27872k buffers
786428k total,
786428k free,
221740k cached
$ sudo docker stop $ID
后台运行(-d)、并暴露端口(-p)
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
从container中拷贝文件出来
sudo docker cp 7bb0e258aefe:/etc/debian_version .
拷贝7bb0e258aefe中的/etc/debian_version到当前目录下。
注意:只要7bb0e258aefe没有被删除,文件命名空间就还在,可以放心的把exit状态的container的文件拷贝出来
ubuntu14下的docker是没有service服务。去除每次sudo运行docker命令,需要添加组:
# Add the docker group if it doesn't already exist.
$ sudo groupadd docker
#改完后需要重新登陆用户
$ sudo gpasswd -a ${USER} docker
ubuntu14的febootstrap没有-i命令
Dockerfile中的EXPOSE、docker run --expose、docker run -p之间的区别
Dockerfile的EXPOSE相当于docker run --expose,提供container之间的端口访问。docker run -p允许container外部主机访问container的端口
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:}

我要回帖

更多关于 法国 流量卡 的文章

更多推荐

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

点击添加站长微信