自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么,容器太多操作不過來?我選擇Docker Compose梭哈

系統(tǒng)
docker-compose是針對多Dockerfile的自動化腳本,他幫我們處理容器之間的依賴關(guān)系和其他需要人為干涉的操作。

一、容器之間通信

1、單向通信

1.1、什么意思

mysql和tomcat是兩個獨立的容器,但是tomcat需要和mysql通信,而mysql完全不用和tomcat通信,這就叫容器之間的單向通信。

1.2、怎么通信

要談通信,就需要談一下ip,因為不知道ip是無法通信的。最簡單的例子你jdbc要連接mysql數(shù)據(jù)庫,你也需要配置mysql的ip地址。容器之間也不例外,都是靠虛擬ip來完成的。

何為虛擬ip?

虛擬ip:容器創(chuàng)建完成后都會生成一個唯一的ip,這個ip外界不能直接訪問,他只用于容器之間進行通信交互用。這就是虛擬ip。

容器之間的虛擬ip是互通的。

通信是什么意思、靠什么通信我們都知道了,那還不抓緊實戰(zhàn)一把?

1.3、實戰(zhàn)演示

1.3.1、創(chuàng)建tomcat容器 

  1. docker run -d --name mytomcat tomcat  
  2. # --name指定的名稱再docker ps里是可以看到的,最后一列Name  
  3. docker ps 

知識點出現(xiàn)了?。?!--name是神馬鬼?先看如下一個場景

在公司或者你直接買的阿里云數(shù)據(jù)庫/redis等服務(wù)為什么給你個數(shù)據(jù)庫域名而不是推薦用ip?因為ip的話可變,比如你業(yè)務(wù)系統(tǒng)寫死了ip,這時候人家那邊內(nèi)網(wǎng)ip變了,你這所有用這個數(shù)據(jù)庫的業(yè)務(wù)系統(tǒng)都要跟著改。用域名的話一勞永逸,底層ip變了后再映射到新域名上就行,不影響業(yè)務(wù)系統(tǒng)。

--name就是給docker配置名稱來與虛擬ip做映射,因為ip老變化,每次變化的時候其他容器都需要跟著改動才行。配個名稱一勞永逸。創(chuàng)建容器的時候通過 --name xxx 即可指定。

1.3.2、創(chuàng)建mysql容器

我也沒拉取mysql鏡像,就用centos模擬一下數(shù)據(jù)庫吧,主要是看能不能ping 通,能ping 通就代表能通信。 

  1. docker run -d --name database -it centos /bin/bash 

1.3.3、小試一把

我們需要進入mytomcat的容器然后去ping database的ip看看是否通,那么容器的虛擬ip怎么查呢? 

  1. # 這又是一個知識點  
  2. docker inspect 容器id  
  3. # 比如:(9bf58b4014dd是我們database的容器id)  
  4. docker inspect 9bf58b4014dd 

現(xiàn)在知道數(shù)據(jù)庫的ip了,那趕緊進入我們的mytomcat的容器去ping一波 

  1. docker exec -it mytomcat /bin/bash  
  2. ping 172.17.0.6 

完美!

等等,貌似不是很完美,我們給數(shù)據(jù)庫指定了名稱database,那我們趕緊ping database 試一下。結(jié)果啪啪啪打臉,完全不通,那是因為相當于你就起了個名字,并沒有做映射。那怎么映射呢?mytomcat啟動容器的時候指定一個--link參數(shù)即可。 

  1. # 強制刪除老的  
  2. docker rm -f mytomcat  
  3. # 創(chuàng)建新的容器,用--link指定我們想連的配置的數(shù)據(jù)庫“域名”  
  4. docker run -d --name mytomcat --link database tomcat  
  5. # 進入mytomcat容器  
  6. docker exec -it mytomcat /bin/bash  
  7. # ping  
  8. ping database 

這次是真的完美~!

1.4、總結(jié)

  •  容器簡單虛擬ip是互通的
  •  用--name 和 --link可以完成自定義“域名”來取代可變化的ip

2、雙向通信

方式有很多,一般都采取橋接方式。由于篇幅過長,自行Google即可。重點搞懂了容器間的通信是什么意思,大概怎么做即可。比如上面的--link也是其一做法。

二、容器間數(shù)據(jù)共享

1、場景

需要宿主機和容器之間共享數(shù)據(jù)的業(yè)務(wù)場景。比如Mysql的

比如:集群部署的時候,我們的應(yīng)用程序需要部署到10個docker容器里,那么比如要想改動一個文件的內(nèi)容,就要重新打包然后部署10次。我們可以將我們需要部署的應(yīng)用程序掛載到宿主機上,這樣改一處就行了。比如靜態(tài)html文件,再一個宿主機上啟動了10個容器,這時候需求需要改文案(修改html),我們需要修改10個容器里的html,過于麻煩,所以可以把這個html掛載到宿主機,容器直接使用掛載到宿主機的文件即可。

再比如:Mysql的數(shù)據(jù)目錄可配置文件(一些高級配置或者優(yōu)化配置啥的肯定要用一份),這也可以用此場景。

2、語法 

  1. # 語法  
  2. docker run -v 宿主機路徑:容器內(nèi)掛載路徑 鏡像名  
  3. # 比如如下:他會把/home/main/programe下面的所有目錄都掛載到容器的/usr/local/tomcat/webapps下  
  4. docker run -v /home/main/programe:/usr/local/tomcat/webapps tomcat 

3、實戰(zhàn)

3.1、準備

在如下目錄里創(chuàng)建如下文件,并寫上Hello Volumn~ 

  1. /home/main/docker/webapps/volumn-test/index.html 

3.2、操作

很簡單,按照上面的語法來就成了,如下就是將/home/main/docker/webapps下的目錄掛載到容器內(nèi)部/usr/local/tomcat/webapps的目錄下 

  1. docker run --name t2 -d -p 8200:8080 -v /home/main/docker/webapps:/usr/local/tomcat/webapps tomcat 

3.3、驗證

我們先進入容器 

  1. docker exec -it t2 /bin/bash 

然后查看/usr/local/tomcat/webapps下是否有我們掛載的目錄以及文件 

  1. root@4be396ff443b:/usr/local/tomcat/webapps# ls -R volumn-test/  
  2. volumn-test/:  
  3. index.html 

最后我們訪問下看看效果 

  1. [root@izm5 volumn-test]# curl 'localhost:8200/volumn-test/index.html'  
  2. Hello Volumn~~ 

我們修改下宿主機上的index.html的內(nèi)容,修改為Hello Volumn~~ How are you?然后再次訪問看效果:

這里修改的是宿主機/home/main/docker/webapps/volumn-test下的index.html,為不是容器內(nèi)部的。 

  1. [root@izm5 volumn-test]# curl 'localhost:8200/volumn-test/index.html'  
  2. Hello Volumn~~ How are you? 

很完美,容器無感知的就生效了。

3.4、好處

我這是啟動了一個容器舉例,如果多啟動幾個呢?然后產(chǎn)品要修改文案,那么你登錄每個容器里去修改?或者重新打包然后重新啟動所有容器?有點小題大做呀,利用-v命令進行掛載實現(xiàn)宿主機和容器的數(shù)據(jù)共享她不香嗎?

4、新的問題

如果容器過多,那么每次啟動容器都要-v xxx:xxx,這也很容易寫錯啊,寫錯一個字母都不行,還有,如果宿主機換地址了,這也需要批量更換容器的docker run -v的參數(shù),機器太多不利于維護。

5、解決問題

共享容器誕生了!

5.1、共享容器概念

如果容器太多,每一次都要寫-v xxx:xxx,過于復(fù)雜,也容易出錯,這時候可以通過docker create創(chuàng)建共享容器,然后啟動的時候通過--volumes-from指定創(chuàng)建的共享容器名稱即可,也就是說可以把上面-v xxx:xxx這一串統(tǒng)一放到一個地方去管理,容器啟動的時候直接引用這個統(tǒng)一配置即可,方便統(tǒng)一管理。

5.2、語法 

  1. # 創(chuàng)建共享容器語法,只是創(chuàng)建不是啟動。最后的/bin/true 就是一個占位符,沒啥亂用。  
  2. docker create --name 共享容器名稱 -v 宿主機路徑:容器內(nèi)掛載路徑 鏡像名稱 /bin/true  
  3. # 啟動容器的時候通過--volumes-from 共享容器名稱來使用共享容器掛載點  
  4. docker run --volumes-from 共享容器名稱 --name xxx -d 鏡像名稱 

5.3、實戰(zhàn) 

  1. # 創(chuàng)建共享容器  
  2. docker create --name webpage -v /home/main/docker/webapps:/usr/local/tomcat/webapps tomcat /bin/true  
  3. # 采取共享容器的配置來啟動容器  
  4. docker run -p 8300:8080 --volumes-from webpage --name t3 -d tomcat  
  5. # 在啟動個  
  6. docker run -p 8400:8080 --volumes-from webpage --name t4 -d tomcat 

5.4、驗證&&好處

驗證跟第一種-v的方式一樣,修改內(nèi)容,容器無感知。

相對于第一種方式的好處是:

  •  不用每次都寫-v xxx:xxx這一長串不僅令人厭惡還容易出現(xiàn)錯誤的英文字母。
  •  更改路徑,只修改一處即可。

三、DockerCompose

1、有什么用

比如我們要部署一個javaweb應(yīng)用,那一般情況都需要三個容器:nginx容器、tomcat容器、mysql容器。這是最基本的,可能更復(fù)雜。那運維人員每次都需要單獨啟動這三個容器來支撐我們的web應(yīng)用嗎?有點復(fù)雜了。

docker-compose就是為了簡化這個過程的,相當于是個腳本,把這三個容器用腳本統(tǒng)一來管理和啟動。節(jié)省運維時間和避免出錯率。也就是說多應(yīng)用互相協(xié)同才能完成一件事的時候,是很好用的,否則直接Dockerfile就完了。

2、安裝DockerCompose

基于Linux的安裝。

參考的官方安裝文檔:https://docs.docker.com/compose/install/

執(zhí)行如下兩個命令就完事了: 

  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
  2. sudo chmod +x /usr/local/bin/docker-compose 

如果第一個命令特別慢的話可以用如下命令代替,畢竟是國外網(wǎng)站 

  1. > curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 

安裝完進行驗證: 

  1. docker-compose --version 

3、實戰(zhàn)感受一下

先來感受一下docker-compose的威力,部署下WordPress來玩玩。不知道WordPress是啥的自己百度,就是一個開源博客。

為什么是部署WordPress,因為官方也是WordPress….面向官方文檔學(xué)習(xí)…

官方文檔安裝WordPress的教程:https://docs.docker.com/compose/wordpress/

(1)建立如下目錄 

  1. /home/main/docker/WordPress 

(2)建立docker-compose.yml文件 

  1. cd /home/main/docker/WordPress  
  2. vi docker-compose.yml 

(3)在docker-compose.yml里寫上如下內(nèi)容 

  1. version: '3.3'  
  2. services:  
  3.    db:  
  4.      image: mysql:5.7  
  5.      volumes:  
  6.        - db_data:/var/lib/mysql  
  7.      restart: always  
  8.      environment:  
  9.        MYSQL_ROOT_PASSWORD: somewordpress  
  10.        MYSQL_DATABASE: wordpress  
  11.        MYSQL_USER: wordpress  
  12.        MYSQL_PASSWORD: wordpress  
  13.    wordpress:  
  14.      depends_on:  
  15.        - db  
  16.      image: wordpress:latest  
  17.      ports:  
  18.        - "8000:80"  
  19.      restart: always  
  20.      environment:  
  21.        WORDPRESS_DB_HOST: db:3306  
  22.        WORDPRESS_DB_USER: wordpress  
  23.        WORDPRESS_DB_PASSWORD: wordpress  
  24.        WORDPRESS_DB_NAME: wordpress  
  25. volumes:  
  26.     db_data: {} 

看不懂?正常,也沒關(guān)系。這就是大名鼎鼎的docker-compose,就是一個一.yml為后綴結(jié)尾的腳本文件。他能自動幫我們部署我們配置的容器,比如上述有mysql容器和wordpress容器。我們還能看到端口是8000,這就夠了。開干!

(4)執(zhí)行腳本 

  1. # 先進入你的docker-compose.yml所在的目錄  
  2. cd /home/main/docker/WordPress 
  3. # 執(zhí)行腳本  
  4. docker-compose up -d 

(5)結(jié)果分析 

  1. [root@izm5e3qug7oee4q1y4opibz WordPress]# docker-compose up -d  
  2. Creating network "wordpress_default" with the default driver  
  3. Creating volume "wordpress_db_data" with default driver  
  4. Pulling db (mysql:5.7)...  
  5. 5.7: Pulling from library/mysql  
  6. afb6ec6fdc1c: Pull complete  
  7. ....  
  8. 0bdc5971ba40: Pull complete  
  9. Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4  
  10. Status: Downloaded newer image for mysql:5.7  
  11. Pulling wordpress (wordpress:latest)...  
  12. latest: Pulling from library/wordpress  
  13. afb6ec6fdc1c: Already exists 
  14. 3d895574014b: Pull complete  
  15. ...  
  16. Digest: sha256:0b452b7b45fa770f12e864720abb01bef506f4abe273669402434e94323c97d7  
  17. Status: Downloaded newer image for wordpress:latest  
  18. Creating wordpress_db_1 ... done  
  19. Creating wordpress_wordpress_1 ... done 

可以看到pulling db、pulling wordpress、done。大概了解到為我們創(chuàng)建了wordpress和wordpress所需要的mysql數(shù)據(jù)庫。訪問8000端口,大功告成!

4、和Dockerfile區(qū)別

Dockerfile容器間通信需要--link或者橋接方式進行,而DockerCompose全自動的呀。也就是說單容器的話肯定Dockerfile了,但是多容器之間需要交互、有依賴關(guān)系,那用DockerCompose來統(tǒng)一管理那些零散的Dockerfile來達到自動構(gòu)建部署的一體化腳本。

5、實戰(zhàn)

5.1、需求描述

實戰(zhàn)一個spring boot的項目,一個springboot的jar包依賴mysql數(shù)據(jù)庫。我們用docker-compose完成自動化部署。

5.2、準備工作

5.2.1、 準備如下文件 

  1. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# pwd  
  2. /home/main/docker/docker-compose-app  
  3. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# ls -l  
  4. total 12  
  5. drwxr-xr-x 2 root root 4096 May 24 12:20 app  
  6. drwxr-xr-x 2 root root 4096 May 24 12:20 db  
  7. -rw-r--r-- 1 root root  335 May 24 12:20 docker-compose.yml 

5.2.2、app

里面就是我們的springboot的jar包和制作鏡像的Dockerfile文件。 

  1. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# ll app/  
  2. total 23492  
  3. -rw-r--r-- 1 root root     1071 May 24 12:19 application-dev.yml  
  4. -rw-r--r-- 1 root root     1457 May 24 12:19 application.yml  
  5. -rw-r--r-- 1 root root 24042957 May 24 12:20 bsbdj.jar  
  6. -rw-r--r-- 1 root root      154 May 24 12:20 Dockerfile 

看下application-dev.yml的配置,主要看數(shù)據(jù)庫配置: 

  1. spring:  
  2.   datasource:  
  3.     driver-class-name: com.mysql.jdbc.Driver  
  4.     url: jdbc:mysql://db:3306/bsbdj?useUnicode=true  
  5.     username: root  
  6.     password: root  
  7.     tomcat:  
  8.       init-s-q-l: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci  
  9. server:  
  10.   port: 80 

這里我們發(fā)現(xiàn)貓膩了,數(shù)據(jù)庫配置是db:3306,這不是平常的ip/域名神馬的,這個是Mysql容器名稱。所以這個服務(wù)依賴mysql服務(wù),所以我們的主要目的就是利用DockerCompose來自動化操作多容器的Dockerfile文件來自動部署和初始化SQL的操作。

5.2.3、db

jar包所需要的數(shù)據(jù)庫的sql文件和制作鏡像的Dockerfile文件。 

  1. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# ll db/  
  2. total 35612  
  3. -rw-r--r-- 1 root root       69 May 24 12:20 Dockerfile  
  4. -rw-r--r-- 1 root root 36460577 May 24 12:20 init-db.sql 

5.3、開始實戰(zhàn)

5.3.1、app的Dockerfile 

  1. FROM openjdk:8u222-jre  
  2. WORKDIR /usr/local/bsbdj  
  3. ADD bsbdj.jar .  
  4. ADD application.yml .  
  5. ADD application-dev.yml . 
  6. EXPOSE 80  
  7. CMD ["java","-jar","bsbdj.jar"] 

5.3.2、db的Dockerfile 

  1. FROM mysql:5.7  
  2. WORKDIR /docker-entrypoint-initdb.d  
  3. ADD init-db.sql . 

這里有個細節(jié):為什么是進入docker-entrypoint-initdb.d這目錄在ADD sql?因為這個目錄是個后門,這個目錄下的sql文件會自動執(zhí)行。我咋知道的?官方告訴我的:

https://hub.docker.com/_/mysql

5.3.3、最終Boss:docker-compose.yml

現(xiàn)在我們應(yīng)用程序的Dockerfile和應(yīng)用程序所依賴的數(shù)據(jù)庫Dockerfile都已就緒。還剩下最后一個終極yml配置文件 

  1. # 目前最穩(wěn)定版本:3.3,所以3.3就行。  
  2. version: '3.3'  
  3. services:  
  4.   ## 服務(wù)名稱叫 db,還記得我們application-dev.yml的配置嗎?數(shù)據(jù)庫配置的是db,對應(yīng)的就是這里了。  
  5.   db:  
  6.     # Dockerfile文件所屬的目錄。  
  7.     build: ./db/  
  8.     # always:宕機自動重啟。牛逼的很。  
  9.     restart: always  
  10.     # 環(huán)境變量,類似于-e參數(shù)  
  11.     environment:  
  12.       MYSQL_ROOT_PASSWORD: root  
  13.   # 服務(wù)名稱叫 app      
  14.   app:  
  15.     # Dockerfile文件所屬的目錄。若app依賴db,則需要把db服務(wù)配置放到app的前面。  
  16.     build: ./app/  
  17.     # 依賴上面的db service  
  18.     depends_on:  
  19.       - db  
  20.     # 宿主機和容器的端口均為80。上面app的Dockerfile暴露的是80端口,所以這里容器是80    
  21.     ports:  
  22.       - "80:80"  
  23.     restart: always 

5.3.4、啟動 

  1. # -d代表后臺啟動  
  2. docker-compose up -d 

啟動結(jié)果: 

  1. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# docker-compose up -d  
  2. Creating network "docker-compose-app_default" with the default driver  
  3. Building db  
  4. Step 1/3 : FROM mysql:5.7  
  5.  ---> a4fdfd462add  
  6. Step 2/3 : WORKDIR /docker-entrypoint-initdb.d  
  7.  ---> Running in d1ff6e4bb5a8  
  8. Removing intermediate container d1ff6e4bb5a8  
  9.  ---> d29a05c5bfcb  
  10. Step 3/3 : ADD init-db.sql .  
  11.  ---> 6ae6d9eb35ca  
  12. Successfully built 6ae6d9eb35ca 
  13. Successfully tagged docker-compose-app_db:latest  
  14. WARNING: Image for service db was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 
  15. Building app  
  16. Step 1/7 : FROM openjdk:8u222-jre  
  17. 8u222-jre: Pulling from library/openjdk  
  18. 9a0b0ce99936: Pull complete  
  19. db3b6004c61a: Pull complete  
  20. f8f075920295: Pull complete  
  21. 4901756f2337: Pull complete  
  22. 9cfcf0e1f584: Pull complete  
  23. d6307286bdcd: Pull complete  
  24. Digest: sha256:3d3df6a0e485f9c38236eaa795fc4d2e8b8d0f9305051c1e4f7fbca71129b06a  
  25. Status: Downloaded newer image for openjdk:8u222-jre  
  26.  ---> 25073ded58d2  
  27. Step 2/7 : WORKDIR /usr/local/bsbdj  
  28.  ---> Running in df4a4c352e71  
  29. Removing intermediate container df4a4c352e71  
  30.  ---> 0d88b2f13319  
  31. Step 3/7 : ADD bsbdj.jar .  
  32.  ---> aabaa119855d  
  33. Step 4/7 : ADD application.yml .  
  34.  ---> 7e1f7b4614cc  
  35. Step 5/7 : ADD application-dev.yml . 
  36.  ---> a8d36115592f  
  37. Step 6/7 : EXPOSE 80  
  38.  ---> Running in 26b44c9d57ef  
  39. Removing intermediate container 26b44c9d57ef  
  40.  ---> fd36f3cdd115  
  41. Step 7/7 : CMD ["java","-jar","bsbdj.jar"]  
  42.  ---> Running in 64bdeff2f1ce  
  43. Removing intermediate container 64bdeff2f1ce  
  44.  ---> 77d18bae9bbc  
  45. Successfully built 77d18bae9bbc  
  46. Successfully tagged docker-compose-app_app:latest  
  47. Creating docker-compose-app_db_1 ... done  
  48. Creating docker-compose-app_app_1 ... done 

可以看到先為我們構(gòu)建了mysql的鏡像然后又構(gòu)建了bsbdj.jar的鏡像。最后執(zhí)行了CMD ["java","-jar","bsbdj.jar"],這些過程全自動化。

查看容器 

  1. docker-compose ps 

結(jié)果: 

  1. [root@izm5e3qug7oee4q1y4opibz docker-compose-app]# docker-compose ps  
  2.           Name                       Command             State          Ports      
  3. ------------------------------------------------------------------------------------  
  4. docker-compose-app_app_1   java -jar bsbdj.jar           Up      0.0.0.0:80->80/tcp   
  5. docker-compose-app_db_1    docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp 

然后訪問http://ip:80即可看到效果。

6、補充

docker-compose其他命令可以用docker-compose --help查看。再說下docker-compose和Dockerfile區(qū)別,可以粗糙理解成Dockerfile是針對單容器的腳本,docker-compose是針對多Dockerfile的自動化腳本,他幫我們處理容器之間的依賴關(guān)系和其他需要人為干涉的操作。

四、上期答疑

上期回顧:面試官:你說你精通 Docker,那你來詳細說說 Dockerfile 吧

1.ADD命令能否解壓zip格式?多模塊該怎么創(chuàng)建鏡像?

ADD命令不能解壓zip,親測。能解壓:tar, gzip, bzip2, etc。

多模塊恰巧是今天的主角docker-compose,可以為每一個模塊都書寫一個Dockerfile,然后用docker-compose去管理這些帶有依賴關(guān)系的模塊。

如果是集群的話,首選k8s,docker warm什么的,畢竟docker-compose致命缺點僅限在單機上。

2.有了docker commit為啥還要Dockerfile?

docker commit都是黑箱操作,過一段時間后自己都不知道這個鏡像是怎么做出來的,都安裝了什么。但是使用Dockerfile構(gòu)建的鏡像,我們能清楚的知道都有哪一層,每層是干嘛的,修改也方便,易于維護。 

 

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2022-05-10 07:31:49

消息隊列CPUQPS

2020-05-19 16:36:50

漏洞iOS網(wǎng)絡(luò)攻擊

2011-07-12 10:33:46

CentOS 6

2024-01-31 13:05:00

模型訓(xùn)練

2023-11-02 08:45:07

2017-07-17 16:27:10

Docker Comp鏈接容器

2012-02-28 09:11:51

語言Lua

2024-09-06 12:28:48

2013-10-22 15:18:19

2012-11-14 20:55:07

容錯服務(wù)器選型CIO

2017-11-17 08:59:00

2021-02-01 07:20:51

KafkaPulsar搜索

2021-04-06 11:07:02

字節(jié)跳動組織架構(gòu)

2018-12-21 11:26:49

MySQLMongoDB數(shù)據(jù)庫

2019-04-19 11:56:48

框架AI開發(fā)

2025-01-03 08:50:23

2021-02-17 09:39:41

PodmanDockerLinux

2019-09-05 19:28:23

Docker程序員MySQL

2024-08-07 13:54:10

2015-12-30 09:58:49

Docker Comp容器
點贊
收藏

51CTO技術(shù)棧公眾號