共计 3850 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章给大家分享的是有关 Docker 中使用 0.9.1 版 Docker 会遇到什么问题的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
我测试时,使用 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 会遇到什么问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!