# Docker 实例分享

@(Docker分享)[Dockerfile|私有仓库|容器互联|跨网络互联]

分析内容

  • Dockerfile参数
  • 私有仓库
  • 局域网内Docker容器互联
  • 跨网络的容器互联
  • 做一个简单的实验

Dockerfile

一般Dockerfile 分为四个部分:
基础镜像信息、维护者信息、镜像操作指令、容器启动时执行的指令。

参数 格式 解释
FROM FROM image:tag 指定基础镜
MAINTAINER MAINTAINER liuzhiqing@yodo1.com 制作镜像的作者
COPY COPY src dest 拷贝本地文件到容器(上下文的相对路径或者绝对路径)
ADD ADD src dest 拷贝本地文件到容器(还支持url/压缩归档文件)
WORKDIR WORKDIR /path/to/workdir 使用多个WORKDIR,为后续命令指定相对目录
ENV ENV key value 指定环境变量,在后续RUN指定里可以使用,在容器运行时可以保持
VOLUME VOLUME ["/data"] 创建一个本地和容器的挂载点
EXPOSE EXPOSE port 容器端口映射到本机端口上
USER USER daemon 指定运行容器是的用户名和UID
RUN RUN command Shell 格式 命令通过/bin/sh -c 去运行
RUN RUN ["exec","param1","param2"] exec 格式,不调用shell程序,及容器中没有shell程序。参数会当成json数组被Docker解析
CMD CMD command /支持exec格式 运行容器的默认值,如果启动时指定了参数,则被覆盖。
ENTRYPOINT ENTRYPOINT command/支持exec格式 运行容器执行命令,但和CMD区别是忽略docker run指定的参数。

私有仓库

方式一: 下载官方做好的私有仓库的镜像,然后运行起来。

[root@localhost ~]# docker pull dl.dockerpool.com:5000/registry

[root@localhost ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry dl.dockerpool.com:5000/registry

[root@localhost ~]# curl http://192.168.1.194:5000/v1/search
{"num_results": 1, "query": "", "results": [{"description": null, "name": "library/unbuntu_v1.0"}]}

[root@localhost ~]# docker pull 192.168.1.194:5000/unbuntu_v1.0

[root@localhost ~]# docker images |grep unbuntu_v1.0
192.168.1.194:5000/unbuntu_v1.0   latest              e9c238b94cff        3 weeks ago         418.9 MB

[root@localhost ~]# docker tag liuzhiqing/nginx:v5  192.168.1.194:5000/nginx

[root@localhost ~]# docker pull 192.168.1.194:5000/nginx

[root@localhost ~]# docker push 192.168.1.194:5000/nginx

[root@localhost ~]# curl http://192.168.1.194:5000/v1/search
{"num_results": 2, "query": "", "results": [{"description": null, "name": "library/unbuntu_v1.0"}, {"description": "", "name": "library/nginx"}]}

方式二:本地服务器安装

安装
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install -y python-devel libevent-devel python-pip gcc xz-devel
[root@localhost ~]# yum -y install docker-registry

修改IP及监听端口(如果想设置端口为6000,那么/etc/sysconfig/docker里 也要修改成6000)
[root@localhost ~]# vim /etc/sysconfig/docker-registry
[root@localhost ~]# vim /etc/docker-registry.yml  (修改的目的是可以通过curl 查询仓库镜像?!!)
    search_backend: _env:sqlalchemy
    sqlalchemy_index_database: _env:sqlite:////tmp/docker-registry.db

启动服务
[root@localhost ~]#systemctl  start docker-registry.service
[root@localhost ~]#netstat  -ntpl 检查6000端口是否存在

上传:
[root@localhost ~]#docker tag e9c238b94cff 192.168.1.194:6000/nginx 

[root@localhost ~]# docker push 192.168.1.194:6000/nginx

下载:
[root@localhost ~]# docker pull 192.168.1.194:6000/nginx

查询: (无法通过curl 查看??!!)
[root@localhost ~]# curl http://192.168.1.194:6000/v1/search
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>
[root@localhost ~]#
[root@localhost ~]# curl http://192.168.1.194:6000/
"\"docker-registry server\""

局域网内容器互联

一. 同主机容器之间互联

默认容器之间是可以互通的,容器可以访问外部网络,外部网络不能访问容器。

简单的实现

  1. -p /-P 在启动容器时指定-p参数,映射容器内的端口供其他容器调用和访问。
# docker run -d -p 8000:80  --name docer_nginx docker.io/nginx
  1. --link 在启动容器时指定--link参数,Docker会在两个容器内创建独立的隧道,用于两个容器通信。
#docker run -d liuzhiqing/mysql-server:v1   
#docker run -it --link 828c819757a6:db liuzhiqing/mysql-client:v2 /bin/bash

自定义网桥
思路:通过操作Linux netwwork namespace 去隔离网络,自建Linux虚拟网桥,把需要相互通信的容器网卡,加入到网桥中。最终实现互通,ip netns 工具实现。

实验过程:......

二. 不同主机容器之间互联
桥接的方式
思路:找一个单独的网卡,两个不同主机的网卡连接到一个二层交换机上,新建容器的网卡都桥接到新的网桥上。

配图:

实验过程:.....

直连路由
思路:新建网桥,容器网卡连接到网桥上,通过iptables MASQUERADE伪装 /ip forword做NAT进行跨主机容器通信。

配图:

试验过程: ....

三. pipework工具

  1. 连接容器到本地网络
  2. 支持macvlan设备方式把容器接入到本地网络。
  3. 支持DHCP让容器自动获取IP
  4. 支持open vswitch的简单配置
  5. 支持容器网卡mac地址及配置VLAN (open vswitch的功能)

实验过程:...

其他
1.单台主机上的容器vlan划分
2.多台主机容器的vlan划分(交换机开trunk通道)

跨网络的容器互联

OVS隧道模式

overlay技术:
一种隧道技术,一种网络包装到另一种协议中去传输的技术,实现方法GRE隧道。

通过GRE实现Docker容器的跨网络通信

图:...

多租户GRE隔离
openstack里一个分支开源项目Neutron也是使用Open vswitch来实现的,但不同在于neutor的GRE模式有一种专门做GRE隧道的br-tun,该网桥中使用流表来转发数据包(openflow)

在br-int中 虚拟机使用VLAN-ID来区分不同的租户,通往外界的流量则使用GRE key来区分,GRE key有24位比特位,可以很好的解决vlan数量不够的问题。

做一个简单的实验

haproxy 分发给 app , app连接redis-master, redis-master连接2个从库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,579评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,826评论 0 7
  • 转自:http://ju.outofmemory.cn/entry/255894 概述自从docker容器出现以来...
    dleyanlin阅读 1,522评论 0 7
  • 概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信...
    糙老爷们儿吃什么樱桃阅读 3,667评论 1 5
  • “打蛇打七寸,擒贼先擒王”,一般客户关注的中心,就是他们内心最看重的东西。抓住客户最关注的中心,然后做重点突破,会...
    奋斗的番茄阅读 446评论 0 0