主頁 > 後端開發 > docker常用命令

docker常用命令

2023-04-24 07:44:44 後端開發

一、Docker基本概念

1.鏡像(Image)

Docker 鏡像 是一個特殊的檔案系統,除了提供容器運行時所需的程式、庫、資源、配置等檔案外,還包含了一些為運行時準備的一些配置引數(如匿名卷、環境變數、用戶等),鏡像 不包含 任何動態資料,其內容在構建之后也不會被改變,

docker的鏡像是由 鏡像名+版本 組成的,如果沒有指定鏡像名沒有指定版本,默認是latest版本最新版本,

2.容器(Container)

鏡像(Image)和容器(Container)的關系,就像是面向物件程式設計中的 類 和 實體 一樣,鏡像是靜態的定義,容器是鏡像運行時的物體,

3.倉庫(Repository)

鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存盤、分發鏡像的服務,Docker Registry 就是這樣的服務,一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像,

4.卷(volume)

資料卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
資料卷 可以在容器之間共享和重用
對 資料卷 的修改會立馬生效
對 資料卷 的更新,不會影響鏡像
資料卷 默認會一直存在,即使容器被洗掉

5.網路(network)

容器中可以運行一些網路應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 引數來指定埠映射,

6.docker-compose

Compose 專案是 Docker 官方的開源專案,負責實作對 Docker 容器集群的快速編排,目前 Docker 官方用 GO 語言 重寫 了 Docker Compose,并將其作為了 docker cli 的子命令,稱為 Compose V2
Compose 中有兩個重要的概念:
服務 (service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實體,
專案 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 檔案中定義,

二、Docker 常用命令

2.1鏡像命令

下載鏡像
docker pull nginx //下載鏡像
docker pull nginx:v1.4.14

運行鏡像
docker run -it nginx //運行鏡像
docker run -it --rm ubuntu:18.04 bash // 運行鏡像并進入shell 退出后洗掉鏡像
docker run --name webserver -d -p 80:80 nginx // 運行鏡像,--name 給鏡像取一個名字 -d 后臺運行模式 -p 鏡像埠映射

鏡像幫助資訊
docker image --help // 獲取鏡像操作的命令幫助

搜索鏡像
docker search nginx // 搜索nginx鏡像

查看鏡像歷史資訊
docker image history nginx // 查看鏡像歷史

查看鏡像詳細資訊
docker image inspect nginx //查看鏡像詳細資訊

列出鏡像
docker images //列出鏡像
docker image ls //列出鏡像
docker image ls -a //docker image ls 命令串列中只顯示頂層鏡像,-a 引數可以顯示包括中間層在內的所有鏡像
docker image ls nginx //根據倉庫名列出鏡像
docker image ls nginx:v2 //根據某個特定標簽列出鏡像
docker image ls -f since=mongo:3.2 //mongo:3.2 之后建立的鏡像 before 之前
docker image ls -f label=dev //列出標簽是dev的鏡像
docker images -q -f reference='eshop/*:dev' // 根據名稱和標簽匹配并只顯示id
docker image ls --format "{{.ID}}: {{.Repository}}" // 模板語法

查看鏡像、容器、資料卷大小
docker system df //查看鏡像、容器、資料卷所占的空間大小

洗掉鏡像
docker image rm centos:v7 // 按照標簽tag洗掉鏡像,也可以根據image id洗掉
//洗掉鏡像的前提是該鏡像沒有運行成容器;docker image rm 等同docker rmi命令;如果需要強行洗掉已經運行為容器的鏡像,可以使用-f選項來指定;
docker image rm af34 //根據ID洗掉鏡像,一般取前3個字符或以上就可以了
docker image rm $(docker image ls -q nginx) //過濾洗掉命令,洗掉所有倉庫名為 nginx 的鏡像
docker image rm $(docker image ls -q -f before=nginx:v2)  
docker image rm $(docker images -q -f reference='eshop/*:dev') //-f
docker image prune //洗掉虛懸鏡像

給鏡像打tag
docker tag centos centos:v6.7 //給鏡像打標簽 tag

2.2容器命令

新建并啟動容器
docker run ... //新建并啟動容器命令
docker run centos:v7 /bin/echo 'Hello World' //輸出一個 'Hello World'之后終止容器
docker run -t -i centos:v7 /bin/bash // 啟動一個bash端,允許用戶進行互動,-t 讓Docker分配一個偽終端(pesudo-tty)并系結到容器的標準輸入上,-i 讓容器的標準輸入保持打開
docker run -d centos:v7 /bin/sh -c "while true;do echo 11;sleep 1; done" //-d 在后臺運行
//提示:可以用 docker logs 查看輸出的結果

查看容器本身的資訊
docker container ls // 查看容器資訊
docker container ls -a

查看容器日志資訊
docker container logs //獲取容器的log輸出資訊
docker container logs [container ID or NAMES]

查看容器層改變
docker diff name

終止和啟動容器
docker container stop // 終止一個運行中的容器
docker container ls -a // 可以查看容器終止的狀態資訊
docker container start //啟動一個已經終止的容器
docker container restart // 將一個運行態的容器終止,然后重新啟動

進入容器 docker attach 或 docker exec
docker run -dit centos
docker container ls
docker attach a12f // a12f 容器ID的前4個字符
docker exec -it 34af bash // -i 這個引數沒有分配偽終端但是保持了標準輸出,-t 分配一個偽終端
exec與attach兩者區別:attach 不會啟動新的行程,用exit退出容器跟著停止,exec啟動新的行程,exit退出容器不會停止,

匯出容器
docker export r1dfdere112122 > centos.tar //r1dfdere112122 容器ID

匯入容器快照
cat centos.tar | docker import - test/centos:v1.0 //本地匯入
docker import URL //通過指定的url匯入

從容器內拷貝檔案到主機上 (注:如果是在容器內,需要exit先切換到宿主機上)
docker cp 容器id:容器內路徑 目的主機路徑 (例如:docker cp 123123:/data/test.txt /data  id為123123的容器,將/data/test.txt檔案拷貝到宿主機/data目錄下)

洗掉容器
docker container rm 洗掉一個處于終止狀態的容器
docker container rm centos
//提示:如果要洗掉一個運行中的容器,需要添加引數 -f 引數, 這時,docker 會發送 SIGKILL 信號給容器,

清理所有終止狀態的容器
docker container ls -a // 查看所有已經創建包括終止狀態的容器
docker container prune // 清除所有的容器

2.3 倉庫命令

你可以使用官方 registry 鏡像來運行
docker run -d -p 5000:5000 --restart=always --name registry registry
這將使用官方的 registry 鏡像來啟動私有倉庫,默認情況下,倉庫會被創建在容器的 /var/lib/registry 目錄下,你可以通過 -v 引數來將鏡像檔案存放在本地的指定路徑,例如下面的例子將上傳的鏡像放到本地的 /opt/data/registry 目錄,
docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry

2.4 資料卷命令

創建資料卷
docker volume create first-volume

查看所有的資料卷
docker volume ls

查看某一資料卷資訊
docker volume inspect first-volume

掛載資料卷的容器
docker run -d -P \
--name web \
#-v first-volume:/webapp \ // -v 引數掛載
--mount source=first-volumn, target=/webapp \
training/webapp \
python app.py

//創建一個名為web的容器,并掛載資料卷到容器的 /webapp 目錄

查看資料卷資訊
docker inspect web

洗掉資料卷
docker volumn rm first-volumn

資料卷 是被設計用來持久化資料的,它的生命周期獨立于容器,Docker不會在容器被洗掉后自動洗掉資料庫,也不存在垃圾回識訓制處理沒有任何容器參考的資料卷,
如果要在洗掉容器時候洗掉資料就,可以在洗掉容器時候使用 docker rm -v 這個命令

清除資料卷
docker volume prune // 清除無主的資料卷

--mount 可以掛載一個本地主機目錄導容器中去

docker run -d -P \
--name web \
--mount type=bind, source=/src/webapp, target=/opt/webapp \
training/webapp \
python app.py
//上面的命令就是掛在主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄,

2.5網路命令

埠系結 引數:
-P(大寫) :Docker會隨機映射一個 49000-49900 的埠到內部容器開發的網路埠
-p(小寫) : 自定義埠映射

映射隨機埠:
docker run -d -P training/webapp python app.py

docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse

//本地主機的 49155 被映射到了容器的5000埠,此時訪問本機的49155埠即可訪問容器內web應用提供的界面

查看應用資訊
docker logs -f nostalgic_morse

自定義埠映射
docker run -d -p 5000:5000 training/webapp python app.py
// 默認把本機所有地址的映射到5000埠上

自定義指定地址的埠:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

自定義地址的任意埠
docker run -d -p 127.0.0.1::5000 training/webapp python app.py

指定udp埠
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射埠配置 docker port
docker port nostalgic_morse 5000

系結多個埠 -p
docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py

容器互連
一般使用docker,會使用 --link 來使容器互連,
現在則可以使用 -d 引數來指定docker的網路型別,docker網路型別有 bridge,overlay,

創建新的docker網路
docker network create -d bridge first-net

連接容器
docker run -it --rm --name busybox1 --network first-net busybox sh
// 打開新的終端,在運行一個容器并加入 first-net 網路
docker run -it --rm --name busybox2 --network first-net busybox sh
// 在打開一個終端查看容器資訊
docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1

// 用ping命令證明容器busybox1和容器busybox2建立了互連關系
// 進入 busybox1 容器,然后輸入以下命令

ping buxybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

三、docker-compose 常用命令

compose V2 新增的命令
將檔案從服務容器復制到本地檔案系統
docker compose cp my-service:~/path/to/myfile ~/local/path/to/copied/file 
從本地檔案復制到所有正在運行的容器中
docker compose cp --all ~/local/path/to/source/file my-service:~/path/to/copied/file
docker compose ls --all --format json // 輸出json格式

獲得一個命令的幫助
docker-compose 命令 --help

構建并啟動所有容器,如果鏡像存在就重新構建
docker-compose up -d --build

啟動所有服務
docker-compose up -d

構建啟動nignx容器
docker-compose up -d nginx

-f 指定使用的Compose組態檔啟動,默認為docker-compose.yml,可以多次指定,
docker-compose -f docker-compose.yml up -d

運行一個服務,并在服務上執行一個命令
docker-compose run 容器id或容器名 ip addr

登錄到nginx容器中
docker-compose exec nginx bash

此命令將會停止 up 命令所啟動的容器,并移除網路
docker-compose down

列出專案中運行的所有容器
docker-compose ps

列出專案中運行及未運行的所有容器
docker-compose ps -a

列出所有運行的服務容器
docker-compose ls

列出所有服務容器(包括未運行的容器)
docker-compose ls -a

重新啟動nginx容器
docker-compose restart nginx

構建鏡像
docker-compose build nginx

不帶快取的構建
docker-compose build --no-cache nginx

查看各個服務容器內運行的行程
docker-compose top

查看nginx的實時日志
docker-compose logs -f nginx

列出 Compose 檔案包含的鏡像
docker-compose images

驗證檔案配置,當配置正確時,不輸出任何內容,當檔案配置錯誤,輸出錯誤資訊,
docker-compose config

以json的形式輸出nginx的docker日志
docker-compose events --json nginx

暫停nignx容器
docker-compose pause nginx

恢復ningx容器
docker-compose unpause nginx

洗掉容器(洗掉前必須關閉容器,執行stop)
docker-compose rm nginx

強制洗掉容器(不必先關閉容器)
docker-compose rm -f nginx

停止nignx容器
docker-compose stop nginx

啟動nignx容器
docker-compose start nginx

重啟專案中的nignx容器
docker-compose restart nginx

下載依賴的鏡像
docker-compose pull

推送服務依的鏡像
docker-compose push

設定指定服務運行的容器個數,通過service=num的引數來設定數量
docker-compose scale web=3 db=2

查看版本資訊
docker-compose version
四、其他常用命令
//docker-desktop: 存盤在 %LOCALAPPDATA%\Docker\wsl\distro
//docker-desktop-data: 存盤在 %LOCALAPPDATA%\Docker\wsl\data(占用空間的元兇)
用WSL命令遷移docker-desktop-data到其他位置
wsl --shutdown
關閉所有發行版: wsl --shutdown
匯出 docker-desktop-data 發行版: wsl --export docker-desktop-data D:\wsl\docker\docker-desktop-data\data.tar
注銷 docker-desktop-data 發行版: wsl --unregister docker-desktop-data
匯入 docker-desktop-data 到期望遷移的目錄: wsl --import docker-desktop-data D:\wsl\docker\docker-desktop-data\ D:\wsl\dockerdocker-desktop-data\data.tar

將Windows上已經存在的檔案移植到wsl下Ubuntu的docker container中去
// sudo passwd root 給root用戶設定密碼,su -
cp -r /mnt/d/專案檔案 /home/存放目錄
docker ps --no-trunc //顯示container的ID全稱 
docker cp /home/存放目錄 container id:/home

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550920.html

標籤:其他

上一篇:springboot~關于md5簽名引發的問題

下一篇:返回列表

標籤雲
其他(157903) Python(38094) JavaScript(25383) Java(17988) C(15215) 區塊鏈(8258) C#(7972) AI(7469) 爪哇(7425) MySQL(7137) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4558) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2430) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1959) Web開發(1951) HtmlCss(1921) python-3.x(1918) 弹簧靴(1913) C++(1910) xml(1889) PostgreSQL(1872) .NETCore(1854) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • docker常用命令

    #一、Docker基本概念 ###1.鏡像(Image) Docker 鏡像 是一個特殊的檔案系統,除了提供容器運行時所需的程式、庫、資源、配置等檔案外,還包含了一些為運行時準備的一些配置引數(如匿名卷、環境變數、用戶等)。鏡像 不包含 任何動態資料,其內容在構建之后也不會被改變。 docker的鏡 ......

    uj5u.com 2023-04-24 07:44:44 more
  • springboot~關于md5簽名引發的問題

    事實是這樣的,我有個介面,這個介面不能被篡改,于是想到了比較簡單的md5對url地址引數進行加密,把這個密碼當成是sign,然后服務端收到請求后,使用相同演算法也生成sign,兩個sign相同就正常沒有被篡改過。 問題的出現 介面中的引數包括userId,extUserId,時間,其中extUserI ......

    uj5u.com 2023-04-24 07:44:38 more
  • Java中代碼的執行順序

    結論 注意 只有顯式的加載類 JVM才會加載到記憶體中 先加載父類的靜態代碼塊 然后執行子類靜態代碼塊 當前類存在類靜態變數注意參考型別沒進行賦值操作初始化為null 并不會顯式的加載類又存在靜態代碼塊 會先執行前者進行初始化 再執行靜態代碼塊 在實體化類的時候 執行順序 構造代碼塊-->構造方法存在 ......

    uj5u.com 2023-04-24 07:44:33 more
  • Nginx配置跨域,覆寫后端服務跨域配置

    本篇文章主要介紹了,如何通過Nginx配置跨域,并覆寫后端服務跨域配置。 先看下后端代碼跨域配置: 主要的目標是:不修改后端跨域配置代碼,來實作Nginx跨域指定域名。 @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigur ......

    uj5u.com 2023-04-24 07:44:29 more
  • Maven的使用

    Maven 1.下載并配置 下載地址:https://maven.apache.org/download.cgi?. 配置環境變數 新建系統變數,變數名為MAVEN_HOME,變數值為 maven 的安裝路徑 編輯名為Path的系統變數,然后點擊新建,輸入 %MAVEN_HOME%\bin 配置完成 ......

    uj5u.com 2023-04-24 07:44:14 more
  • Go語言上手(三) | 青訓營筆記

    高質量編程簡介及編碼規范 高質量: 各種邊界條件考慮完備 例外情況處理,穩定性 易讀易維護 編程原則 簡單性 可讀性 生產力 編碼規范 公共符號始終要注釋 例外:實作介面的方法不需要注釋 格式化 使用gofmt(官方工具)自動格式化 注釋 代碼作用(適合公共符號) 代碼如何實作 (適合注釋實作程序) ......

    uj5u.com 2023-04-24 07:44:05 more
  • CAS的service引數驗證

    CAS登錄成功后會跳轉到service引數提供的url,目前系統中這個引數是沒有任何驗證的,service引數隨便賦一個網址就可以。為安全起見現在對這個service要作一下限制,比如只能是同源url才可以重定向。 下面是基于CAS 3.5.2對系統的改造程序。 系統比較老舊,之前也作過CAS方面的 ......

    uj5u.com 2023-04-24 07:44:00 more
  • Go語言入門10(例外處理)

    例外處理 panic 例外處理 ? 如果出現了panic例外,那么會停止當前函式的運行,然后會找recover()方法,如果沒有的話,就會報錯退出程式,如果有就會執行recover的方法體中的方法 ? 我們可以使用defer延遲處理函式來捕獲panic例外,用recover()來從錯誤場景中恢復,必 ......

    uj5u.com 2023-04-24 07:43:56 more
  • NGINX 備忘清單_開發速查表分享

    NGINX 備忘清單 Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器 ,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,公開版本1.19.6發布于2020年12月1 ......

    uj5u.com 2023-04-24 07:43:52 more
  • Django筆記二十九之中間件介紹

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十九之中間件介紹 這一節介紹一下 Django 的中間件。 關于中間件,官方檔案的解釋為:中間件是一個嵌入 Django 系統的 request 和 response 的鉤子框架,是一個能夠全域改變 Django 輸入/輸出的系統。 我 ......

    uj5u.com 2023-04-24 07:38:04 more