Docker 進階篇
docker學不會?no,no,no,有時候你缺的只是一篇博客而已!
docker大全,全是干貨,趕緊整起來吧!
文章目錄
- Docker 進階篇
- Docker入門
- 什么是Docker?
- 為什么要用docker?
- 相關概念:
- Docker常用命令
- Docker 幫助指令:
- 鏡像操作命令:
- 容器操作命令:
- Docker網路
- docker的網路模式
- docker 自定義網路:
- 容器的埠暴露
- Docker資料卷
- 資料卷的使用場景
- 資料卷實驗
- 創建資料卷
- 清理資料卷
- 實驗展示:
- 資料卷容器
- Dockerfile
- **構建步驟:**
- **基礎知識:**
- dockerfile 分層原理:
- dockerfile指令:
- 優化方式:
- 發布自己的鏡像
- 1、我們先 push 到dockerHub上:
- 2、鏡像push到阿里云上:
Docker入門
什么是Docker?
- Docker 是世界領先的軟體容器平臺,
- Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用介面,
- Docker 將應用程式與該程式的依賴,打包在一個檔案里面,運行這個檔案,就會生成一個虛擬容器,程式在這個虛擬容器里運行,就好像在真實的物理機上運行一樣,有了 Docker,就不用擔心環境問題,
像我們經常說的“在我的機器上可以正常運行,到你的機器上就不行”,這個一般都是環境引起的,而docker可以完美的解決這個問題,
為什么要用docker?
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小,傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可,
docker優勢:
1、更快速的交付和部署;
2、更高效的虛擬化;
3、更輕松的遷移和擴展;
4、更簡單的管理;
相關概念:
Docker是CS架構;
- Docker daemon: 運行在宿主機上,Docker守護行程,用戶通過Docker client(Docker命令)與Docker daemon互動
- Docker client: Docker 命令列工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信并將結果回傳給用戶,Docker client也可以通過socket或者RESTful api訪問遠程的Docker daemon,
了解一下Docker的三個主要概念:
- Docker image:鏡像是只讀的,鏡像中包含有需要運行的檔案,鏡像用來創建container,一個鏡像可以運行多個container;鏡像可以通過Dockerfile創建,也可以從Docker hub/registry上下載,
- Docker container:容器是Docker的運行組件,啟動一個鏡像就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程式運行在一個相對安全的環境中,
- Docker hub/registry: 共享和管理Docker鏡像,用戶可以上傳或者下載上面的鏡像,官方地址為
https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry,
鏡像就相當于打包好的版本,鏡像啟動之后運行在容器中,倉庫就是裝存盤鏡像的地方,
Docker常用命令
Docker 幫助指令:
在操作docker時,我們常需要輸入一些指令,那這些指令怎么用呢?
這里我們可以借助官方檔案進行查看指令的用處;(這里我們需要登入一下dockerhub ,沒有的話我們就注冊一個);


另外,我們也可以在docker中查看指令怎么用;
#查看幫助指令
docker 指令 --help

鏡像操作命令:
#下載鏡像
docker pull 鏡像名[:tag]
docker pull centos:7 #如果不指定tag,默認是pull最新的 latest
也可以去官網 pull 鏡像
https://hub.docker.com/_/centos?tab=tags


#查看鏡像的資訊:
docker images
#獲取鏡像資訊
docker inspect 鏡像ID
#有些時候我們pull下來的鏡像,在自己這添加了一些功能后,可以為其添加標簽在 push到dockerhub上
#為鏡像添加標簽:
#如,為nginx:latest 鏡像添加標簽
docker tag nginx:latest nginx:lnmp




當我們不需要某些鏡像時,我們還可以刪掉某些鏡像:
#洗掉鏡像
docker rmi 鏡像名或ID
#洗掉鏡像標簽
docker rmi 鏡像名:tag
#還可以批量洗掉所有鏡像
docker rmi `docker images -q` #這里的-q 只會輸出鏡像ID
[root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 141MB
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
[root@docker ~]#docker images -q
605c77e624dd
feb5d9fea6a5

有些時候,我們自己創建的鏡像,如果在沒網的情況下,要使用的話,我們就需要先把他匯出來,在沒網的時候導進去即可;
#鏡像的匯出匯入
docker save -o 檔案名 鏡像名
示例:
docker save -o nginx_docker nginx:latest
#鏡像匯入
docker load < nginx_docker
鏡像匯出匯入的意義?
- Docker鏡像的匯入匯出,用于遷移、備份、升級等場景;
- 若是只想備份images,使用save、load即可;
- 若是在啟動容器后,容器內容有變化,需要備份容器,則使用export、import;
當我們從 docker 鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改,
- 1、從已經創建的容器中更新鏡像,并且提交這個鏡像
- 2、使用 Dockerfile 指令來創建一個新的鏡像
容器操作命令:
首先安裝好docker和啟動docker:
#運行容器
docker run hello-world
#卸載docker
#洗掉安裝包:
yum remove docker-ce
#洗掉鏡像、容器、組態檔等內容
rm -rf /var/lib/docker
我們可以自己創建容器:
#創建容器
docker create -it nginx:latest /bin/bash
#-i:提供一個操作容器的介面
#-t:是一個偽終端,使操作容器有個落腳點
#/bin/bash:放在鏡像名后的是命令,這里我們希望有個互動式 Shell,因此用的是 /bin/bash,

在創建完容器后,我們要啟動他:
#啟動容器
docker start 容器id
#停止容器
docker stop 容器ID
#有些時候我們可以在創建的時候就啟動它
#并在啟動后讓他執行一些指令,列如:-c 后面表示要執行的命令
docker run -it centos:7 /bin/bash -c ls / #但它是一次性的,執行完后就會退出


#查看docker 相關資訊
docker version
#或者
docker info
docker inspect 容器name(id)
啟動容器的幾種方式:
#啟動容器:
#這種情況會在你退出容器時而停止容器運行
docker run -it nginx:latest /bin/bash
#持續后臺運行容器,這里借助了死回圈陳述句
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
#查看所有容器
docker ps -a
#查看所有容器id
docker ps -aq

但在大部分的場景下,我們希望 docker 的服務是在后臺運行的,我們可以過 -d 指定容器的運行模式,
#注意:這里加-d 不會進入容器;
docker run -itd centos:7 /bin/bash
#進入容器
docker exec -it 容器ID /bin/bash exec下(容器必須為開啟狀態)

三種運行容器的區別:
- docker run -it會創建前臺行程,但是會在輸入exit后終止行程,
- docker attach 會通過連接stdin,連接到容器內輸入輸出流,會在輸入exit后終止容器行程,
- docker exec -it 會連接到容器,可以像ssH一樣進入容器內部,進行操作,可以通過exit退出容器,不影響容器運行,
#容器的匯出與匯入
#容器匯出
docker export 容器ID >檔案名
示例:
docker export nginx:latest >nginx_a
#容器匯入(生成鏡像)
docker import 匯出的檔案名(容器)指定鏡像名稱
示例:
docker import nginx_a nginx:latest
cat 檔案名(容器)| docker import - nginx:latest
##洗掉容器
docker rm 容器工D
docker rm `docker ps -aq`
#強制洗掉容器(正在運行的)
docker rm -f 容器ID
#批量洗掉容器(正則匹配)
docker ps -a \ awk '{print "docker rm "$1} ' l bash#洗掉非up狀態的rm -f強制洗掉
docker rm `docker ps -q`
#批量洗掉"exit"狀態(指定狀態)的容器
for i in `docker ps -a | grep -i exit | awk '{print $1}'; do
docker rm -f$i; done
#查詢所有當前容器資源消耗資訊
docker stats 容器ID
#查看容器資訊:
docker inspect 容器id
#搜索容器:
docker search 容器name
#查詢最后一次創建的容器:
docker ps -l
Docker網路
前面我們實作了通過網路埠來訪問運行在 docker 容器內的服務,
容器中可以運行一些網路應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 引數來指定埠映射,
首先了解docker網路之前我們先看看宿主機上有哪些網卡:
1、lo:回環網卡;檢測TCP/IP是否生效
2、ens33網卡:宿主機網卡,只有centos7是叫ens33,其他linux發行版都是eth0網卡;
3、virbr0網卡:是服務器硬體網卡;
4、docker 0:容器的網關,系結物理網卡,負責做NAT地址轉換、埠映射;docker0本身也是一種容器;

另外還有就是 weth-pair對:
veth對:一組虛擬設備,用戶連接兩個不同的名稱空間;宿主機內就是veth;

這都是一對一對出現的,如 9: vethd8e28c8@if8,11: vethd058aa4@if10;
docker的網路模式
- Host模式:-net=host;容器和宿主機共享Network namespace(網路名稱空間/網路協議堆疊),
- Container模式:-net=container:NAME or ID;多個容器共享一 個Network namespace ,
- None模式:-net=none;容器有獨立的Network namespace,但并沒有對其進行任何網路設定,如分配veth pair和網橋連接,配置IP等(自閉空間),
- Bridge模式:-net=bridge(默認為該模式);默認模式通過Veth對連接容器與docker0網橋,網橋分配給容器IP,同時docker0作為“局域網“內容器的網關,最后和宿主機網卡進行通訊,


這些都是docker自帶的,除了這些,我們還可以對docker 自定義網路;
docker 自定義網路:
docker network ls ##查看網路串列
#還可以查看容器網關,IP,埠等資訊
docker inspect 容器ID


這里默認的都是從172.17.0.1/16 開始,
接下來我們自定義網路:
首先了解一下自定義網路的好處:
1、如果我們用docker默認的網路,當我們的容器停止修改優化后,再上線時IP會換成其他的IP,不再是原來的那個IP,這會導致訪問不到我們的業務,并可能照成業務癱瘓,
2、為了解決這種情況,我們就需要自定義網路,讓每個容器有自己的IP,即使容器老掉線,但只要再次上線,他就還是原來的那個IP,
#指定分配容器IP地址
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
--network:指定網路型別
--ip:指定ip地址
#注意:這里會報錯,因為這是容器默認給的IP,不可以修改

我們要先自定義一個網路,才可以給他固定的IP;
#自定義網路,固定IP
docker network create --subnet=172.18.0.0/16 mynetwork #先自定義個網路
docker run -itd --name test02 --net mynetwork --ip 172.18.0.100 centos:latest /bin/bash #這里就可以給容器指定IP了


容器的埠暴露
在我們配置到IP后,我們要將業務暴露出去,給別人訪問,例如:我們這有一個nginx服務容器,那我們怎么才能讓別人訪問到我們的容器呢?
這里我們就需要將我們的nginx容器的服務埠暴露到宿主機上,這樣別人訪問我們 宿主機IP:暴露埠 就可以訪問到我們的業務了,
#暴露埠
#-p自定義埠(宿主機埠:容器內埠)
docker run -itd -p 90:80 nginx:latest /bin/bash
#-P隨機埠(-P 49153起始,49153到65535)
docker run -itd -P nginx:latest /bin/bash

#我們把nginx運行起來看看效果
docker exec 684f2a3263d8 nginx

這里的隨機埠也是這樣測驗的,只不過隨機埠不用指定埠映射,他默認從49153開始;
不過要注意的是,當你隨機了一個容器埠映射后,再把這個容器刪掉,之后在創建容器隨機映射埠后,他會從下一個開始,一直這樣下去,不會有重復的;并且這里的隨機埠也是偽隨機,他是從49153開始一直排下去的;
Docker資料卷
在Docker中,要想實作資料的持久化(所謂Docker的資料持久化即***資料不隨著Container的結束而結束***),需要將資料從宿主機掛載到容器中,目前Docker提供了三種不同的方式將資料從宿主機掛載到容器中:
(1)volumes:Docker管理宿主機檔案系統的一部分,默認位于 /var/lib/docker/volumes 目錄中;(最常用的方式)
(2)bind mounts:意為著可以存盤在宿主機系統的任意位置;(比較常用的方式)
但是,bind mount在不同的宿主機系統時不可移植的,比如Windows和Linux的目錄結構是不一樣的,bind mount所指向的host目錄也不能一樣,這也是為什么bind mount不能出現在Dockerfile中的原因,因為這樣Dockerfile就不可移植了,
(3)tmpfs:掛載存盤在宿主機系統的記憶體中,而不會寫入宿主機的檔案系統;(一般都不會用的方式)
資料卷的使用場景
- 在多個容器之間共享資料,多個容器可以同時以只讀或者讀寫的方式掛載同一個資料卷,從而共享資料卷中的資料,
- 當宿主機不能保證一定存在某個目錄或一些固定路徑的檔案時,使用資料卷可以規避這種限制帶來的問題,
- 當你想把容器中的資料存盤在宿主機之外的地方時,比如遠程主機上或云存盤上,
- 當你需要把容器資料在不同的宿主機之間備份、恢復或遷移時,資料卷是很好的選擇,

資料卷實驗
docker 專門提供了 volume 子命令來操作資料卷:
#我們通過--help指令來看下 volume怎么使用
docker volume --help
Usage: docker volume COMMAND
Commands:
create 創建資料卷
inspect 顯示資料卷的詳細資訊
ls 列出所有的資料卷
prune 洗掉所有未使用的 volumes,并且有 -f 選項
rm 洗掉一個或多個未使用的 volumes,并且有 -f 選項
創建資料卷
docker volume create 卷名
#查看卷
docker volume ls
#詳細查看
docker volume inspect 卷名

有了自定義容器卷,我們可以創建一個使用這個資料卷的容器,這里我們以nginx為例:
docker run -itd --name=nginx01 -v nginx_vol:/usr/share/nginx/html nginx
其中,-v代表掛載資料卷,這里使用自定資料卷nginx_vol,并且將資料卷掛載到 /usr/share/nginx/html (這個目錄是yum安裝nginx的默認網頁目錄),
如果沒有通過-v 指定,那么Docker會默認幫我們創建匿名資料卷進行映射和掛載,
清理資料卷
如果不再使用自定義資料卷了,那么可以手動清理掉:
docker stop nginx01 #暫停容器實體
docker rm nginx01 #// 移除容器實體
docker volume rm nginx_vol #// 洗掉自定義資料卷
實驗展示:
docker pull nginx
#宿主機目錄/mnt 掛載容器中的/data01
#注意:這里的data01 容器中沒有他會自己創建
docker run -v /mnt:/data01 --name nginx01 -itd nginx /bin/bash
#進入容器中創建檔案檢測
docker exec -it 59403edfdabe /bin/bash
ls
cd /data01
touch 1.txt
#在宿主機中的 /mnt 目錄下查看



注意:上面的 vim 不可以用,是因為容器中的centos還沒有這個功能,要自己 yum install -y vim;
資料卷容器
容器間資料同步

這里我們啟動三個容器:
我們讓centos01 容器作為父容器;centos02和centos03作為子容器:
docker run --name centos01 -v /data01 -it centos:7 /bin/bash
docker run -it --volumes-from centos01 --name centos02 centos:7 /bin/bash
docker run -it --volumes-from centos01 --name centos03 centos:7 /bin/bash


接下來我們來測驗一下:
在父容器中創建資料,在兩個子容器中查看:



通過上面結果我們看出,在 /data01 這個目錄下的資料是共享的,無論是誰在這里寫資料,其他容器都可以看到;
這個 /data01 目錄還掛載在我們的宿主機,所以容器間的共享資料就可以持久化的保存下來,
這里有個小問題:怎么把宿主機的檔案傳入到容器內部呢?
哎,這里我們可以借助docker cp 指令,
#docker cp 源檔案路徑 容器ID:目標檔案位置
[root@docker ~]#docker cp --help
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
#這里通過 --help 知道有兩種寫法,那種簡單選那種就可以
docker cp /opt/2.txt a9a03fc65822:/data01
#然后我們去centos01 查看


Dockerfile
dockerfile 是用來構建docker鏡像的檔案!命令引數腳本!
構建步驟:
1、撰寫一個dockerfile 檔案;
2、docker bulid 構建成為一個鏡像;
3、docker run 運行鏡像;
4、docker push 發布鏡像(dockerHub公共倉庫,阿里云鏡像倉庫);
基礎知識:
1、每個保留關鍵字(指令)都必須是大寫字母
2、指令是從上到下順序執行
3、# 表示注釋
4、每一個指令創建提交都會產生一個新的鏡像層
dockerfile 分層原理:
docker鏡像分層(基于AUFS構建),AUFS是檔案聯合系統;
Docker鏡像位于bootfs之上;
每一層鏡像的下一層成為父鏡像;
第一層鏡像成為base image(作業系統環境鏡像)容器層(可讀可寫),在最頂層(writable);
容器層以下都是readonly;
contaier 讀寫層(可讀可寫)
images (只讀)
base image
bootfs +rootfs + aufs/overlay2 +LXC (kernel)
bootfs + rootfs :作用是加載、引導內核程式+掛載使用linux 作業系統(centos ubantu)等等一些關鍵的目錄檔案;
對于一個精簡的os,rootfs可以很小,只需要包括最基本的命令、工具和程式庫就可以了,因為底層直接用Host的kernel;
自己只需要提供rootfs就行了,由此可見對于不同的linux發行版,bootfs基本是一致的,rootfs會有差別,
因此不同的發行版可以公用bootfs;
AUFS和 overlay:
AUFS是一種聯合檔案系統,它使用同一個Linuxhost上的多個目錄,逐個堆疊起來,對外呈現出一個統一的檔案系統,
AUFS使用該特性,實作了Docker鏡像的分層;
docker 使用了overlay/overlay2存盤驅動來支持分層結構;
overlayFs將單個Linux主機上的兩個目錄合并成一個目錄,這些目錄被稱為層,統一程序被稱為聯合掛載
overlay結構:
overlayfs在linux主機上只有兩層,一個目錄在下層,用來保存鏡像(docker),另外一個目錄在上層,用來存盤容器資訊,

dockerfile指令:
FROM #基礎鏡鏡像,—切從這里開始構建
MAINTAINER #鏡像是誰寫的,姓名+郵箱
RUN #鏡像構建的時候需要運行的命令
ADD #步驟: tomcat鏡像,這個tomcat壓縮包!添加內容
WORKDIR #鏡像的作業目錄
VOLUME #掛載的目錄
EXPOSE #暴露埠
CMD #指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代
ENTRYPOINT #指定這個容器啟動的時候要運行的命令,可以追加命令
ONBUILD # 當構建一個被繼承 DockerFile這個時候就會運行ONBUILD的指令,觸發指令,
COPY #類似ADD,將我們檔案拷貝到鏡像中
ENV #構建的時候設定環境變數!

鏡像構建完后,我們還可以查看鏡像構建程序:
#查看鏡像構建程序:
docker history 鏡像ID
在知道Dockerfile 怎么撰寫后,我們來嘗試寫一個Dockerfile:
我們就寫一個簡單的Dockerfile 檔案:
vim Dockerfile
FROM centos:7
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
ADD nginx-1.12.0 /opt
WORKDIR /opt/nginx-1.12.0
RUN ./configure --prefix=/usr/local/nginx
RUN make && make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off"]
#撰寫好Dockerfile檔案后,我們要去構建鏡像
docker build -f Dockerfile檔案位置 -t 鏡像名 .
#這里若果我們撰寫的鏡像檔案是 Dockerfile的話,那就可以省略不寫,因為這是官方的寫法,他會自己去找Dockerfile檔案,還有就是要注意后面的這一個點,不能忘記;
docker build -t nginx:v1 .
#構建好鏡像后,我們就來運行這個容器
docker run -d -p 90:80 nginx:v1
有提到指令最后一個 . 是背景關系路徑,那么什么是背景關系路徑呢?
背景關系路徑,是指 docker 在構建鏡像,有時候想要使用到本機的檔案(比如復制),docker build 命令得知這個路徑后,會將路徑下的所有內容打包,


這里我們自己撰寫的dockerfile 檔案構建出來的鏡像有472MB,相比我們pull nginx的話,顯然是有點大的,那他們是怎么做到的呢?

這里我們就得說下Dockerfile 的優化了;
因為docker 鏡像是分層思想,每層他都會有快取,上一層構建時可能會用到下層的快取,所以層數越多,他站的快取也就越多,所以構建完后的大小就越大;
在撰寫Dockerfile 時,都是一層一條指令的;
所以要想大小變小,我們可以優化層數,減少 RUN 指令的使用;
優化方式:
1、減少RUN 指令的使用;
2、將執行后的快取/不用的輸出丟入黑洞 (減少快取);
3、多階段構建;
4、使用更小體積的linux發行版本;更加輕量級的centos的版本;
發布自己的鏡像
當我們撰寫好一個 Dockerfile 檔案,構建好鏡像,運行容器后,覺得非常好用,這時候我們就可以 push 到 dockerHub 上或者阿里云上,給別人使用,或者作為私有倉庫保存到里面,用到的時候在pull 下來,
如:我撰寫好一個Tomcat的Dockerfile 后,我想push到dockerHub和阿里云上,可以這樣做:
#我撰寫的Dockerfile 檔案
vim Dockerfile
FROM centos:7
ADD apache-tomcat-9.0.16.tar.gz /opt/tomcat
ADD jdk-8u201-linux-x64.tar.gz /opt/tomcat
ENV JAVA_HOME /opt/tomcat/jdk1.8.0_201/
ENV CATALINA_HOME /opt/tomcat/apache-tomcat-9.0.16
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD ["/opt/tomcat/apache-tomcat-9.0.16/bin/catalina.sh","run"]
#構建鏡像和運行容器
docker build -t tomcat:v1 .
docker run -d -p 9090:8080 tomcat:v1
1、我們先 push 到dockerHub上:
先去docker官網注冊自己的賬號;https://www.docker.com/


在我們的服務器上push鏡像:
#我們查看一下怎么登錄
docker login --help
Usage: docker login [OPTIONS] [SERVER]
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
#docker login -u 用戶名
password: #密碼

出現登錄成功后,我們就可以push 自己的鏡像了;
#首先我們要添加個 tag,帶上你的用戶名
docker tag 鏡像ID 名字:tag
docker tag 5ceee19144d9 tiks821/tomcat:v1
#然后在push 上去,不然會報錯
docker push tiks821/tomcat:v1
#沒有添加用戶名 tag,報的錯資訊:
denied: requested access to the resource is denied

這里服務器push到dockerHub上是非常慢的,因為dockerHub 服務器在國外,我們的網路是比較吃力的;
所以針對這種情況,我們就把鏡像 push到阿里云上;
2、鏡像push到阿里云上:
01、我們得登錄阿里云;
02、搜索容器鏡像服務;
這里我們前面用過阿里的容器鏡像加速;

03、我們創建自己的個人實體:

04、創建好后我們進入個人實體,創建命名空間和鏡像倉庫:
注意:這里的名稱空間每個用戶只能創建三個;




05、鏡像倉庫創建好后,我們就可以push 鏡像了;
這里我們可以看阿里云給的檔案,他會告訴我們怎么 push 鏡像;


接下來我們來push 我們的鏡像;
#首先是登錄阿里云
docker login --username=蕭楚河 registry.cn-hangzhou.aliyuncs.com
#然后添加 tag,這里跟dockerHub一樣,都要添加tag
docker tag 鏡像ID registry.cn-hangzhou.aliyuncs.com/tiks/studydocker:tomcat_v1
#最后push 鏡像
docker push registry.cn-hangzhou.aliyuncs.com/tiks/studydocker:tomcat_v1

再去阿里云上看,就會有我們push的鏡像了;


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414022.html
標籤:其他
上一篇:學習記錄:-)
下一篇:泛型基本知識
