@(Docker分享)[Dockerfile|私有倉庫|容器互聯(lián)|跨網(wǎng)絡(luò)互聯(lián)]
分析內(nèi)容
- Dockerfile參數(shù)
- 私有倉庫
- 局域網(wǎng)內(nèi)Docker容器互聯(lián)
- 跨網(wǎng)絡(luò)的容器互聯(lián)
- 做一個(gè)簡單的實(shí)驗(yàn)
Dockerfile
一般Dockerfile 分為四個(gè)部分:
基礎(chǔ)鏡像信息、維護(hù)者信息涩堤、鏡像操作指令、容器啟動(dòng)時(shí)執(zhí)行的指令燎猛。
參數(shù) | 格式 | 解釋 |
---|---|---|
FROM | FROM image:tag | 指定基礎(chǔ)鏡 |
MAINTAINER | MAINTAINER liuzhiqing@yodo1.com | 制作鏡像的作者 |
COPY | COPY src dest | 拷貝本地文件到容器(上下文的相對(duì)路徑或者絕對(duì)路徑) |
ADD | ADD src dest | 拷貝本地文件到容器(還支持url/壓縮歸檔文件) |
WORKDIR | WORKDIR /path/to/workdir | 使用多個(gè)WORKDIR,為后續(xù)命令指定相對(duì)目錄 |
ENV | ENV key value | 指定環(huán)境變量白修,在后續(xù)RUN指定里可以使用东亦,在容器運(yùn)行時(shí)可以保持 |
VOLUME | VOLUME ["/data"] | 創(chuàng)建一個(gè)本地和容器的掛載點(diǎn) |
EXPOSE | EXPOSE port | 容器端口映射到本機(jī)端口上 |
USER | USER daemon | 指定運(yùn)行容器是的用戶名和UID |
RUN | RUN command | Shell 格式 命令通過/bin/sh -c 去運(yùn)行 |
RUN | RUN ["exec","param1","param2"] | exec 格式,不調(diào)用shell程序唯竹,及容器中沒有shell程序乐导。參數(shù)會(huì)當(dāng)成json數(shù)組被Docker解析 |
CMD | CMD command /支持exec格式 | 運(yùn)行容器的默認(rèn)值,如果啟動(dòng)時(shí)指定了參數(shù)浸颓,則被覆蓋物臂。 |
ENTRYPOINT | ENTRYPOINT command/支持exec格式 | 運(yùn)行容器執(zhí)行命令,但和CMD區(qū)別是忽略docker run指定的參數(shù)产上。 |
私有倉庫
方式一: 下載官方做好的私有倉庫的鏡像棵磷,然后運(yùn)行起來。
[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"}]}
方式二:本地服務(wù)器安裝
安裝
[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及監(jiān)聽端口(如果想設(shè)置端口為6000晋涣,那么/etc/sysconfig/docker里 也要修改成6000)
[root@localhost ~]# vim /etc/sysconfig/docker-registry
[root@localhost ~]# vim /etc/docker-registry.yml (修改的目的是可以通過curl 查詢倉庫鏡像仪媒?!P蝗怠)
search_backend: _env:sqlalchemy
sqlalchemy_index_database: _env:sqlite:////tmp/docker-registry.db
啟動(dòng)服務(wù)
[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 查看算吩?留凭?!Y顺病)
[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\""
局域網(wǎng)內(nèi)容器互聯(lián)
一. 同主機(jī)容器之間互聯(lián)
默認(rèn)容器之間是可以互通的蔼夜,容器可以訪問外部網(wǎng)絡(luò),外部網(wǎng)絡(luò)不能訪問容器压昼。
簡單的實(shí)現(xiàn)
- -p /-P 在啟動(dòng)容器時(shí)指定-p參數(shù)求冷,映射容器內(nèi)的端口供其他容器調(diào)用和訪問。
# docker run -d -p 8000:80 --name docer_nginx docker.io/nginx
- --link 在啟動(dòng)容器時(shí)指定--link參數(shù)窍霞,Docker會(huì)在兩個(gè)容器內(nèi)創(chuàng)建獨(dú)立的隧道匠题,用于兩個(gè)容器通信。
#docker run -d liuzhiqing/mysql-server:v1
#docker run -it --link 828c819757a6:db liuzhiqing/mysql-client:v2 /bin/bash
自定義網(wǎng)橋
思路:通過操作Linux netwwork namespace 去隔離網(wǎng)絡(luò)但金,自建Linux虛擬網(wǎng)橋梧躺,把需要相互通信的容器網(wǎng)卡,加入到網(wǎng)橋中傲绣。最終實(shí)現(xiàn)互通,ip netns 工具實(shí)現(xiàn)巩踏。
實(shí)驗(yàn)過程:......
二. 不同主機(jī)容器之間互聯(lián)
橋接的方式
思路:找一個(gè)單獨(dú)的網(wǎng)卡秃诵,兩個(gè)不同主機(jī)的網(wǎng)卡連接到一個(gè)二層交換機(jī)上,新建容器的網(wǎng)卡都橋接到新的網(wǎng)橋上塞琼。
配圖:
實(shí)驗(yàn)過程:.....
直連路由
思路:新建網(wǎng)橋菠净,容器網(wǎng)卡連接到網(wǎng)橋上,通過iptables MASQUERADE偽裝 /ip forword做NAT進(jìn)行跨主機(jī)容器通信彪杉。
配圖:
試驗(yàn)過程: ....
三. pipework工具
- 連接容器到本地網(wǎng)絡(luò)
- 支持macvlan設(shè)備方式把容器接入到本地網(wǎng)絡(luò)毅往。
- 支持DHCP讓容器自動(dòng)獲取IP
- 支持open vswitch的簡單配置
- 支持容器網(wǎng)卡mac地址及配置VLAN (open vswitch的功能)
實(shí)驗(yàn)過程:...
其他
1.單臺(tái)主機(jī)上的容器vlan劃分
2.多臺(tái)主機(jī)容器的vlan劃分(交換機(jī)開trunk通道)
跨網(wǎng)絡(luò)的容器互聯(lián)
OVS隧道模式
overlay技術(shù):
一種隧道技術(shù),一種網(wǎng)絡(luò)包裝到另一種協(xié)議中去傳輸?shù)募夹g(shù)派近,實(shí)現(xiàn)方法GRE隧道攀唯。
通過GRE實(shí)現(xiàn)Docker容器的跨網(wǎng)絡(luò)通信
圖:...
多租戶GRE隔離
openstack里一個(gè)分支開源項(xiàng)目Neutron也是使用Open vswitch來實(shí)現(xiàn)的,但不同在于neutor的GRE模式有一種專門做GRE隧道的br-tun渴丸,該網(wǎng)橋中使用流表來轉(zhuǎn)發(fā)數(shù)據(jù)包(openflow)
在br-int中 虛擬機(jī)使用VLAN-ID來區(qū)分不同的租戶侯嘀,通往外界的流量則使用GRE key來區(qū)分,GRE key有24位比特位谱轨,可以很好的解決vlan數(shù)量不夠的問題戒幔。
做一個(gè)簡單的實(shí)驗(yàn)
haproxy 分發(fā)給 app , app連接redis-master, redis-master連接2個(gè)從庫