一、樹莓派的安裝
下載鏡像
在 樹莓派官網
https://www.raspberrypi.org/downloads/raspbian/
Win32 DiskImager
,是一個把系統鏡像寫入SD卡的工具:
https://sourceforge.net/projects/win32diskimager/
解壓系統鏡像文件得到img文件,點擊Write,寫入系統。 格式化為F32,插入樹莓派樹莓派即可開機。
二、WiFi 網絡配置
由於沒有桌面服務,就算開機也不能進入系統來操作,如果有網線的話直接把網線插入樹莓派即可聯網,如果沒有網線,只有 wifi 的話,就需要設置 wifi 的網絡配置。
其實操作方法是很簡單的:只要將刷好 Raspbian 系統的 SD 卡用電腦讀取。在 boot 分區,也就是樹莓派的 /boot 目錄下新建 wpa_supplicant.conf
文件,按照下面的參考格式填入內容並保存到 wpa_supplicant.conf
文件即可。
country=CN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="WiFi1" psk="12345678" key_mgmt=WPA-PSK priority=1 } network={ ssid="WiFi-2" psk="12345678" key_mgmt=WPA-PSK priority=2 scan_ssid=1 }
說明以及不同安全性的 WiFi 配置示例:
ssid:網絡的ssid
psk:wifi的密碼
priority:連接優先級,數字越大優先級越高(不可以是負數)
scan_ssid:連接隱藏WiFi時需要指定該值為1
如果您的 WiFi 沒有密碼
network={ ssid="你的無線網絡名稱(ssid)" key_mgmt=NONE }
如果您的 WiFi 使用WEP加密
network={ ssid="你的無線網絡名稱(ssid)" key_mgmt=NONE wep_key0="你的wifi密碼" }
如果您的 WiFi 使用WPA/WPA2加密
network={ ssid="你的無線網絡名稱(ssid)" key_mgmt=WPA-PSK psk="你的wifi密碼" }
三、開啟 SSH 服務
新系統的話是不可以通過 ssh 來連接樹莓派的,會出現 Access denied 這個提示,所以需要手動開啟,當然,這是很簡單的。和 WiFi 配置相似,同樣在 boot 分區新建一個文件,空白的即可,文件命名為 ssh
。注意要小寫且不要有任何擴展名!
四、樹莓派啟用root賬戶
樹莓派使用的linux是debian系統,所以樹莓派啟用root和debian是相同的。
debian里root賬戶默認沒有密碼,但賬戶鎖定。
當需要root權限時,
直接執行
$ sudo su
即可切換為root用戶。
樹莓派默認用戶是pi
,密碼為raspberry
。
重新開啟root賬號,可由pi用戶登錄后,在命令行下執行
$ sudo passwd root
修改root的密碼。
執行此命令后系統會提示輸入兩遍的root密碼,輸入你想設的密碼即可,然后在執行
$ sudo passwd -u root
開啟root賬號。
如果上面執行完出現
password expiry information changed.
的提示
是因為新版本ssh默認關閉root登陸,可以修改一下ssh的配置文件
$ sudo vim /etc/ssh/sshd_config
注:樹莓派自帶的vi編輯器十分難用,但vim是一個強大的編輯器,可以通過 sudo apt-get install vim
來安裝
五、樹莓派上運行Docker
安裝Docker
在此之前可先更換apt源;
安裝請參考:
http://get.daocloud.io/#install-docker
或者
https://www.runoob.com/docker/ubuntu-docker-install.html
或者
Centos7下安裝Docker(詳細安裝教程)
換成阿里源
$ cd /etc/docker
$ vi daemon.json
{
"registry-mirrors": [
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"dns": ["8.8.8.8","8.8.4.4"]
}
然后重啟docker
service docker restart
Docker簡單的使用
操作鏡像:
#查看當前Docker的版本
docker -v
#搜索Docker, nginx代表您要搜索的鏡像
docker search nginx
#拉取鏡像文件
docker pull nginx
#查看已下載鏡像
docker images
#刪除本地鏡像
docker rmi nginx
#強制刪除docker本地鏡像
docker rmi -f nginx
#保存本地鏡像至本地
docker save -o nginx_image.docker nginx
#加載鏡像
docker load -i nginx_image.docker
使用dockerfile生成鏡像(build):到了項目和 dockerfile 同一級的目錄(注意后面的 .
不要省略)
docker build -t my-python-app .
#批量刪除無用鏡像或容器
#批量刪除異常停止的docker容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
#批量刪除名稱或標簽為none的鏡像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
創建容器:
################ 創建並啟動容器 #################
docker run -it --name 容器名 -p 8080(本地):80(容器) -d 鏡像名 (sh或者bash)
-d
設置容器在在后台一直運行。-p
端口進行映射,將本地 8080 端口映射到容器內部的 80 端口。
操作容器:
啟動容器
docker run [ option ] 鏡像名稱或者鏡像id
例如: docker run -it -p 80:80 -v /www:/www --name nginx 鏡像名稱或者id
映射主機串口和總是啟動:docker run -itd --name gw4 -p 8200:80 --device='/dev/ttyAMA0' --restart=always gatewaysite_pro4
-
-i: 以交互模式運行容器,通常與 -t 同時使用;
- -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-
-p: 端口映射,格式為:主機(宿主)端口:容器端口
- -d: 后台運行容器,並返回容器ID;
- --name "nginx": 為容器指定一個名稱
- -v : Docker容器啟動的時候,如果要掛載宿主機的一個目錄(docker run -it -v /test:/soft centos /bin/bash /test為宿主機目錄 /soft為容器目錄,會自動創建)
- /bin/bash 啟動容器時並進入容器
#列出容器 -a表示未運行的也列出
docker ps -a
-
-a :顯示所有的容器,包括未運行的。
-
-f :根據條件過濾顯示的內容。
-
--format :指定返回值的模板文件。
-
-l :顯示最近創建的容器。
-
-n :列出最近創建的n個容器。
-
--no-trunc :不截斷輸出。
-
-q :靜默模式,只顯示容器編號。
-
-s :顯示總的文件大小。
進入到正在運行的容器
docker exec -it 容器id或者名稱 /bin/bash
#啟動容器
docker start server1
#停止容器
docker stop server1
#重啟容器
docker restart server1
#強制刪除容器
docker rm -f server1
#連接容器
docker attach server1
#在容器中輸出"Hello World"
docker exec server1 echo "Hello World
#拷貝文件到容器
docker cp /root(主機) 容器id:/root(容器)
#查看docker網絡
docker network ls
#查看容器的網絡配置
docker network inspect bridge
#退出容器
exit
#查看當前進程
ps aux
#容器中的查看網絡配置信息(ifconfig)
ip ad li
#容器中的查看路由表
ip ro li
#查看容器進程pid
docker inspect --format "{{.State.Pid}}" mynginx(容器名)
#docker網絡訪問
brctl show
#利用systemctl命令管理
顯示服務狀態:systemctl status docker.service
列出服務層級和依賴關系:systemctl list-dependencies docker.service
啟動服務:systemctl start docker.service 關閉服務:systemctl stop docker.service 重啟服務:systemctl restart docker.service 設置服務自啟動:systemctl enable docker.service 禁止服務自啟動:systemctl disable docker.service 查看服務是否自啟動:systemctl is-enabled docker.service 列出系統所有服務的啟動情況:systemctl list-units --type=service 列出所有自啟動服務:systemctl list-unit-files|grep enabled
#-----------數據卷--------
#把物理主機的/opt目錄或者文件掛載到docker中
docker run -it --name volume-test2 -h centos -v /opt(原):/opt(容器) centos
docker run -it --name volume-test2 -h centos -v /opt(原):/opt:ro(容器) centos (只讀)
#-----------數據卷容器--------
#讓volume-test1容器專門存數據,其他容器從volume-test1容器中讀數據
docker run -it volume-test3 --volumes-from volume-test1 centos
#-----------Docker資源隔離和限制--------
docker容器的本質是宿主機上的一個進程。
Docker通過namespace實現了資源隔離,通過cgroups實現了資源限制,通過*寫時復制機制(copy-on-write)*實現了高效的文件操作。
1、linux的namespace機制
namespace 機制提供一種資源隔離方案。
PID,IPC,Network等系統資源不再試全局性的,而是屬於某個特定的Namespace.
每個namespace下的資源對於其他的namespace下的資源是透明的,不可見的。
Linux 內核實現namespace的一個主要目的就是實現輕量級虛擬化(容器)服務,在同一個namespace下的進程可以感知彼此的變化,而對外界的進程一無所知,以達到獨立和隔離的目的。
namespace可以隔離哪些
一個容器要想與其他容器互不干擾需要能夠做到:
文件系統需要是被隔離的
網絡也是需要被隔離的
進程間的通信也要被隔離
針對權限,用戶和用戶組也需要隔離
進程內的PID也需要與宿主機中的PID進行隔離
容器也要有自己的主機名
有了以上的隔離,我們認為一個容器可以與宿主機和其他容器是隔離開的。
恰巧Linux 的namespace可以做到這些。
2、通過cgroups實現了資源限制:CPU和內存的限制
需要使用到壓力測試工具:stress
stress安裝教程:https://blog.csdn.net/datuzijean/article/details/86614597
或者創建一個stress的dockerfile:
(1)測試CPU
查看cpu信息:cat /proc/cpuinfo
開啟一個壓測stress:docker run -it --rm stress --cpu 1
再開啟一個壓測stress:docker run -it --rm stress --cpu 1
使用top查看CPU使用情況,會發現2個stress各占50%,每個容器默認權重都是1024,調整權重后(docker run -it --rm -c 512 stress --cpu 1),1,2占比2:1
(2)測試內存
docker run -it --rm -m 128m stress --vm 1 --vm-bytes 120m --vm-hang 0 (-m 限制容器使用128M內存,當--vm-bytes 256m時,大概是-m的2倍時,容器退出)
#-----------Docker網絡模式-----------
(1)容器間的互聯
docker守護進程的啟動選項 --icc=true(默認)
容器重啟后,容器的IP地址會發生改變,所以需要使用link來連接多個容器:
命令:docker run -it --name mycentos2 --link=mycentos1:webtest centos (webtest是別名))
創建ing進入容器后,ping webtest就可以ping通mycentos1的容器
可以使用環境變量查看:env
也可以 vi /etc/hosts 查看webtest的地址映射
(2)拒絕所有容器間的互聯
docker守護進程的啟動選項 --icc=false
vim /etc/sysconfig/docker 添加DOCKER_OPTS="--icc=false"
重啟docker服務:service docker restart
(3)允許特定容器中的鏈接
docker守護進程的啟動選項 --icc=false --iptables=true
--link
(4)容器與外部網絡的鏈接
--ip-forword=true 決定系統是否會轉發流量,默認開啟
--iptables iptables是與Linux內核集成的包過濾防火牆系統
阻止特定IP訪問特定容器: iptables -I DOCKER -s 192.168.238.2 -d 172.17.0.2 -p TCP --dport -j DROP
查看iptables
#-----------registry私有鏡像倉庫-----------
在192.168.238.1的機器上執行:
下載registry鏡像:docker pull registry
創建容器:docker run -d -p 5000:5000 registry
給要上傳的鏡像打標簽,這里以redis為例:docker tag redis 192168.238.1:5000/redis:v1
上傳redis到registry私有倉庫:docker push 192168.238.1:5000/redis:v1
注意:此時若報錯,可執行如下操作:
vim /etc/sysconfig/docker
在OPTIONS=后面加上:--insecure-registry 192.168.238.1:5000
然后重啟容器:systemctl restart docker
在192.168.238.2的機器上執行:
vim /etc/sysconfig/docker
在OPTIONS=后面加上:--insecure-registry 192.168.238.1:5000
然后重啟容器:systemctl restart docker
然后就可以pull鏡像了:docker pull 192168.238.1:5000/redis:v1
#-----------公有鏡像倉庫 docker hub-----------
https://www.cnblogs.com/yangyangming/p/11646666.html