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

64次阅读
没有评论

共计 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 有没有被创建好:

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 会遇到什么问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计3850字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)