Docker 基礎介紹及配置安裝 [一]

Docker 基礎介紹及配置安裝 [一]php

Docker 基礎介紹及配置安裝 [一]

Docker
時間:2016年11月2日前端


Docker介紹

  Docker是Docker.lnc公司開源的一個基於LXC技術之上構建的Container容器引擎,源代碼託管在Github上,基於Go語言並聽從Apache2.0協議開源
  Docker是經過內核虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,提升資源利用率java

Docker的三大理念

 構建  運輸   運行node

Docker組成

Docker的組成部分docker相似於cs結構
 Docker Client  
 Docker Server
咱們能夠將docker啓動比喻成Docker server,咱們執行命令的時候至關於Docker client
1.png-90.2kB
2.png-8.7kB
提示:目前的版本是若是docker的服務端掛了,運行在docker上的全部容器都會掛掉linux

Docker組件

鏡像(Image)
容器(Container)
倉庫(Repository)
 
鏡像介紹:相似於虛擬機,做用和虛擬機是同樣的,惟獨是組成部分會有些區別。簡單的說若是咱們想啓動一個容器就必需要有鏡像nginx

容器介紹: docker是經過容器來運行業務的,就像運行一個kvm虛擬機是同樣的。容器其實就是從鏡像建立的一個實例。
  咱們能夠對容器進行增刪改查,容器之間也是相互隔離的。和虛擬機最大的區別就是一個是虛擬的一個是隔離的。
缺點:不會像虛擬機那樣隔離的那麼完全,咱們能夠將容器理解爲簡化版的linux,有進程運行在裏面。git

倉庫介紹: 根據docker的三大理念構建 運輸  運行,咱們就須要一個倉庫來存放鏡像
簡單的說:咱們將鏡像建立完成就須要存放到倉庫裏面,進行集中式的管理。倉庫這點相似於github,docker也有一個dockerhub,他也是一個公共對外的倉庫。github

虛擬機和docker的區別

1.jpg-41.1kB
  簡單解釋,VMware運行在操做系統上,而docker是直接運行在應用上。因此docker沒法提供一個像VMware那樣徹底的隔離,甚至到不少地方都沒有進行隔離,好比說用戶空間。
  這裏能夠解釋一下 若是你用的是centos5版本那你就別想安裝docker了,若是是centos6的你能夠看一眼。由於內核版本比較低,可是若是使用烏班圖就能夠,由於烏班圖的內核更新的比較快。
  若是公司服務器是centos5和centos6 用docker就須要升級內核,相對比較麻煩.web

Docker與OpenStack區別

類別 Docker openstack/KVM
部署男刀 很是簡單 組件多,部署複雜
啓動速度 秒級 分鐘級
執行性能 和物理系統幾乎一致 VM會佔用一些資源
鏡像體積 鏡像是MB級別 虛擬機鏡像GB級別
管理效率 管理簡單 組件相互依賴,管理複雜
隔離性 隔離性高 完全隔離
可管理性 單進程、不建議啓動SSH 完整的系統管理
網絡鏈接 比較弱 藉助Neutron能夠靈活組件各種網絡架構

  提示:在這裏能夠簡單的說一下,有些場景是不適合用到docker。例如我前端web使用docker,此時docker掛掉了,裏面不會像數據庫那樣有數據寫入。這時候我重新起一個docker就能夠了。因此有的場景是不適合使用docker的docker

Docker能幹什麼?

14.png-94.9kB
1、簡化配置
  這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各類配置不同的平 臺(軟件、系統),Docker在下降額外開銷的狀況下提供了一樣的功能。它能讓你將運行環境和配置放在代碼中而後部署,同一個Docker的配置能夠在 不一樣的環境中使用,這樣就下降了硬件要求和應用環境之間耦合度。
  
2、代碼流水線(Code Pipeline)管理
  前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,須要通過不少的中間環境。而每個中間環境都有本身微小的差異,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單很多。

3、提升開發效率
  這就帶來了一些額外的好處:Docker能提高開發者的開發效率。若是你想看一個詳細一點的例子,能夠參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。

  不一樣的開發環境中,咱們都想把兩件事作好。一是咱們想讓開發環境儘可能貼近生產環境,二是咱們想快速搭建開發環境。

  理想狀態中,要達到第一個目標,咱們須要將每個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,咱們卻不想每次都須要網絡連 接,每次從新編譯的時候遠程鏈接上去特別麻煩。這就是Docker作的特別好的地方,開發環境的機器一般內存比較小,以前使用虛擬的時候,咱們常常須要爲 開發環境的機器加內存,而如今Docker能夠輕易的讓幾十個服務在Docker中跑起來。

4、隔離應用
  有不少種緣由會讓你選擇在一個機器上運行不一樣的應用,好比以前提到的提升開發效率的場景等

5、整合服務器
  正如經過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker能夠整合多個服務器以下降成本。因爲沒有多個操做系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker能夠比虛擬機提供更好的服務器整合解決方案
  
6、調試能力
  Docker提供了不少的工具,這些工具不必定只是針對容器,可是卻適用於容器。它們提供了不少的功能,包括能夠爲容器設置檢查點、設置版本和查看兩個容器之間的差異,這些特性能夠幫助調試Bug。你能夠在《Docker拯救世界》的文章中找到這一點的例證。

7、多租戶環境
  另一個Docker有意思的使用場景是在多租戶的應用中,它能夠避免關鍵應用的重寫。咱們一個特別的關於這個場景的 例子是爲IoT(譯者注:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼很是複雜,很難處理,從新規劃這樣一個應用不但消耗時間, 也浪費金錢。

  使用Docker,能夠爲每個租戶的應用層的多個實例建立隔離的環境,這不只簡單並且成本低廉,固然這一切得益於Docker環境的啓動速度和其高效的diff命令。

8、快速部署
  在虛擬機以前,引入新的硬件資源須要消耗幾天的時間。Docker的虛擬化技術將這個時間降到了幾分鐘,Docker只是建立一個容器進程而無需啓動操做系統,這個過程只須要秒級的時間。這正是Google和Facebook都看重的特性。

  你能夠在數據中心建立銷燬資源而無需擔憂從新啓動帶來的開銷。一般數據中心的資源利用率只有30%,經過使用Docker並進行有效的資源分配能夠提升資源的利用率。

小結: 一句話說明docker的本質就是 低開銷(系統文件、內存 共用)的虛擬機

Docker改變了什麼?

面向產品:產品交付
面向開發:簡化環境配置
面向測試:多版本測試
面向運維:環境一致
面向架構:自動化擴容(微服務)

Docker入門安裝

1、環境

[root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@linux-node1 ~]# uname -r3.10.0-327.36.2.el7.x86_64

2、安裝

[root@linux-node1 ~]# yum install dockerLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comPackage docker-1.10.3-46.el7.centos.14.x86_64 already installed and latest versionNothing to do

  Centos7默認安裝docker1.10,咱們能夠經過官方的yum源安裝docker1.12

Docker官網:http://www.docker.com/
最新版本咱們能夠去官方網站進行下載。

舒適提示:使用docker最好使用最新版,由於功能比較完善。

3、啓動

[root@linux-node1 ~]# systemctl start docker啓動以後咱們能夠查看一下docker的狀態[root@linux-node1 ~]# systemctl status docker● docker.service - Docker Application Container Engine   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)   Active: active (running) since Wed 2016-10-19 02:32:37 CST; 3h 54min ago     Docs: http://docs.docker.com Main PID: 31807 (docker-current)   CGroup: /system.slice/docker.service           └─31807 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journaldOct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.832703497+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.840719984+08:00" level=warning msg="Running modprobe bridge br_netfilter failed with message: m...Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.854022259+08:00" level=info msg="Firewalld running: false"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.908314481+08:00" level=info msg="Default bridge (docker0) is assigned with an IP addr...P address"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967870654+08:00" level=info msg="Loading containers: start."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967930460+08:00" level=info msg="Loading containers: done."Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967937814+08:00" level=info msg="Daemon has completed initialization"Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.967961305+08:00" level=info msg="Docker daemon" commit=cb079f6-unsupported execdriver...ion=1.10.3Oct 19 02:32:37 linux-node1.abcdocker.com systemd[1]: Started Docker Application Container Engine.Oct 19 02:32:37 linux-node1.abcdocker.com docker-current[31807]: time="2016-10-19T02:32:37.972026130+08:00" level=info msg="API listen on /var/run/docker.sock"Hint: Some lines were ellipsized, use -l to show in full.

咱們可使用ifconfig查看網卡

[root@linux-node1 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0        ether 02:42:c5:44:7d:3b  txqueuelen 0  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.56.11  netmask 255.255.255.0  broadcast 192.168.56.255        inet6 fe80::20c:29ff:fef4:affe  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:f4:af:fe  txqueuelen 1000  (Ethernet)        RX packets 167717  bytes 175534600 (167.4 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 69646  bytes 12187530 (11.6 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        inet6 ::1  prefixlen 128  scopeid 0x10<host>        loop  txqueuelen 0  (Local Loopback)        RX packets 2322  bytes 247665 (241.8 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 2322  bytes 247665 (241.8 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

提示: 咱們啓動docker的時候,docker會幫咱們建立一個docker 0的網橋

4、Docker基礎命令

查看當前鏡像
docker p_w_picpaths

[root@linux-node1 ~]# docker p_w_picpathsREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

搜索鏡像
docker search [鏡像名字]
執行docker search centos 會從dockerhub上搜索鏡像

[root@linux-node1 ~]# docker search centosINDEX       NAME                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDdocker.io   docker.io/centos                          The official build of CentOS.                   2757      [OK]       docker.io   docker.io/ansible/centos7-ansible         Ansible on Centos7                              90                   [OK]docker.io   docker.io/jdeathe/centos-ssh              CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8...   42                   [OK]docker.io   docker.io/jdeathe/centos-ssh-apache-php   CentOS-6 6.8 x86_64 / Apache / PHP / PHP M...   21                   [OK]docker.io   docker.io/nimmis/java-centos              This is docker p_w_picpaths of CentOS 7 with dif...   17                   [OK]docker.io   docker.io/gluster/gluster-centos          Official GlusterFS Image [ CentOS7 +  Glus...   12                   [OK]docker.io   docker.io/million12/centos-supervisor     Base CentOS-7 with supervisord launcher, h...   12                   [OK]docker.io   docker.io/torusware/speedus-centos        Always updated official CentOS docker imag...   8                    [OK]docker.io   docker.io/nickistre/centos-lamp           LAMP on centos setup                            7                    [OK]docker.io   docker.io/kinogmt/centos-ssh              CentOS with SSH                                 6                    [OK]docker.io   docker.io/nathonfowlie/centos-jre         Latest CentOS p_w_picpath with the JRE pre-insta...   4                    [OK]docker.io   docker.io/centos/mariadb55-centos7                                                        3                    [OK]docker.io   docker.io/consol/sakuli-centos-xfce       Sakuli JavaScript based end-2-end testing ...   2                    [OK]docker.io   docker.io/blacklabelops/centos            CentOS Base Image! Built and Updates Daily!     1                    [OK]docker.io   docker.io/darksheer/centos                Base Centos Image -- Updated hourly             1                    [OK]docker.io   docker.io/harisekhon/centos-java          Java on CentOS (OpenJDK, tags jre/jdk7-8)       1                    [OK]docker.io   docker.io/harisekhon/centos-scala         Scala + CentOS (OpenJDK tags 2.10-jre7 - 2...   1                    [OK]docker.io   docker.io/timhughes/centos                Centos with systemd installed and running       1                    [OK]docker.io   docker.io/grayzone/centos                 auto build for centos.                          0                    [OK]docker.io   docker.io/januswel/centos                 yum update-ed CentOS p_w_picpath                      0                    [OK]docker.io   docker.io/labengine/centos                Centos p_w_picpath base                               0                    [OK]docker.io   docker.io/repositoryjp/centos             Docker Image for CentOS.                        0                    [OK]docker.io   docker.io/smartentry/centos               centos with smartentry                          0                    [OK]docker.io   docker.io/ustclug/centos                   USTC centos                                    0                    [OK]docker.io   docker.io/vcatechnology/centos            A CentOS Image which is updated daily           0                    [OK]

下載鏡像
 咱們可使用docker pull centos    docker pull nginx來安裝centos和nginx的鏡像

導出鏡像
docker save -o [鏡像名稱] [鏡像]

[root@linux-node1 ~]# docker save -o centos.tar centos[root@linux-node1 ~]# lsanaconda-ks.cfg  centos.tar須要將docker導出爲tar,後面爲鏡像名稱

導入鏡像

[root@linux-node1 ~]#docker load --input centos.tar   #使用input導入[root@linux-node1 ~]# docker load < nginx.tar       #使用重定向導入

刪除鏡像
docker刪除可使用docker rmi 後面加上docker的ID
例如:
3.png-30.3kB
提示:若是鏡像已經建立了一個容器,那麼將沒法進行刪除

刪除容器:

[root@linux-node1 ~]# docker rm abcdocker或者使用[root@linux-node1 ~]# docker rm -f abcdocker

第二種會提示容器在將它關閉

docker另外一種刪除方式
啓動一個容器  echo 完就刪除

[root@linux-node1 ~]# docker run --rm centos /bin/echo "www.abcdocker.com"www.abcdocker.com[root@linux-node1 ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMESf974696a121a        centos              "/bin/bash"         2 minutes ago       Up About a minute                            abcdockerbcededa4b82c        centos              "/bin/echo hello"   6 hours ago         Exited (0) 4 hours ago                       awesome_dijkstra

啓動容器
docker run [鏡像]

[root@linux-node1 ~]# docker run centoscentos是鏡像的名稱,鏡像的名稱必須在選項的後面

啓動鏡像,輸入Hello,並關閉

[root@linux-node1 ~]# docker run centos /bin/echo 'Hello Wordl

  本命令的意思是啓動一個docker進程,並echo 執行後面的命令能夠有能夠沒有(hello),若是咱們的鏡像啓動就會執行一個進程就不須要咱們輸入

查看啓動鏡像
docker ps -a
ps是顯示正在運行的容器 -a是顯示不運行的

[root@linux-node1 ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMESbcededa4b82c        centos              "/bin/echo hello"   32 seconds ago      Exited (0) 32 seconds ago                       awesome_dijkstra

 咱們能夠看到,如今容器並無啓動。由於docker啓動須要在前臺啓動一個進程。容器的名稱能夠咱們指定或自動生成

提示: 管理docker容器能夠經過名稱也能夠經過ID

5、Docker管理案例

  例如:我要新建一個abcdocker的容器,它的鏡像是centos.他有三個參數,第一個是給容器起一個名稱,-t 分配一個僞終端(tty)-i標準輸入打開,我要在裏面輸入命令

[root@linux-node1 ~]# docker run --name abcdocker -t -i centos /bin/bash--name  容器的名稱-t       讓docker分配一個僞終端-i       讓docker的標準輸入打開{input}

提示:最後的/bin/bash能夠省略,可是最後一個若是不是命令,那就是鏡像的名稱

輸入上方的命令以後會直接進入到容器裏面

[root@f8c8c8156e26 /]# ps auxUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.1  11752  1920 ?        Ss   19:38   0:00 /bin/bashroot         18  0.0  0.0  47424  1660 ?        R+   21:32   0:00 ps aux[root@f8c8c8156e26 /]#

舒適提示:容器不是一個虛擬機,由於他就是一個進程,若是咱們退出,這個進程就退出了。
  若是咱們執行建立容器的時候,裏面沒有咱們指定的鏡像,那麼他會從dockerhub上進行下載而後在啓動

容器啓動
咱們經過docker ps -a 能夠查看到沒有啓動的容器
 使用docker start [名稱或PORTS]

[root@linux-node1 ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMESf8c8c8156e26        centos              "/bin/bash"         2 hours ago         Exited (0) 34 minutes ago                       abcdockerbcededa4b82c        centos              "/bin/echo hello"   2 hours ago         Exited (0) 2 hours ago                          awesome_dijkstra[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker start bcededa4b82cbcededa4b82c

進入容器

[root@linux-node1 ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMESf8c8c8156e26        centos              "/bin/bash"         2 hours ago         Up 24 minutes                                   abcdockerbcededa4b82c        centos              "/bin/echo hello"   3 hours ago         Exited (0) 23 minutes ago                       awesome_dijkstra[root@linux-node1 ~]# docker attach abcdocker[root@f8c8c8156e26 /]# ps auxUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.1  11776  1872 ?        Ss   22:09   0:00 /bin/bashroot         14  0.0  0.0  47424  1660 ?        R+   22:33   0:00 ps aux

  這樣進入容器的缺點就是若是在開一個窗口就會同步操做,相似於單用戶模式(windows遠程桌面)

提示:生產場景是不使用docker attach的,須要咱們使用nsenter這個工具,這個工具包含在util-linux軟件包裏面

[root@linux-node1 ~]# yum install util-linux -y Centos7默認最小化已經安裝

  咱們經過nsenter就能夠進入容器,可是nsenter是經過pid進入容器裏,因此咱們須要知道容器的pid。咱們能夠經過docker inspect來獲取到pid

[root@linux-node1 ~]# docker start abcdockerabcdocker[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" abcdocker37434[root@linux-node1 ~]# nsenter -t 37434 -m -u -i -n -p

docker inspect -f ``.`State`.`Pid`容器名或者容器id
#每個容器都有.State.Pid,因此這個命令除了容器的id須要咱們根據docker ps -a去查找,其餘的所有爲固定的格式
nsenter --target上面查到的進程id --mount --uts --ipc --net --pid  #輸入該命令便進入到容器中

解釋nsenter指令中進程id以後的參數的含義:

* –mount參數是進去到mount namespace中 * –uts參數是進入到uts namespace中 * –ipc參數是進入到System V IPC namaspace中 * –net參數是進入到network namespace中 * –pid參數是進入到pid namespace中 * –user參數是進入到user namespace中

更多參數咱們能夠經過nsenter --help進行獲取

咱們進入容器中查看進程
如下是以nsenter啓動的進程

[root@f8c8c8156e26 /]# ps auxUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.0  11776  1664 ?        Ss+  Oct18   0:00 /bin/bashroot         27  0.0  0.1  13376  1984 ?        S    Oct18   0:00 -bashroot         40  0.0  0.0  49024  1808 ?        R+   00:11   0:00 ps aux

/bin/bash是咱們運行容器產生的進程
-bash   是咱們使用nsenter產生的,這樣若是咱們退出容器,容器就不會退出,由於-bash還在運行

[root@f8c8c8156e26 /]# exitlogout[root@linux-node1 ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESf8c8c8156e26        centos              "/bin/bash"         4 hours ago         Up 48 minutes                           abcdocker

  由於每次進入容器都須要輸入那兩條命令,因此咱們能夠寫一個腳原本獲取。
腳本內容以下:

[root@linux-node1 ~]# cat docker_in.sh #!/bin/bash# Use nsenter to access dockerdocker_in(){  NAME_ID=$1  PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)  nsenter -t $PID -m -u -i -n -p}docker_in $1

執行結果以下:

[root@linux-node1 ~]# chmod +x docker_in.sh [root@linux-node1 ~]# ./docker_in.sh abcdocker[root@f8c8c8156e26 /]# ps -efUID         PID   PPID  C STIME TTY          TIME CMDroot          1      0  0 Oct18 ?        00:00:00 /bin/bashroot         54      0  0 00:23 ?        00:00:00 -bashroot         67     54  0 00:23 ?        00:00:00 ps -ef[root@f8c8c8156e26 /]#

咱們也能夠不進入容器進行查看

[root@linux-node1 ~]# docker exec  abcdocker ps -efUID         PID   PPID  C STIME TTY          TIME CMDroot          1      0  0 Oct18 ?        00:00:00 /bin/bashroot         85      0  0 00:28 ?        00:00:00 ps -ef[root@linux-node1 ~]# docker exec  abcdocker ls /anaconda-post.logbindev

提示:可使用exec參數,不進入容器查看內容

咱們還可使用exec進入docker容器中

[root@linux-node1 ~]# docker exec -it abcdocker /bin/bash

  可是最好仍是少使用exec,有可能會對容器形成一些意外的影響

請點擊下一章     

相關文章
相關標籤/搜索