@(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\""
局域网内容器互联
一. 同主机容器之间互联
默认容器之间是可以互通的,容器可以访问外部网络,外部网络不能访问容器。
简单的实现
- -p /-P 在启动容器时指定-p参数,映射容器内的端口供其他容器调用和访问。
# docker run -d -p 8000:80 --name docer_nginx docker.io/nginx
- --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工具
- 连接容器到本地网络
- 支持macvlan设备方式把容器接入到本地网络。
- 支持DHCP让容器自动获取IP
- 支持open vswitch的简单配置
- 支持容器网卡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个从库