# Docker 实例分享

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

分析内容

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

Dockerfile

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

参数 格式 解释
FROM FROM image:tag 指定基础镜
MAINTAINER MAINTAINER [email protected] 制作镜像的作者
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

404 Not Found

Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

[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个从库

你可能感兴趣的:(# Docker 实例分享)