wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
kubectl apply -f rbac.yaml
sotrageclass.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
reclaimPolicy: Delete
該provisioner將會自動創建pv,以 ?namespace?{pvcName}-${pvName} 的命名格式創建在 NFS 服務器的 /mnt/storage 目錄上。
nfs-provisioner-deploy.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
labels:
app: nfs-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-provisioner
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccountName: nfs-provisioner
containers:
- name: nfs-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 10.1.36.89
- name: NFS_PATH
value: /mnt/storage
volumes:
- name: nfs-root
nfs:
server: 10.1.36.89
path: /mnt/storage
nfs-statefulset.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nfs-web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nfs-web # has to match .spec.template.metadata.labels
template:
metadata:
labels:
app: nfs-web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: nfs-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
啟動后,發現創建的PVC狀態一直處于pending狀態。
排查步驟:
利用以上信息,找到相關線索:
kubernetes版本在v1.20起,默認禁止使用SelfLinks。
想辦法開啟SelfLinks。這里提供三種思路
一般在 /etc/kubernetes 下,可以 find / -name kube-apiserver.yaml 全局搜索,添加如下內容,然后重啟kube-apiserver服務即可
如果沒有找到kube-apiserver.yaml文件,比如通過二進制部署的,可以全局搜索 kube-apiserver.service (一般在 /etc/systemd/system/kube-apiserver.service),添加如下內容即可。修改完記得systemctl daemon-reload一下,并重啟kube-apiserver服務
如果是用rancher部署的,那么需要修改其cluster.yml文件如下,然后更新配置:./rke up
問題解決
四,阿里云部署
以上是基于本地部署的k8s進行的動態存儲配置,如果是在阿里云上,可以參考:
https://help.aliyun.com/document_detail/204404.html#title-g3c-55i-xs6
眾號:滲透師老A
專注分享滲透經驗,干貨技巧....
進入內網之后、是一種由點到線再到面的測試,先弄清楚當前機器的情況,如在域中角色、提供的服務等信息;
再以此為跳板收集其它機器的信息,當收集的信息足夠多,拿下域控的可能型也就越高。
為了后續的提權等操作,首先要盡可能拿下當前機器的權限,所以對當前機器的信息收集也是必要的。
|查看系統配置信息
ssysteminfo 查看系統信息,但是內容太多在某些時刻無法通過菜刀等工具看到返回的結果
可以將內容輸出到某個文件,也可以結合findstr 查詢指定內容
如查詢操作系統即軟件的信息 systeminfo | findstr /B /C:"OS"
該指令輸入的內容是比較多的,除了使用finder選擇輸出外,部分信息可以使用其它指令單獨顯示
比如echo %processor_architecture%查看系統架構,net statistics workstation查看系統啟動時間
其中的補丁信息可以使用wmic qfe get caption,description,hotfixid,installedon獲取
WMIC擴展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了從命令行接口和批命令腳本執行系統管理的支持。
在cmd中有些時候查到的數據不全,如某些進程的pid,這時可以使用wmic進行操作,WMIC提供了大量的全局開關、別名、動詞、命令和豐富的命令行幫助增強用戶接口。
wmic product get name,version,查看系統安裝的軟件版本等內容。
wmic /node:localhost /namespace:\root\securitycenter2 path antivirusproduct get displayname /format:list查殺軟
初次之外,還可以使用netsh firewall show config和netsh advfirewall firewall show config查看防火墻配置信息
|查看系統服務信息
wmic startup get command,caption,查看啟動程序信息
wmic service list brief,查詢本機服務信息
還可以使用tasklist 查詢進程信息
schtasks /query /fo LIST /V,查看計劃任務
netstat -ano查看端口列表
注意,一般查看進程端口,先查進程pid,在根據pid查端口
|查看系統登錄信息
query user,登錄到系統的用戶信息
net session,列出連接會話信息,但是一般需要高權限才能執行
|自動信息收集
很多后滲透模塊都可以進行信息收集,這里不談,分享個嫖到的腳本
for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A"
wmic process get CSName,Description,ExecutablePath,ProcessId /format:"%var%" >> out.html
wmic service get Caption,Name,PathName,ServiceType,Started,StartMode,StartName /format:"%var%" >> out.html
wmic USERACCOUNT list full /format:"%var%" >> out.html
wmic group list full /format:"%var%" >> out.html
wmic nicconfig where IPEnabled='true' get Caption,DefaultIPGateway,Description,DHCPEnabled,DHCPServer,IPAddress,IPSubnet,MACAddress /format:"%var%" >> out.html
wmic volume get Label,DeviceID,DriveLetter,FileSystem,Capacity,FreeSpace /format:"%var%" >> out.html
wmic netuse list full /format:"%var%" >> out.html
wmic qfe get Caption,Description,HotFixID,InstalledOn /format:"%var%" >> out.html
wmic startup get Caption,Command,Location,User /format:"%var%" >> out.html
wmic PRODUCT get Description,InstallDate,InstallLocation,PackageCache,Vendor,Version /format:"%var%" >> out.html
wmic os get name,version,InstallDate,LastBootUpTime,LocalDateTime,Manufacturer,RegisteredUser,ServicePackMajorVersion,SystemDirectory /format:"%var%" >> out.html
wmic Timezone get DaylightName,Description,StandardName /format:"%var%" >> out.html
復制為bat文件,結果為out.html保存在c盤根目錄,名稱路徑可自行修改。
|判斷是否存在域
whoami,如果當前賬戶為域用戶,則返回結果通常為域名\用戶名
ipconfig,如果是雙網卡,一般存在內網
systeminfo,如果在域中,則如圖,否則為workgroup
net config workstation,在域中,通常計算機全名為計算機名.域名
不在域中如下圖
net time /domain,查看時間服務器,域中機器的dns服務器和時間服務器通常為域控機。
如下圖則是存在域且當前登錄用戶為域用戶
如下圖則表示不在域中
如下圖則表示在域中,但當前用戶非域用戶
除此之外,收集其它內容的時候都能看到,比如系統信息,用戶信息等
|探測域內存主機&端口
探測存活主機和端口平時最容易想到的工具是nmap,但這個工具太大,直接安裝存在風險,端口轉發受限于網絡環境,這里聊聊其它方法
powershell
powershell可以在滲透中提供強大的助力,下面這些腳本使用的時候記得修改 ip地址
掃描存活ip,最前面的1..255是ip地址的d段,最后范圍是192.168.0.1-255,判斷和修改方式下同
1..255 | % {echo "192.168.0.$_"; ping -n 1 -w 100 192.168.0.$_} | Select-String ttl
判斷主機類型,根據ttl值判斷,范圍192.168.0.1-255
1..255 | % {echo "192.168.0.$_"; ping -n 1 -w 100 192.168.0.$_} | Select-String ttl |% { if ($_ -match "ms") { $ttl = $_.line.split('=')[2] -as [int]; if ($ttl -lt 65) { $os = "linux"} elseif ($ttl -gt 64 -And $ttl -lt 129) { $os = "windows"} else {$os = "cisco"}; write-host "192.168.0.$_ OS:$os" ; echo "192.168.0.$_" >> scan_results.txt }}
掃描端口
24..25 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.1.119",$_)) "Port $_ is open!"} 2>$null
24..25 |% {echo "$_ is "; Test-NetConnection -Port $_ -InformationLevel "Quiet" 192.168.1.119}2>null
掃描指定端口的ip
foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.0.$ip}
arp掃描
在內網里通常使用mac地址進行機器尋找,其可以通過arp協議實現
小工具
由很多免安裝的小工具也可以進行掃描,比如nbtscan,直接傳到目標服務器上運行即可,工具下載地址:http://www.unixwiz.net/tools/nbtscan.html
用法:nbtscan.exe 網段 ,更多用法參考:nbgtscam.exe /?
含義如下:
|Token|含義|
|——|——|
SHARING|機器正在運行的文件和打印共享服務,但這并不一定有內容共享
DC|機器可能是Windows NT域控制器,無論是主域還是輔助域。
U=user |機器可能有一個具有指定名稱的登錄用戶
IIS |機器可能安裝了Microsoft的Internet信息服務器(IIS)
EXCHANGE |機器可能安裝Microsoft Exchange
NOTES |單機器可能安裝Lotus Notes電子郵件客戶端
? |沒有識別出NETBIOS資源
telnet
telnet常規使用是和服務器建立連接,也開業用來探測端口是否開放
用法:telnet 主機 端口,如:telnet dc 3389。
注意:不是所有機器都安裝了此服務。
|查看用戶&機器&會話相關信息
查看機器相關信息
net view /domain,查詢域信息,判斷當前機器加入的域
net view /domain:域名,查詢域內所有主機
在域中,有一類至關重要的機器叫域控制器,簡稱域控,機器名通常為DC,在實際環境中,域控為一主一備用兩臺。
netdom query pdc,查看域控名稱
查看用戶相關信息
net user查詢當前機器所有用戶,net user /domain查看域用戶
net user 用戶名查看當前機器內的用戶信息
net user 用戶名 /domain查看當前機器內的域用戶信息
注意對比上述結果的區別,此外net user localgroup,net user localgroup /domain和net group /domain也是有區別的
wmic useraccount get /all,獲取域內用戶的詳細信息
參考鏈接:
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11FUZo7g
系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上。
可以通過命令 uname -a 查看版本情況,通過 cat /etc/issue 查看操作系統
[root@node6 ~]# uname -a
Linux node6 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@node6 ~]# cat /etc/issue
\S
Kernel \r on an \m
安裝、運行、停止
# 安裝docker
yum install -y docker 或者 yum install -y docker-io
# 啟動docker
systemctl start docker
# 重啟docker
systemctl restart docker
# 停止docker
systemctl stop docker
# 查看docker啟動狀態
docker version
如果安裝完成后啟動報如下錯誤:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service"
按以下步驟解決:
第一步:yum remove docker-* 卸載docker。
第二步:yum update 更新linux系統內核的版本。
然后按照上面的安裝步驟重新安裝啟動即可。
配置鏡像加速器
國內從 Docker Hub 拉取鏡像有時會遇到困難,此時可以配置鏡像加速器。找個國內可使用的鏡像加速器地址,以centos為例來看怎們進行配置,鏡像加速器可以配置多個:
#國內加速地址
#Docker中國區官方鏡像
https://registry.docker-cn.com
#網易
http://hub-mirror.c.163.com
#ustc
https://docker.mirrors.ustc.edu.cn
#中國科技大學
https://docker.mirrors.ustc.edu.cn
#阿里云容器服務
https://cr.console.aliyun.com/
vi /etc/docker/daemon.json
然后編輯輸入:
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
}
docker search hello-world # 搜索hello-world的鏡像
docker pull hello-docker # 獲取centos鏡像
docker run hello-world #運行一個docker鏡像,產生一個容器實例(也可以通過鏡像id前三位運行)
docker image ls # 查看本地所有鏡像
docker images # 查看docker鏡像
docker image rmi hello-docker # 刪除centos鏡像
docker ps #列出正在運行的容器(如果創建容器中沒有進程正在運行,容器就會立即停止)
docker ps -a # 列出所有運行過的容器記錄
docker ps -l #查看最新創建的容器
docker ps -n=xxx #查看最新創建的n個容器
docker save centos > /opt/centos.tar.gz # 導出docker鏡像至本地
docker load < /opt/centos.tar.gz #導入本地鏡像到docker鏡像庫
docker stop `docker ps -aq` # 停止所有正在運行的容器
docker rm `docker ps -aq` # 一次性刪除所有容器記錄
docker rmi `docker images -aq` # 一次性刪除所有本地的鏡像記錄
創建容器如下:
docker create nginx #創建一個nginx容器,這個時候創建的容器處于停止狀態,未啟動,這種創建方式容器名稱隨機生成,也可以自定義容器名稱,如下:
docker create --name=nginx nginx
啟動容器如下:
使用 `docker start` 命令結合容器 id 或者容器 name 可以啟動一個容器。
一般來說,第一次可以使用 docker run 啟動一個容器,以后直接使用 docker start 即可。
docker run --name nginx1 -d -p 8080:80 nginx
--name 表示創建的容器的名字,-d 表示容器在后臺運行,-p 表示將容器的 80 端口映射到宿主機的 8080 端口。
docker run --name ubuntu -it ubuntu /bin/bash
參數含義和后臺型容器描述一致,除了 -it,-it 參數,i 表示開發容器的標準輸入(STDIN),t 則表示告訴docker,為容器創建一個命令行終端。
想要退出該終端,只需要輸入 exit命令即可。
容器在運行過程中,會不可避免的出問題,出了問題時,需要能夠自動重啟,在容器啟動時使用 –restart 參數可以實現這一需求。根據 docker 官網的解釋,docker 的重啟策略可以分為 4 種,如下圖:
四種的含義分別如下:
no表示不自動重啟容器,默認即此。
on:failure:[max-retries]表示在退出狀態為非0時才會重啟(非正常退出),有一個可選擇參數:最大重啟次數,可以設置最大重啟次數,重啟次數達到上限后就會放棄重啟。
always表示始終重啟容器,當docker守護進程啟動時,也會無論容器當時的狀態為何,都會嘗試重啟容器。
unless-stopped表示始終重啟容器,但是當docker守護進程啟動時,如果容器已經停止運行,則不會去重啟它。
使用 `docker stop` 命令結合容器 id 或者容器 name 可以終止一個容器。
docker rm 命令結合容器 id 或者容器 name 可以刪除一個容器。刪除容器時,只能刪除已經停止運行的容器,不能刪除正在運行的容器。
如果非要刪除一個正在運行的容器,可以通過 -f 參數實現,例如 docker rm -f nginx
容器也可以批量刪除,命令如下:
docker rm $(docker ps -a -q)
docker ps -a -q 會列出所有容器的 id ,供 rm 命令刪除。
如下命令也支持刪除已退出的孤立的容器:
docker container prune
摘自方志朋博客,參考地址:https://www.fangzhipeng.com/docker/2018/09/12/docker-action.html
docker run -p 80:80 -d docker.io/nginx
docker cp index.html containerId://usr/share/nginx/html #用于主機和容器之間拷貝數據
docker exec -it containeId /bin/bash
docker images
docker ps [-a -q]
docker stop containerId
docker rm containerId
docker rmi imagesId
docker commit –m ’msg’ containerId [name]
docker build
docker pull
docker push
docker login
docker exec -it ubuntu /bin/bash
容器創建成功后,用戶可以通過 `docker inspect` 命令查看容器的詳細信息,這些詳細信息包括容器的id 、容器名、環境變量、運行命令、主機配置、網絡配置以及數據卷配置等信息。
例如查看unbutu的容器信息, docker inspect ubuntu
使用 format 參數可以只查看用戶關心的數據,例如:
#查看容器運行狀態
docker inspect -f='{{.State.Running}}' ubuntu
#查看容器IP地址
docker inspect -f='{{.NetworkSettings.IPAddress}}' ubuntu
#查看容器名稱、ID
docker inspect -f='{{.Name}} {{.ID}}' ubuntu
#查看容器主機信息
docker inspect -f='{{.HostConfig}}' ubuntu
#使用 docker top 命令可以查看容器中正在運行的進程,首先確保容器已經啟動,然后執行 docker top 命令,例如:
docker top ubuntu
#交互型容器查看日志很方便,因為日志就直接在控制臺打印出來了,但是對于后臺型容器,如果要查看日志,則可以使用docker提供的 docker logs 命令來查看,例如:
docker logs ubuntu
#默認情況下只能查看到歷史日志,無法查看實時日志。使用 -f 參數后,就可以查看實時日志,使用 --tail 參數可以精確控制日志的輸出行數, -t 參數則可以顯示日志的輸出時間,示例:
docker logs -f --tail=3 -t ubuntu
#參考命令,將nginx容器導出到/home/docker目錄下
docker export nginx > /home/docker/nginx.tar
#通過執行如下命令可以導入容器(如果自己重新導入,需要記得將 docker 中和 nginx 相關的容器和鏡像刪除):
cat nginx.tar | docker import - importednginx:ilatest
#這里需要注意nginx.tar所在目錄
#導入成功后就可以使用 docker run命令進行運行了。
#查看本地所有鏡像
docker images
#如果鏡像過多,可以通過通配符進行匹配
docker images n*
#可以首先通過命令查找鏡像,例如:
docker search nginx
#然后可以根據查詢的結果,拉取鏡像到本地
docker pull nginx
#鏡像可以通過 docker rmi 命令進行刪除,參數為鏡像的id或者鏡像名,參數可以有多個,多個參數之間用空格隔開。例如:
docker rmi nginx
#如果無法刪除一個鏡像,大部分原因是因為該鏡像被一個容器所依賴,此時需要先刪除容器,然后就可以刪除鏡像了
# 一般采用Dockerfile方式,或者使用Jib方式去構建鏡像。
# 如果是用單獨Dockerfile文件方式構建鏡像,可以使用如下命令:
docker build -t mk/nginx1:v2 .
# -t 參數用來指定鏡像的命名空間,倉庫名以及 TAG 等信息。
# 最后面的 . 是指鏡像構建上下文。也就是要打包的所有內容所在路徑
Docker Hub 提供鏡像托管服務,類似GitHub,Docker Hub 地址為 https://hub.docker.com/
利用 Docker Hub 讀者可以搜索、創建、分享和管理鏡像。Docker Hub 上的鏡像分為兩大類,一類是官方鏡像,例如nginx、mysql 等,還有一類是普通用戶鏡像,普通用戶鏡像由用戶自己上傳。對于國內用戶,如果覺得 Docker Hub 訪問速度過慢,可以使用國內一些公司提供的鏡像。
例如網易:https://c.163yun.com/hub#/m/home/
接下來以Docker Hub官方鏡像站來做演示如下:
# 先注冊一個賬戶
https://hub.docker.com/
# 然后在命令行輸入以下命令進行登錄,提示Login Succeeded,說民登錄成功
docker login
# 接下來就可以使用 push 命令上傳我們自制的鏡像了。注意,自制的鏡像要能夠上傳,命名必須滿足規范,即 namespace/name 格式,其中 namespace 必須是注冊的用戶名,例如:
docker push mk809311844265/nginx2:v2
# 然后在https://hub.docker.com/官方的Repositories中就可以看到上傳的鏡像了,之后可以通過pull拉下來上傳的鏡像文件,例如:
docker pull mk809311844265/nginx2:v2
自動化構建,就是使用 Docker Hub 連接一個包含 Dockerfile 文件的 GitHub 倉庫或者 BitBucket 倉庫, Docker Hub 則會自動構建鏡像,通過這種方式構建出來的鏡像會被標記為 Automated Build ,也稱之為受信構建 (Trusted Build) ,這種構建方式構建出來的鏡像,其他人在使用時可以自由的查看 Dockerfile 內容,知道該鏡像是怎么來的,同時,由于構建過程是自動的,所以能夠確保倉庫中的鏡像都是最新的。實際意義不大,因為一般的公司環境鏡像都是需要保密私有的有知識產權的,所以構建本地鏡像倉庫就成為一個企業應用的必選方案。
Docker 官方已經將 Docker 注冊服務器做成鏡像了,我們直接 pull 下來運行即可。
# 第一步:拉取鏡像
docker pull registry
# 第二步:實例化容器運行起來
docker run -itd --name registry -p 5000:5000 docker.io/registry
# 第三步:標記本地鏡像,以nginx為例
docker tag docker.io/nginx:latest 127.0.0.1:5000/docker.io/nginx:latest
# 第四步:上傳本地鏡像,以nginx為例
docker push 127.0.0.1:5000/docker.io/nginx:latest
# 第五步: 查看本地倉庫中的鏡像
curl 127.0.0.1:5000/v2/_catalog
# 第六步: 下載本地倉庫的鏡像,實現使用 docker images命令查看,發現剛才push的鏡像已經在本地鏡像存在了,所以需要 docker rmi 命令先去刪除該鏡像,然后在從本地鏡像倉庫中下載
docker rmi 127.0.0.1:5000/docker.io/nginx
docker pull 127.0.0.1:5000/docker.io/nginx
# 特別說明,如果要在外網可以訪問,需要對外開放端口訪問
/sbin/iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
設置私有倉庫的用戶名、密碼(該內容不完善,未完待續)
參考如下地址:https://blog.csdn.net/qq_38637558/article/details/99603071
# 第一步:掛載相關的配置,這里注意/docker/registry/auth目錄在根目錄下,和home目錄平級
mkdir -p /docker/registry/auth
# 第二步:生成賬號密碼
docker run --entrypoint htpasswd registry:latest -Bbn mk192837 mk_own_123 >> /docker/registry/auth/htpasswd
# 第三步:設置配置文件
mkdir -p /docker/registry/config
vi /docker/registry/config/config.yml ,然后輸入以下內容:
================================start===================================
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
==================================end===================================
# 第四步:啟動registry容器
docker run -d -p 5000:5000 --restart=always --name=registry \
-v /docker/registry/config/:/etc/docker/registry/ \
-v /docker/registry/auth/:/auth/ \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v /docker/registry/:/var/lib/registry/ \
registry
# 第五步:開啟 http 形式訪問私有倉庫模式
vi /etc/docker/daemon.json
# 然后添加如下內容:
{
"insecure-registries": [
"192.168.42.105:5000"
]
}
# 然后執行如下命令,使配置立刻生效
systemctl daemon-reload
# 重啟docker
systemctl restart docker
# 暴露網絡端口的參數有兩個,分別是 `-p` 和 `-P` 。
# 使用 -P,Docker 會在宿主機上隨機為應用分配一個未被使用的端口,并將其映射到容器開放的端口,以 Nginx 為例,例如:
docker run -itd --name nginx -P nginx
# 這個時候docker為應用分配了一個隨機端口
# -p 參數則有幾種不同的用法:
# 第一種: hostPort:containerPort 這種用法是將宿主機端口和容器端口綁定起來,示例:
docker run -itd --name nginx -p 80:80 nginx
# 第二種: ip:hostPort:containerPort 這種是將指定的 ip 地址的端口和容器的端口進行映射,將 192.168.42.1 地址的80端口映射到容器的80端口上,示例:
docker run -itd --name nginx -p 192.168.42.1:80:80 nginx
# 第三種:ip::containerPort 這種是將指定 ip 地址的隨機端口映射到容器的開放端口上,示例:
docker run -itd --name nginx -p 192.168.42.1::80 nginx
# 運行nginx容器,并指定一個nginx數據卷
docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 nginx
# 查看數據卷映射目錄
docker inspect nginx
# 如下結果,查看Mounts里的Source即可。
"Mounts": [
{
"Type": "volume",
"Name": "eab348836a0c996cdf23aea6983cf5601ec4a571b92f9e610aa19f869d09e653",
"Source": "/var/lib/docker/volumes/eab348836a0c996cdf23aea6983cf5601ec4a571b92f9e610aa19f869d09e653/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
上文中對于數據卷的用法還不是最佳方案,一般來說,我們可能需要明確指定將宿主機中的一個目錄掛載到容器中,這種指定方式如下:
docker run -itd --name nginx -v /home/docker/html:/usr/share/nginx/html/ -p 80:80 nginx
這樣便是將宿主機中的 /home/docker/html 目錄掛載到容器的 /usr/share/nginx/html/ 目錄下。接下來只需要在 /home/docker/html 目錄下添加 html 文件,或者修改 html 文件,都能在 nginx 訪問中立馬看到效果。
這種用法對于開發測試非常方便,不用重新部署,重啟容器等。
注意:宿主機地址是一個絕對路徑
如果開發者使用了 Dockerfile 去構建鏡像,也可以在構建鏡像時聲明數據卷,例如下面這樣:
FROM nginx
ADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/
RUN echo "hello docker volume!">/usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html/
這樣就配置了一個匿名數據卷,運行過程中,將數據寫入到 /usr/share/nginx/html/ 目錄中,就可以實現容器存儲層的無狀態變化。
# 采用如下命令
docker volume ls
# 根據 volume name 可以查看數據詳情
docker volume inspect f38d71202a6d55234417cede029dfa465884746c2dd4d4119a40770435950829
# 可以使用 docker volume rm 命令刪除一個數據卷,也可以使用 docker volume prune 批量刪除數據卷,如下:
docker volume rm f38d71202a6d55234417cede029dfa465884746c2dd4d4119a40770435950829
# 或者
docker volume prune
# 批量刪除時,如果未能刪除掉所有的數據卷,因為該數據卷還在使用中,將相關的容器停止并移除,再次刪除數據卷就可以成功刪除了
數據卷容器是一個專門用來掛載數據卷的容器,該容器主要是供其他容器引用和使用。所謂的數據卷容器,實際上就是一個普通的容器,舉例如下:
# 使用如下方式創建數據卷容器:
docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu
# 使用如下命令引用數據卷容器:
docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx
docker run -itd --volumes-from mydata -p 81:80 --name nginx2 nginx
此時, nginx1 和 nginx2 都掛載了同一個數據卷到 /usr/share/nginx/html/ 目錄下,三個容器中,任意一個修改了該目錄下的文件,其他兩個都能看到變化。
此時,使用 docker inspect 命令查看容器的詳情,發現三個容器關于數據卷的描述都是一致的。
docker run --volumes-from mydata --name backupcontainer -v $(pwd):/backup/ ubuntu tar cvf /backup/backup.tar /usr/share/nginx/html/
# 首先使用 --volumes-from 連接待備份容器。
# -v 參數用來將當前目錄掛載到容器的 /backup 目錄下。
# 接下來,將容器中 /usr/share/nginx/html 目錄下的內容備份到 /backup 目錄下的 backup.tar 文件中,由于已經設置將當前目錄映射到容器的 /backup 目錄,因為備份在容器 /backup 目錄下的壓縮文件在當前目錄下可以立馬看到。
備份完成后,在當前目錄下就可以看到 /backup 文件,打開壓縮文件,發現就是 /usr/share/nginx/html 目錄及內容。
# 步驟一:創建容器
# 首先創建一個容器,這個容器就是要使用恢復的數據的容器,這里創建一個 nginx 容器,如下:
docker run -itd -p 80:80 -v /usr/share/nginx/html/ --name nginx3 nginx
# 創建一個名為 nginx3 的容器,并且掛載一個數據卷。
# 步驟二:恢復
# 數據恢復需要一個臨時容器,如下:
docker run --volumes-from nginx3 -v $(pwd):/backup nginx tar xvf /backup/backup.tar
# 命令解釋:
# 首先還是使用 --volumes-from 參數連接上備份容器,即第一步創建出來的 nginx3 。
# 然后將當前目錄映射到容器的 /backup 目錄下。
# 然后執行解壓操作,將 backup.tar 文件解壓。解壓文件位置描述是一個容器內的地址,但是該地址已經映射到宿主機中的當前目錄了,因此這里要解壓縮的文件實際上就是宿主機當前目錄下的文件。
一般來說,容器啟動后,我們都是通過端口映射來使用容器提供的服務,實際上,端口映射只是使用容器服務的一種方式,除了這種方式外,還可以使用容器連接的方式來使用容器服務。
例如,有兩個容器,一個容器運行一個 SpringBoot 項目,另一個容器運行著 mysql 數據庫,可以通過容器連接使 SpringBoot 直接訪問到 Mysql 數據庫,而不必通過端口映射來訪問 mysql 服務。
舉另外一個例子:
有兩個容器,一個 nginx 容器,另一個 ubuntu ,我啟動 nginx 容器,但是并不分配端口映射,然后再啟動 ubuntu ,通過容器連接,在 ubuntu 中訪問 nginx 。
具體操作步驟如下:
docker run -d --name nginx1 nginx
容器啟動成功后,在宿主機中是無法訪問的。如下:
[root@node5 ~]# curl http://localhost:80
curl: (7) Failed connect to localhost:80; Connection refused
接下來,啟動一個 ubuntu ,并且和 nginx 建立連接,如下:
docker run -dit --name ubuntu --link nginx1:mylink ubuntu bash
這里使用 –link 建立連接,nginx1 是要建立連接的容器,后面的 mylink 則是連接的別名。
運行成功后,進入到 ubuntu 命令行:
docker exec -it ubuntu bash
然后,有兩種方式查看 nginx 的信息:
第一種
在 ubuntu 控制臺直接輸入 env ,查看環境變量信息:
MYLINK_ENV_NJS_VERSION=0.3.9
HOSTNAME=96efd0f2f329
MYLINK_PORT=tcp://172.17.0.4:80
MYLINK_NAME=/ubuntu/mylink
PWD=/
MYLINK_PORT_80_TCP=tcp://172.17.0.4:80
MYLINK_PORT_80_TCP_PORT=80
HOME=/root
MYLINK_PORT_80_TCP_PROTO=tcp
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
TERM=xterm
SHLVL=1
MYLINK_PORT_80_TCP_ADDR=172.17.0.4
MYLINK_ENV_PKG_RELEASE=1~buster
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYLINK_ENV_NGINX_VERSION=1.17.10
_=/usr/bin/env
可以看到 docker 為 nginx 創建了一系列環境變量。每個前綴變量是 MYLINK ,這就是剛剛給連接取得別名。開發者可以使用這些環境變量來配置應用程序連接到 nginx 。該連接是安全、私有的。 訪問結果如下:
root@96efd0f2f329:/# curl http://172.17.0.4:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
第二種
另一種方式則是查看 ubuntu 的 hosts 文件: cat /etc/hosts,如下:
root@96efd0f2f329:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 mylink a918eb2fdfbc nginx1
172.17.0.3 96efd0f2f329
可以看到,在 ubuntu 的 hosts 文件中已經給 nginx1 取了幾個別名,可以直接使用這些別名來訪問 nginx1
root@96efd0f2f329:/# curl http://mylink
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
默認情況下,ubuntu 容器中沒有安裝 curl 命令,需要手動安裝下,安裝命令如下: apt-get update apt-get install curl
在實際的開發環境或者生產環境,容器往往都不是獨立運行的,經常需要多個容器一起運行,此時,如果繼續使用 run 命令啟動容器,就會非常不便,在這種情況下,docker-compose 是一個不錯的選擇,使用 docker-compose 可以實現簡單的容器編排,本文就來看看 docker-compose 的使用。
本文以 jpress 這樣一個開源網站的部署為例,向讀者介紹 docker-compose 的使用。jpress 是 Java 版的 wordPress ,不過我們不必關注 jpress 的實現,在這里我們只需要將之當作一個普通的應用即可,完成該項目的部署工作。
步驟一:編寫Dockerfile文件
FROM tomcat
ADD jpress-v3.1.0.war /usr/local/tomcat/webapps/
RUN cd /usr/local/tomcat/webapps/ \
&& mv jpress-v3.1.0.war jpress.war
# 這里要特別注意:jpress-v3.1.0.war文件需要放在和Dockerfile同一個目錄下才可以,否則build時候會報錯。
# 命令解釋如下:
# 1、容器基于 Tomcat 創建。
# 2、下載 jpress 項目的 war 包到 tomcat 的 webapps 目錄下。
# 3、給 jpress 項目重命名。
步驟二:編寫 docker-compose.yml
version: "3.1"
services:
web:
build: .
container_name: jpress
ports:
- "8080:8080"
volumes:
- /usr/local/tomcat/
depends_on:
- db
db:
image: mysql
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123
MYSQL_DATABASE: jpress
# 這里同樣要注意,需要將docker-compose.yml文件放在和Dockerfile文件相同目錄下
# 命令解釋如下:
# 1、首先聲明了 web 容器,然后聲明db容器。
# 2、build . 表示 web 容器項目構建上下文為 . ,即,將在當前目錄下查找 Dockerfile 構建 web 容器。
# 3、container_name 表示容器的名字。
# 4、ports 是指容器的端口映射。
# 5、volumes 表示配置容器的數據卷。
# 6、depends_on 表示該容器依賴于 db 容器,在啟動時,db 容器將先啟動,web 容器后啟動,這只是啟動時機的先后問題,并不是說 web 容器會等 db 容器完全啟動了才會啟動。
# 7、對于 db 容器,則使用 image 來構建,沒有使用 Dockerfile 。
# 8、restart 描述了容器的重啟策略。
# 9、environment 則是啟動容器時的環境變量,這里配置了數據庫 root 用戶的密碼以及在啟動時創建一個名為 jpress 的庫,environment 的配置可以使用字典和數組兩種形式。
步驟三:運行
# 運行命令如下:
docker-compose up -d # -d 表示在后臺運行
步驟四:查看已運行的容器
# 運行命令如下:
docker-compose ps
步驟五:重啟容器
# 運行命令如下:
docker restart jpress # jpress為容器名稱
步驟六:停止容器
# 運行命令如下:
docker-compose down
更多使用命令可以采用 docker-compose --help 來查看幫助進行使用。
特別補充:如果使用docker-compose提示“-bash: docker-compose: command not found”,那么請按照以下說明進行docker-compose安裝即可
# 方式1:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 方式2:
1)先安裝 pip ,檢查是否已有: pip -V
報錯:
-bash: pip: command not found
安裝 pip :
yum -y install epel-release
yum -y install python-pip
#升級
pip install --upgrade pip
2) 安裝Docker-Compose:
pip install docker-compose
檢查是是否成功:
docker-compose -version
可以參考以下鏈接進行詳細學習:
1、Dockerfile 指令詳解
https://yeasy.gitbook.io/docker_practice/image/dockerfile
2、Dockerfile指令詳解 && ENTRYPOINT 指令
https://www.cnblogs.com/reachos/p/8609025.html
命令用途WORKDIRRUN ENTRYPINT CMD執行的工作目錄ENV添加環境變量ADD添加文件,會解壓壓縮包COPY復制文件ONBUILD觸發器VOLUME掛載卷FROM基礎鏡像ENTRYPOINT基礎命令RUN執行命令CMD啟動程序命令,拼接在基礎命令后EXPOSE暴露端口MAINTAINER維護者
1、https://www.runoob.com/docker/docker-tutorial.html
2、http://www.javaboy.org/categories/docker/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。