ovs+dpdk-docker實踐
docker 概念
關於docker的基本概念相關,可以參考官網介紹,介紹的挺全面的。另外這篇文章介紹的也很清晰,並附帶有可以直接上手的例項。
關於container和vm的對比,需要重點關注下,直接放圖如下:
從圖中可以看出兩者的區別包括:
1. 傳統的VM需要依賴hypervisor層來實現,而不同hypervisor實現是和硬體強繫結的;docker對hardware的依賴則很少
2. VM內部除了包含app以及依賴的執行庫環境,還包括了Guest OS;相比docker,過於重量級,從而導致對host端資源的佔用率比較高
3. docker中多個container App都是使用Host的kernel,不適用與依賴不同kernel實現的App
4. docker提供的swarm模式,可以方便地建立一個docker叢集,從而靈活地提供高可用性和故障恢復等特性
研究方案選擇
目前dpdk官網提供兩種方案來支援container,如下圖:
上圖(1) 方案中需要NIC支援SR-IOV功能,物理NIC支援的VF個數也依賴於硬體資源;每個container的介面獨佔VF,多個VF共享下面的一個PF。基於這種方案實現的container,無論對硬體的依賴和繫結,還是container的遷移,支援性都做得不夠好。
上圖(2) 方案中需要在host中執行vswitch或者vRouter來將上層的containers和底層的物理NIC解耦,只要vswitch(當前比較流行的OVS+DPDK,將OVS放在使用者態來實現)的效能足夠,一樣可以實現高效能的container app了。
技術分析
基於以上比較,本次預研主要選取第二種方案來實現,該方案中container中涉及的元件如下圖所示:
方案中使用virtual device(包括virtio-user和vhost-user backend)來實現高效能的container App 或者IPC。Virtio使用共享記憶體的方式來收發報文,傳統的VM可以通過qemu來共享vhost後端的實體地址,但對container而言,作為系統的一個程序,使用這種方式則比較難。目前的思路是隻能使用DPDK初始化的hugepages來進行記憶體共享。所以,要在container中使用dpdk,必須要分配足夠的大頁記憶體,且不同container在使用共享記憶體時要能夠分割槽使用,避免地址重複。
container + dpdk 實踐
拓撲圖
dpdk 安裝
wget http://fast.dpdk.org/rel/dpdk-17.05.tar.xz
tar -xvf dpdk-17.05.tar.xz
cd dpdk-17.05
#設定DPDK庫目錄位置
echo export RTE_SDK=$(pwd) >>~/.bashrc
#設定DPDK目標環境
#注意!這裡的x86_64-native-linuxapp-gcc應替換為實際執行環境
echo export RTE_TARGET=x86_64-native-linuxapp-gcc >> ~/.bashrc
source ~/.bashrc
#配置DPDK,需要使用Vhost-user驅動,需要將CONFIG_RTE_LIBRTE_VHOST=y
vim config/common_base
#安裝dpdk
make config T=$RTE_TARGET
make T=$RTE_TARGET -j8
#編譯l2fwd
[[email protected] dpdk-17.05]# cd examples/l2fwd/
[[email protected] l2fwd]# make
hugepage的配置(配置使用1G大小的hugepagesize,同時最多分配8個):
sudo vim /etc/default/grub2.cfg
#找到其中一項為 GRUB_CMDLINE_LINUX_DEFAULT= ,不論後面的引號內包含任何內容,在原本內容之後新增 default_hugepagesz=1GB hugepagesz=1G hugepages=8(這裡分配了8個1G的hugepages)
reboot
#檢視分配情況
grep Huge /proc/meminfo
#分配成功後進行掛載
mkdir -p /dev/hugepages
mount -t hugetlbfs none /dev/hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs -o pagesize=1G none /mnt/huge
pktgen 安裝
pktgen的安裝依賴於DPDK,安裝前確保RTE_SDK和RTE_TARGET環境變數設定正確。
#安裝依賴
yum install -y libpcap.x86_64
wget http://www.dpdk.org/browse/apps/pktgen-dpdk/snapshot/pktgen-3.4.2.tar.gz
tar -xvf pktgen-3.4.2.tar.gz
cd pktgen-3.4.2
make -j8
ln -s $(pwd)/app/$RTE_TARGET/pktgen /usr/bin/pktgen
ovs 安裝與配置
- 安裝ovs:
#下載
wget http://openvswitch.org/releases/openvswitch-2.8.1.tar.gz
#解壓
tar xzvf openvswitch-2.8.1.tar.gz
cd openvswitch-2.8.1
#配置環境並安裝
./boot.sh
CFLAGS='-march=native' ./configure --with-dpdk=$RTE_SDK/$RTE_TARGET
make
make install
#檢視大頁記憶體
cat /proc/meminfo
AnonHugePages: 32768 kB
HugePages_Total: 8
HugePages_Free: 4
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
- 啟動ovs:
#start_ovs.sh
1 #init new ovs database
2 ovsdb-tool create /usr/local/etc/openvswitch/conf.db ./vswitchd/vswitch.ovsschema
3
4 #start database server
5 ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
6 --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
7 --pidfile --detach --log-file
8
9 #initialize ovs database
10 ovs-vsctl --no-wait init
11
12 #configure ovs dpdk
13 ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true \
14 other_config:dpdk-lcore=0x2 other_config:dpdk-socket-mem="1024"
15
16 ##start ovs
17 ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock \
18 --pidfile --detach
- 建立ovs ports:
# creat_ports.sh
1 #ovs use core 2 for the PMD
2 ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x4
3
4 #create br0 and vhost ports which use DPDK
5 ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev
6 ovs-vsctl add-port ovs-br0 vhost-user0 -- set Interface vhost-user0 type=dpdkvhostuser
7 ovs-vsctl add-port ovs-br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
8 ovs-vsctl add-port ovs-br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
9 ovs-vsctl add-port ovs-br0 vhost-user3 -- set Interface vhost-user3 type=dpdkvhostuser
10
11 #show ovs-br0 info
12 ovs-vsctl show
- 新增流表
# add_flow.sh
1 #clear current flows
2 ovs-ofctl del-flows ovs-br0
3
4 #add bi-directional flow between vhost-user1 and vhost-user2(port 2 and 3)
5 ovs-ofctl add-flow ovs-br0 \
6 in_port=2,dl_type=0x800,idle_timeout=0,action=output:3
7 ovs-ofctl add-flow ovs-br0 \
8 in_port=3,dl_type=0x800,idle_timeout=0,action=output:2
9 #add bi-directional flow between vhost-user0 and vhost-user4(port 1 and 4)
10 ovs-ofctl add-flow ovs-br0 \
11 in_port=1,dl_type=0x800,idle_timeout=0,action=output:4
12 ovs-ofctl add-flow ovs-br0 \
13 in_port=4,dl_type=0x800,idle_timeout=0,action=output:1
14
15 #show current flows
16 ovs-ofctl dump-flows ovs-br0
可以檢查系統配置如下:
[[email protected] openvswitch-2.8.1]# ovs-vsctl show
a852baf4-b7ab-44cf-8c73-c9d7031af99d
Bridge "ovs-br0"
Port "vhost-user3"
Interface "vhost-user3"
type: dpdkvhostuser
Port "vhost-user1"
Interface "vhost-user1"
type: dpdkvhostuser
Port "ovs-br0"
Interface "ovs-br0"
type: internal
Port "vhost-user0"
Interface "vhost-user0"
type: dpdkvhostuser
Port "vhost-user2"
Interface "vhost-user2"
type: dpdkvhostuser
[[email protected] openvswitch-2.8.1]# ovs-ofctl show ovs-br0
1(vhost-user0): addr:00:00:00:00:00:00
config: 0
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
2(vhost-user1): addr:00:00:00:00:00:00
config: 0
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
3(vhost-user2): addr:00:00:00:00:00:00
config: 0
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
4(vhost-user3): addr:00:00:00:00:00:00
config: 0
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
LOCAL(ovs-br0): addr:62:07:93:f5:72:48
config: PORT_DOWN
state: LINK_DOWN
current: 10MB-FD COPPER
speed: 10 Mbps now, 0 Mbps max
[[email protected] openvswitch-2.8.1]# ovs-ofctl dump-flows ovs-br0
cookie=0x0, duration=89113.410s, table=0, n_packets=655640, n_bytes=21468324000, ip,in_port="vhost-user1" actions=output:"vhost-user2"
cookie=0x0, duration=89113.404s, table=0, n_packets=27460, n_bytes=21133440, ip,in_port="vhost-user2" actions=output:"vhost-user1"
cookie=0x0, duration=89113.398s, table=0, n_packets=1200940, n_bytes=39358530000, ip,in_port="vhost-user0" actions=output:"vhost-user3"
cookie=0x0, duration=89113.392s, table=0, n_packets=15560, n_bytes=11562240, ip,in_port="vhost-user3" actions=output:"vhost-user0"
[[email protected] openvswitch-2.8.1]# ovs-ofctl dump-ports ovs-br0
OFPST_PORT reply (xid=0x2): 5 ports
port "vhost-user3": rx pkts=15560, bytes=11562240, drop=0, errs=0, frame=?, over=?, crc=?
tx pkts=27460, bytes=21133440, drop=1173480, errs=?, coll=?
port "vhost-user1": rx pkts=1748120, bytes=57248848800, drop=0, errs=0, frame=?, over=?, crc=?
tx pkts=27460, bytes=21133440, drop=0, errs=?, coll=?
port "vhost-user0": rx pkts=1747020, bytes=57248782800, drop=0, errs=0, frame=?, over=?, crc=?
tx pkts=15560, bytes=11562240, drop=0, errs=?, coll=?
port "vhost-user2": rx pkts=27460, bytes=21133440, drop=0, errs=0, frame=?, over=?, crc=?
tx pkts=15560, bytes=11562240, drop=640080, errs=?, coll=?
port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
tx pkts=0, bytes=0, drop=0, errs=0, coll=0
至此ovs就啟動並配置好了,vhost-user backend口已經建立好,相應的流表路由表項也已經新增好,接下來就該部署container了。
建立testpmd container 和 l2fwd container
前提:系統已經安裝了docker,這個過程文件就不再記錄
l2fwd和testpmd都屬於dpdk提供的app,使用同一個container即可。建立container時把之前build的dpdk目錄copy到docker中。
# cd $RTE_SDK/../
# cat Dockerfile
1 FROM ubuntu:latest
2 RUN apt update -y
3 RUN apt-get install -y numactl
4 WORKDIR /root/dpdk
5 COPY dpdk-17.05 /root/dpdk/.
6 ENV PATH "$PATH:/root/dpdk/x86_64-native-linuxapp-gcc/app/"
# docker build -t dpdk-docker:17.05 .
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dpdk-docker 17.05 15a8a7206e7c 3 days ago 366.5 MB
建立pktgen docker
同理,把之前編譯好的pktgen對映到container中即可。此外需要注意的是,pktgen依賴libpcap,所以需要在container中安裝一份。使用時還發現執行container提示無法找到共享庫libpcap.so.1, 而安裝libpcap後只有libpcap.so,解決辦法就是做個軟鏈就可以了。
具體的配置步驟如下:
# cd pktgen-3.4.2/..
# cat Dockerfile
1 FROM ubuntu:latest
2 RUN apt update -y
3 RUN apt-get install -y numactl libpcap-dev
4 WORKDIR /root/dpdk
5 COPY dpdk-17.05 /root/dpdk/.
6 COPY pktgen-3.4.2 /root/pktgen/.
7 RUN ln -s /root/pktgen/app/x86_64-native-linuxapp-gcc/pktgen /usr/bin/pktgen
8 RUN ln -s /usr/lib/x86_64-linux-gnu/libpcap.so /usr/lib/x86_64-linux-gnu/libpcap.so.1
9 ENV PATH "$PATH:/root/dpdk/x86_64-native-linuxapp-gcc/app/"
# docker build -t pktgen-docker .
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pktgen-docker latest 371924729d87 23 hours ago 431.7 MB
dpdk-docker 17.05 15a8a7206e7c 3 days ago 366.5 M
實驗一
- overview
App | parameter | thread | Core Mask |
---|---|---|---|
Open vSwitch | dpdk-lcore-mask=0x2 | daemon | 0000 0010 |
- | pmd-cpu-mask=0x4 | DPDK PMD | 0000 0100 |
pktgen | -c 0x19 | GUI& Messages | 0001 1001 |
- | –master-lcore 3 | DPDK master lcore | 0000 1000 |
- | -m “0.0,4.1” | DPDK PMD | core 0:port 0, core 4:port 1 |
testpmd | -c 0xE0 | testpmd DPDK PMD | 1110 0000 |
- 啟動pktgen
#首先啟動docker container
[root@nsfocus]# docker run -ti --privileged --name=pktgen-docker \
-v /mnt/huge:/mnt/huge -v /usr/local/var/run/openvswitch:/var/run/openvswitch \
pktgen-docker:latest
root@a2603b54d66d:~/pktgen# pktgen -c 0x19 --master-lcore 3 -n 1 --socket-mem 1024,1024 --file-prefix pktgen --no-pci \
--vdev 'net_virtio_user0,mac=00:00:00:00:00:05,path=/var/run/openvswitch/vhost-user0' \
--vdev 'net_virtio_user1,mac=00:00:00:00:00:01,path=/var/run/openvswitch/vhost-user1' \
-- -T -P -m "0.0,4.1"
- 啟動testpmd
[root@nsfocus ~]# docker run -it --privileged --name=dpdk-docker \
-v /mnt/huge:/mnt/huge -v /usr/local/var/run/openvswitch:/var/run/openvswitch \
dpdk-docker:17.05
root@bdbe9fabe89a:~/dpdk/examples/l2fwd/build# cd ~/dpdk/x86_64-native-linuxapp-gcc/app/
root@bdbe9fabe89a:~/dpdk/x86_64-native-linuxapp-gcc/app#
testpmd -c 0xE0 -n 1 --socket-mem 1024,1024 --file-prefix testpmd --no-pci \
--vdev 'net_virtio_user2,mac=00:00:00:00:00:02,path=/var/run/openvswitch/vhost-user2' \
--vdev 'net_virtio_user3,mac=00:00:00:00:00:03,path=/var/run/openvswitch/vhost-user3' \
-- -i --burst=64 --disable-hw-vlan --txd=2048 --rxd=2048 -a --coremask=0xc0
- 發包驗證
在pktgen端執行:
# 在pktgen中設定速率為10%,更具體的速率設定可以通過tx_cycles設定
# 埠0共傳送100個包,埠1傳送200個
Pktgen:/>set all rate 10
Pktgen:/>set 0 count 100
Pktgen:/>set 1 count 200
Pktgen:/>str
pktgen端:
testpmd端:
ovs端:
實驗二
- overview
App | parameter | thread | Core Mask |
---|---|---|---|
Open vSwitch | dpdk-lcore-mask=0x2 | daemon | 0000 0010 |
- | pmd-cpu-mask=0x4 | DPDK PMD | 0000 0100 |
pktgen | -c 0x19 | GUI& Messages | 0001 1001 |
- | –master-lcore 3 | DPDK master lcore | 0000 1000 |
- | -m “0.0,4.1” | DPDK PMD | core 0:port 0, core 4:port 1 |
l2fwd | -c 0xE0 | l2fwd DPDK PMD | 1110 0000 |
2. 啟動pktgen
#首先啟動docker container
[root@nsfocus]# docker run -ti --privileged --name=pktgen-docker \
-v /mnt/huge:/mnt/huge -v /usr/local/var/run/openvswitch:/var/run/openvswitch \
pktgen-docker:latest
root@a2603b54d66d:~/pktgen# pktgen -c 0x19 --master-lcore 3 -n 1 --socket-mem 1024,1024 --file-prefix pktgen --no-pci \
--vdev 'net_virtio_user0,mac=00:00:00:00:00:05,path=/var/run/openvswitch/vhost-user0' \
--vdev 'net_virtio_user1,mac=00:00:00:00:00:01,path=/var/run/openvswitch/vhost-user1' \
-- -T -P -m "0.0,4.1"
- 啟動l2fwd
[root@nsfocus ~]# docker run -it --privileged --name=dpdk-docker \
-v /mnt/huge:/mnt/huge -v /usr/local/var/run/openvswitch:/var/run/openvswitch \
dpdk-docker:17.05
root@bdbe9fabe89a:~/dpdk/examples/l2fwd/build#./l2fwd -c 0xE0 -n 1 --socket-mem 1024,1024 --file-prefix testpmd --no-pci \
--vdev 'net_virtio_user2,mac=00:00:00:00:00:02,path=/var/run/openvswitch/vhost-user2' \
--vdev 'net_virtio_user3,mac=00:00:00:00:00:03,path=/var/run/openvswitch/vhost-user3' \
-- -p 0x3
- 發包驗證
在pktgen端執行:
# 在pktgen中設定速率為10%,更具體的速率設定可以通過tx_cycles設定
# 埠0共傳送100個包,埠1傳送200個
Pktgen:/>set all rate 10
Pktgen:/>set 0 count 100
Pktgen:/>set 1 count 200
Pktgen:/>str
pktgen端:
l2fwd端:
說明l2fwd已按照我們的預想進行了報文的轉發。
總結
本次實踐主要還是集中在OVS上面的container App的互通以及container內部對dpdk的支援,分別驗證了在container內部執行testpmd和l2fwd來進行報文轉發。其中,dpdk app的執行模式可以為後續cneos平臺server docker化提供一定的技術指導作用。
如果從更系統化的層面來考慮docker結合ovs以及dpdk的使用,更通用的使用場景應該是這樣的:在ovs的南向通過dpdk pmd和硬體平臺上物理nic的PF或VF繫結,高速收發報文;在ovs的北向,通過virtual device和docker container來共享收發報文,進行上層業務的處理。 南北向之間的流量需要配置flow table來指導轉發。流量示意如下圖所示:
1. 流量從物理port流入,到達OVS查詢流表送入到串聯檢測類container1(如NF,IPS)中,container1處理完後再送回流表,再次查詢流表找到物理口傳送出去
2. 流量從物理port流入,到達OVS查詢流表送入到檢測類container2中(如WAF)
3. 考慮到有多個安全container app,流量序列通過containerN,container2; 實際上,container之間的資料互動還有別的實現方式,如docker天然支援容器互聯技術,這塊還有待進一步確定實際方案
參考資料
相關推薦
ovs+dpdk-docker實踐
docker 概念 關於docker的基本概念相關,可以參考官網介紹,介紹的挺全面的。另外這篇文章介紹的也很清晰,並附帶有可以直接上手的例項。 關於container和vm的對比,需要重點關注下,直接放圖如下: 從圖中可以看出兩者的區別包括: 1.
OVS + dpdk 安裝與實驗環境配置
binding exp pidfile *** 掛載 rem 環境變量 rep new ***DPDK datapath的OVS的安裝與實驗環境配置 首先肯定是DPDK的安裝 0:安裝必要的工具 make gcc
OVS+DPDK Datapath 包分類技術
ava eas edit pat 技術 分類 edi dpdk ... // editing... please wait for a java time // editing... please wait for a java time // editing... ple
docker實踐4
停止 info default ash enabled curl port c-s gin 我的docker學習筆記4-守護式容器 $docker run -i -t ubuntu /bin/bash $ctrl-p 或 ctrl-q # 轉到後臺 $docker
docker實踐3
fault docker etc idf pid 修改 選項 service dock 我的docker學習筆記3 $docker run ubuntu echo‘hello world‘ $docker run -i -t ubuntu /bin/bash #ps -
docker 實踐
blank tar .html post clas you docker href 實踐 https://doc.yonyoucloud.com/doc/docker_practice/etcd/etcdctl.htmldocker 實踐
Docker實踐 -- 使用Open vSwitch實現跨主機通信
sha centos queue 基本架構 fan tom name uil str 作為目前最火熱的容器技術,docker在網絡實現和管理方面還存在不足。最開始的docker是依賴於Linux Bridge實現的網絡設置,只能在容器裏創建一個網卡。後來隨著docker/l
[日常] Linux下的docker實踐
alt AS 使用 img 一個 虛擬 名稱 AR 令行 1.Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC) 2.Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離 3.Docker 屬於 Linux
[ovs][dpdk] ovs-dpdk 線程數,收包隊列,core綁定
ovs org int RF conf 線程 PE -cp outer http://docs.openvswitch.org/en/latest/intro/install/dpdk/?highlight=dpdk 綁定2,4,6, 8核 [root@vrout
掘金 AMA:我是《開發者必備的 Docker 實踐指南》小冊作者--有明,你有什麼問題要問我?
掘金 AMA(ask me anything) 是掘金沸點的一個話題,掘金團隊會邀請一位技術大牛通過「你問我答」的形式回答你的問題,讓大家在技術、工作、生活方面有所成長。 AMA 嘉賓 掘金 AMA 第十一期嘉賓是《沒什麼難的 Docker》書籍、《開發者必備的 Docker
一份不能錯過的 Docker 實踐指南
如果你從來沒聽說過 Docker,我想你也不敢拍拍胸脯說自己是技術圈的人吧。不得不說,這個在 2013 年才釋出首個公開版本的軟體,僅僅用了幾年的時間,就已經火遍大江南北,甚至已經形成了自己的生態圈。之所以 Docker 能夠在這麼短的時間內快速成為備受關注的程式部署方案,是因為其以顛覆性的方式改進了分散式部
一下科技關於docker實踐分享摘錄
公司介紹 炫一下(北京)科技有限公司2011年8月成立於北京,是移動短視訊娛樂分享應用和移動視訊技術服務提供商。旗下擁有“秒拍”、“小咖秀”、“一直播”三款移動視訊產品 [1-2] 。 2016年11月21日,旗下擁有秒拍、小咖秀、一直播的一下科技宣佈完成5億美元E輪融資,該輪融資也創下了國內移動視訊
docker實踐錄2:使用dockerhub中轉站下載cuda安裝包
最近,演算法小組使用最新版本的tensorflow,需要用到cuda9,去年安裝的是cuda8,已經不合適了,於是要在伺服器上升級。由於是伺服器,我不敢讓其它人做,我就自己來升級。去年因為有同事安裝cuda把python搞壞,我修復半天不行,ubunut一層一層
Docker實踐(三)容器
Docker中,容器是獨立執行的一個或一組應用,以及應用執行的環境;對應傳統的虛擬化,虛擬機器可以理解為模擬作業系統和執行在上面的應用。 啟動容器 啟動容器一般有兩種方式,一種是新建容器並啟動,一種是將終止狀態的容器重新啟動,Docker容器非常的輕量級,能夠很好的支援使
docker 實踐(一)安裝
一、Docker理論關於Docker理論特別多,一句話就是傳統虛擬機器是完全模擬物理機核心空+使用者空間;Docker是隻模擬使用者空間。 二、Docker三個概念映象(Image)、容器(Container)、倉庫(Repository) 1.1.映象映象就像是一個目標可以用來建立docker容器,類似
docker 實踐(二)映象
一、獲取映象 1.1.從倉庫(Docker hub)獲取一個映象 # docker pull busybox Using default tag: latest #預設標籤為最新 latest: P
docker 實踐(三)dockerfile 說明
一、dockfile 說明 docker 執行一個自定義的image時,就需要自己來定義,這時候就需要dockfile了。 二、docker commit生成新映象 2.1.執行容器 # docker run -it centos /bin/bas
docker 實踐(五)公共倉庫及私有倉庫
一、docker倉庫說明 Docker registries 可以上傳和下載image,有共有和私有兩種。共有就是Docker Hub,私有就是自建一個倉庫使用。 二、docker hub使用 2.1.註冊使用者 註冊地址:https://hub.docker.com 2.2.登陸上傳映
docker 實踐(六)docker 資源隔離及限制
一、docker 底層實現 docker 通過namespace實現資源隔離;通過cgroup實現資源限額 二、namespace說明 2.1.概述 namespace使得容器像一臺獨立的計算機,namespace實現容器間資源隔離。linux六中namespace mnt namespac
Docker實踐(四)Dockerfile
什麼是Dockerfile? 使用Dockerfile,可以方便的建立自定義映象。 基本結構 由一行行命令組成,支援#註釋。Dockerfile一般分為四個部分: 基礎映象資訊 維護者資訊 映象操作指令 容器啟動指令 如下面是一個基礎的Dockerfile