Docker中使用0.9.1版Docker会遇到什么问题

这篇文章给大家分享的是有关Docker中使用0.9.1版Docker会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

成都创新互联长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为甘州企业提供专业的成都网站设计、网站制作、外贸营销网站建设甘州网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

我测试时,使用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有没有被创建好:

Docker中使用0.9.1版Docker会遇到什么问题

之前这篇的问题终于被解决了

测试--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文件:

Docker中使用0.9.1版Docker会遇到什么问题

我再查看下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容器:

Docker中使用0.9.1版Docker会遇到什么问题

ping是ping得通。

正是因为不合理,我才强烈建议你这样写:

docker run -d -p 2000:5000 --name web --link base:base training/webapp python app.py

使链接的名(":"后的base)和父容器名(":"前的base)相同!

连接上web容器,可以看到hosts中的信息,这样的话,ping父容器名也更合理:

Docker中使用0.9.1版Docker会遇到什么问题

注意:

在base容器中不包含子容器的信息:

Docker中使用0.9.1版Docker会遇到什么问题

在设计应用的时候,尤其要注意这一点(不可能使web服务为父容器,数据库为子容器吧?)

感谢各位的阅读!关于“Docker中使用0.9.1版Docker会遇到什么问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


分享文章:Docker中使用0.9.1版Docker会遇到什么问题
本文地址:http://ybzwz.com/article/gejeoj.html