您好,登录后才能下订单哦!
这篇文章给大家分享的是有关Docker中使用0.9.1版Docker会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
我测试时,使用0.9.1版Docker的问题:
1.Dockerfile创建的image即使添加了-t也无法为新镜像添加tag和名称。
2.使用--link参数但却在子容器中的/etc/hosts找不到父容器的信息,导致无法直接ping主机名。
问题解决的关键:
安装最新版docker(看来前面的版本bug多多啊)
安装步骤(ubuntu)(参考自官网手册):
1.安装解析https的辅助工具:
apt-get install apt-transport-https
我强烈建议你安装完后重启机器,不然apt可能会无法解析https的网址!
2.添加key和源:
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 sh -c "echo deb https://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list" sudo apt-get update
3.安装lxc-docker:
apt-get install lxc-docker
4.检查docker版本:
docker version
显示版本号如下(1.2.0):
root@docker:~# docker version Client version: 1.2.0 Client API version: 1.14 Go version (client): go1.3.1 Git commit (client): fa7b24f OS/Arch (client): linux/amd64 Server version: 1.2.0 Server API version: 1.14 Go version (server): go1.3.1 Git commit (server): fa7b24f
测试Dockerfile:
我pull了一个最小化的ubuntu image:
docker pull dbehnke/ubuntu1404
在本地目录创建了一个名为Dockerfile的文件,:
vi Dockerfile #添加以下内容 #my test image FROM dbehnke/ubuntu1404:latest #从现有的image创建一个新的image MAINTAINER Hochikong #维护者信息 RUN mkdir -p /home/backup RUN mv /etc/apt/sources.list /home/backup RUN wget http://172.16.77.157/sources.list -P /etc/apt #从宿主机(172.16.77.157)的apache2服务器下载本地化的sources.list文件,因为国外源太慢 RUN apt-get update
执行build:
docker build -t="hochikong/local:v1" . #不要忘了后面的那一点,指代本地的Dockerfile文件;另外hochikong必须小写,之前我输入的是大写提示"only [a-z0-9_] are allowed, size between 4 and 30"
看看我的image有没有被创建好:
之前这篇的问题终于被解决了
测试--link参数的使用:
先启动一个名为base的容器(父容器):
docker run -d -p 1000:5000 --name base training/webapp python app.py
查看状态:
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 928ebabc26eb training/webapp:latest "python app.py" 32 seconds ago Up 31 seconds 0.0.0.0:1000->5000/tcp base
可以看到容器已经启动,主机的1000端口被绑定到容器的5000端口,容器名为base
再启动一个名为web的子容器:
docker run -d -p 2000:5000 --name web --link base:base training/webapp python app.py
再次检查状态:
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21f82b33c27a training/webapp:latest "python app.py" 30 seconds ago Up 29 seconds 0.0.0.0:2000->5000/tcp web 928ebabc26eb training/webapp:latest "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:1000->5000/tcp base,web/base
可以看到,web容器已经启动。同时base容器的NAMES一栏多了web/base这个内容,实际上,"web/base"中,web指的是连接到base的子容器,但是"/"后面的是这个链接的别名(推荐和父容器的容器名相同,接下来你会知道为什么)
我再启动一个名为web2的子容器,同样连接到base上:
docker run -d -p 3000:5000 --name web2 --link base:connection2 training/webapp python app.py
看看docker ps的结果:
root@docker:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d180046639f4 training/webapp:latest "python app.py" 57 seconds ago Up 56 seconds 0.0.0.0:3000->5000/tcp web2 21f82b33c27a training/webapp:latest "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:2000->5000/tcp web 928ebabc26eb training/webapp:latest "python app.py" 8 minutes ago Up 8 minutes 0.0.0.0:1000->5000/tcp base,web/base,web2/connection2
在base的NAMES栏多了"web2/connection2"(对此你可以参考https://docs.docker.com/userguide/dockerlinks/,看看"--link name:alias"的含义)
我们通过nsenter连接一下web2,先获取PID号:
root@docker:~# docker inspect web2 | grep Pid #docker inspect CONTAINERNAME能以JSON格式输出指定容器的详细信息,我直接用grep过滤出来 "Pid": 21275,
连接web2:
nsenter --target 21275 --mount --uts --net --ipc --pid #使用那个PID值
查看该容器的/etc/hosts文件:
我再查看下base的IP地址:
root@docker:~# docker inspect base | grep IP "IPAddress": "172.17.0.11", "IPPrefixLen": 16,
你是不是觉得很残念!实际上,172.17.0.11正是base的IP地址,但是在web2中,显示的却是该链接的名称,你ping主机connection2实际上是ping容器base。但是我认为这很不合理!为什么hosts文件写的不是父容器的容器名而是链接的名称?
ping下base容器:
ping是ping得通。
正是因为不合理,我才强烈建议你这样写:
docker run -d -p 2000:5000 --name web --link base:base training/webapp python app.py
使链接的名(":"后的base)和父容器名(":"前的base)相同!
连接上web容器,可以看到hosts中的信息,这样的话,ping父容器名也更合理:
注意:
在base容器中不包含子容器的信息:
在设计应用的时候,尤其要注意这一点(不可能使web服务为父容器,数据库为子容器吧?)
感谢各位的阅读!关于“Docker中使用0.9.1版Docker会遇到什么问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。