Docker 學習筆記 (續)
1.Docker 映象
1.1 映象是什麼
映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
所有的應用,直接打包docker映象,就可以直接跑起來!
如何得到映象:
- 從遠端倉庫下載
- 朋友拷貝給你
- 自己製作一個映象DockerFile
1.2 映象載入原理
UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem)。Union檔案系統是Docker映象的基礎。映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象
特性:一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把檔案系統及疊加起來,這樣最終的檔案系統包含所有底層的檔案和目錄
Dcoker映象載入原理
- docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導載入kernel,Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層是bootfs。這一層與我們電箱的Linux/Unix系統是一樣的,包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs。
- rootfs(root file system),在bootfs之上。包含的就是典型Linux 系統中的 /dev,/proc,/bin,/etc 等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。
平時我們安裝進虛擬機器的CentOS都是好幾個G,為什麼Docker這裡才200M?
對於個精簡的OS,rootfs可以很小,只需要包合最基本的命令,工具和程式庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了。由此可見對於不同的Linux發行版, boots基本是一致的, rootfs會有差別,因此不同的發行版可以公用bootfs。
虛擬機器是分鐘級別,容器是秒級!
1.3、分層理解
我們可以去下載一個映象,注意觀察下載的日誌輸出,可以看到是一層層的在下載 。
為什麼Docker映象要採用這種分層的結構呢?
最大的好處,我覺得莫過於資源共享了!比如有多個映象都從相同的Base映象構建而來,那麼宿主機只需在磁碟上保留一份base映象,同時記憶體中也只需要載入一份base映象,這樣就可以為所有的容器服務了,而且映象的每一層都可以被共享。
檢視映象分層的方式可以通過docker image inspect 命令
[root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker image inspect redis:latest
[
{
//.............
"RootFS": {
"Type": "layers",
"Layers": [ "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7", "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871", "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54", "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1", "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3", "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
理解:
所有的docker映象都起始於一個基礎映象層,當進行修改或者增加新的內容時,就會在當前映象層之上,建立新的映象層。
舉一個簡單的例子,加入基於Ubuntu Linux 16.04建立一個新的映象,這就是新映象的第一層;如果在該映象中新增Python包,就會在基礎映象層之上穿件第二個映象層;如果繼續新增一個安全補丁,就會建立第三個映象層。
該映象當前已經包含3個映象層,如下圖(這只是一個用於演示的很簡單的例子)。
在新增額外的映象層的同時,映象始終是保持當前所有映象的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個映象層包含3個檔案,而映象層包含了來自兩映象層的6個檔案。
上圖中的映象層跟之前圖中的略有區別,主要目的是便於展示檔案。
下圖總展示了一個稍微複雜的三層映象,在外部看來整個映象只有6個檔案,這是因為最上層的檔案7是檔案5的一個更新版本。
這種情況下,上層映象層中的檔案覆蓋了底層映象層中的檔案。這樣就使得檔案的更新版本作為一個新的映象層新增到映象當中。
Docker通過儲存引擎(新版本採用快照機制)的方式來實心映象層堆疊,並保證多映象層對外展示為統一的檔案系統。
Linux 上可用的儲存引擎有AUFS、Overlay2,Device Maper、Btrfs 以及 ZFS。顧名思義,沒種儲存引擎都基於Linux中對應的檔案系統或者塊裝置技術,並且每種儲存引擎都有其獨有的效能特點。
Docker在Windows上僅支援windowsfiler 一種儲存引擎,該引擎基於NTFS檔案系統之上實現了分層和CoW[1]。
下圖展示了與系統顯示相同的三層映象。所有映象層堆疊併合並,對外提供統一的檢視。
特點
Docker映象都是隻讀的,當容器啟東時,一個新的可寫層被載入到映象的頂部!
這一層就是我們通常說的容器層,容器之下的都叫映象層。
1.4、commit映象
docker commit 提交容器成為一個新的副本
# 命令和git原理類似
docker commit -m="描述資訊" -a="作者" 容器id 目標映象名:[TAG]
# 1、啟動一個預設的tomcatdocker run -d -p 8080:8080 tomcat# 2、發現這個預設的tomcat 是沒有webapps應用,官方的映象預設webapps下面是沒有檔案的!docker exec -it 容器id# 3、拷貝檔案進去# 4、將操作過的容器通過commit**為一個映象!我們以後就使用我們修改過的映象即可,這就是我們自己的一個修改的映象。docker commit -m="描述資訊" -a="作者" 容器id 目標映象名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
如果你想要儲存當前容器的狀態,就可以通過commit來提交,獲得一個映象,就好比我們我們使用虛擬機器的快照。
2.容器資料卷
2.1、什麼是容器卷?
將應用和環境打包成一個映象!
資料?如果資料都在容器中,那麼我們容器刪除,資料就會丟失!需求:資料可以持久化
MySQL,容器刪除了,刪庫跑路!需求:MySQL資料可以儲存在本地!
容器之間可以有一個數據共享的技術!Docker容器中產生的資料,同步到本地!
這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linux上面!
總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的!
2.2、使用資料卷
方式一 :直接使用命令掛載 -v
-v, --volume list Bind mount a volume
docker run -it -v 主機目錄:容器內目錄
[root@iZ8vbgc3u6dvwrjyp45lyrZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#通過 docker inspect 容器id 檢視
2.3、案例:安裝MySQL
# 獲取mysql映象
➜ ~ docker pull mysql:5.7
# 執行容器,需要做資料掛載 #安裝啟動mysql,需要配置密碼的,這是要注意點!
# 參考官網hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#啟動我們得
-d 後臺執行
-p 埠對映
-v 卷掛載
-e 環境配置
-- name 容器名字
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 啟動成功之後,我們在本地使用sqlyog來測試一下
# sqlyog-連線到伺服器的3306--和容器內的3306對映
# 在本地測試建立一個數據庫,檢視一下我們對映的路徑是否ok!
2.4、具名和匿名掛載
# 匿名掛載
-v 容器內路徑!
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 檢視所有的volume的情況
[root@iZ8vbgc3u6dvwrjyp45lyrZ lib]# docker volume ls
DRIVER VOLUME NAME
local 3df3ebf883092323908b31e21c761b56c937ee04ed51d418eedcc10df8d5f20a
# 這裡發現,這種就是匿名掛載,我們在 -v 只寫了容器內的路徑,沒有寫容器外的路徑!
# 具名掛載
# 具名掛載
➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜ ~ docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通過 -v 卷名:容器內路徑
# 檢視一下這個卷
所有的docker容器內的卷,沒有指定目錄的情況下都是在 /var/lib/docker/volumes/xxx/_data
我們通過具名掛載可以方便的找到我們的 一個卷,大多數情況使用的是 具名掛載
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!
-v 容器內路徑 # 匿名掛載
-v 卷名:容器內路徑 # 具名掛載
-v /宿主機路徑:容器路徑 # 指定路徑掛載!
拓展:
# 通過 -v 容器內路徑: ro rw 改變讀寫許可權
ro readonly # 只讀
rw readwrite # 可讀可寫
# 一旦設定了容器許可權,容器對我們掛載出來的內容就有限定了!
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!
2.5、初識Dockerfile
Dockerfile 就是用來構建docker映象的構建檔案!
1.通過這個指令碼可以生成映象,映象是一層一層的,指令碼就是一個一個的命令
# 建立一個dockerfile檔案,名字可以隨機 建議 Dockerfile
# 檔案中的內容 指令(大寫)引數
FROM centos
VOLUME ["/volume01", "/volume02"]
CMD echo "----end----------"
CMD /bin/bash
# 這裡的每個命令,就是映象的一層!
2.通過 docker build 命令基於dockerfile 構建自己的映象
3啟動映象
可以看到docker檔案裡寫的 掛載 已經生效
4檢視一下卷掛載的路徑
2.6 資料卷容器
多個MySQL同步資料!
命名的容器掛載資料卷!
啟動2個容器,通過我們剛才自己寫的映象啟動
--volumes-from list Mount volumes from the specified container(s)
# 測試,
[root@qiaoba ~]# docker run -it --name docker-04 --volumes-from docker-3 9b05afa5a9cd
[root@675e696485b1 /]# cd volumedir01
[root@675e696485b1 volumedir01]# ls
fangtao.java
多個mysql實現資料共享
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 這個時候,可以實現兩個容器資料同步!
結論:
容器之間的配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。
但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的!
3.DockerFile
3.1、DockerFile介紹
dockerfile 是用來構建docker映象的檔案!命令引數指令碼!
構建步驟:
- 編寫一個dockerfile檔案
- docker build 構建稱為一個映象
- docker run執行映象
- docker push釋出映象(DockerHub 、阿里雲倉庫)
但是很多官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!
官方既然可以製作映象,那我們也可以!
3.2、DockerFile構建過程
基礎知識:
- 每個保留關鍵字(指令)都是必須是大寫字母
- 執行從上到下順序
- ”#“表示註釋
- 每一個指令都會建立提交一個新的映象曾,並提交!
Dockerfile是面向開發的,我們以後要釋出專案,做映象,就需要編寫dockerfile檔案,這個檔案十分簡單!
Docker映象逐漸成企業交付的標準,必須要掌握!
DockerFile:構建檔案,定義了一切的步驟,原始碼
DockerImages:通過DockerFile構建生成的映象,最終釋出和執行產品。
Docker容器:容器就是映象執行起來提供服務。
3.3、DockerFile常用指令
FROM # 基礎映象,一切從這裡開始構建
MAINTAINER # 映象是誰寫的, 姓名+郵箱
RUN # 映象構建的時候需要執行的命令
ADD # 步驟,tomcat映象,這個tomcat壓縮包!新增內容 新增同目錄
WORKDIR # 映象的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 保留埠配置
CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD # 當構建一個被繼承 DockerFile 這個時候就會執行ONBUILD的指令,觸發指令。
COPY # 類似ADD,將我們檔案拷貝到映象中
ENV # 構建的時候設定環境變數!
3.4、實戰測試
Docker Hub中 99% 映象都是從這個基礎映象過來的FROM scratch
, 然後配置需要的軟體和配置來進行的構建
建立一個自己的centos
1、新建dockerfile 檔案 並編輯指令碼儲存
FROM centos #指定繼承得父映象
MAINTAINER fangtao<[email protected]> #標註作者
ENV MYPATH /usr/local #設定環境變數
WORKDIR $MYPATH #指定初始工作目錄
RUN yum -y install vim #執行一些Linux命令 這裡是在安裝 vim 和 網路 命令
RUN yum -y install net-tools
EXPOSE 80 #指定暴露得埠
CMD echo $MYPATH #輸出一些資訊
CMD echo "---finish----"
CMD /bin/bash #指定這個容器啟動的時候要執行bash命令
2、通過這個檔案構建映象
[root@qiaoba docker-test-dockerfile]# docker build -f mycentos -t mycentos:1.0.1 .
#下面是構建映象日誌
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
---> 5d0da3dc9764
Step 2/10 : MAINTAINER fangtao<[email protected]>
---> Running in 835dd7444f92
Removing intermediate container 835dd7444f92
---> 8d8dae0fe87a
Step 3/10 : ENV MYPATH /usr/local
---> Running in 14a34c0c09b9
Removing intermediate container 14a34c0c09b9
---> 675a69afbf01
Step 4/10 : WORKDIR $MYPATH
---> Running in a9848f598e66
Removing intermediate container a9848f598e66
---> 67ef2b211da9
Step 5/10 : RUN yum -y install vim
---> Running in f23264f1a329
CentOS Linux 8 - AppStream 3.1 MB/s | 9.3 MB 00:03
CentOS Linux 8 - BaseOS 3.1 MB/s | 7.5 MB 00:02
CentOS Linux 8 - Extras 10 kB/s | 10 kB 00:01
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 k
which x86_64 2.21-12.el8 baseos 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 182 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 484 kB/s | 48 kB 00:00
(3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 1.6 MB/s | 1.4 MB 00:00
(4/5): which-2.21-12.el8.x86_64.rpm 76 kB/s | 49 kB 00:00
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 3.1 MB/s | 6.3 MB 00:02
--------------------------------------------------------------------------------
Total 1.9 MB/s | 7.8 MB 00:04
CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <[email protected]>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-12.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5
Verifying : which-2.21-12.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64
vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch
which-2.21-12.el8.x86_64
Complete!
Removing intermediate container f23264f1a329
---> c0d4413d2b1d
Step 6/10 : RUN yum -y install net-tools
---> Running in 8e9461e64a48
Last metadata expiration check: 0:00:19 ago on Mon Oct 4 04:17:34 2021.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 444 kB/s | 322 kB 00:00
--------------------------------------------------------------------------------
Total 238 kB/s | 322 kB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.52.20160912git.el8.x86_64
Complete!
Removing intermediate container 8e9461e64a48
---> 3a171cf83932
Step 7/10 : EXPOSE 80
---> Running in 96ff3ce70ee9
Removing intermediate container 96ff3ce70ee9
---> ce150e684a95
Step 8/10 : CMD echo $MYPATH
---> Running in 997908f0be1c
Removing intermediate container 997908f0be1c
---> f3465f21cdb7
Step 9/10 : CMD echo "---finish----"
---> Running in 77e532514004
Removing intermediate container 77e532514004
---> b3f5317a146b
Step 10/10 : CMD /bin/bash
---> Running in b1367e2d0839
Removing intermediate container b1367e2d0839
---> dcadd751b09c
Successfully built dcadd751b09c
Successfully tagged mycentos:1.0.1
[root@qiaoba docker-test-dockerfile]#
3.啟動映象
發現 進入了之前配置的工作目錄, 例如ifconfig這樣的網路命令已安裝成功
CMD 和 ENTRYPOINT區別
CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以追加命令
測試cmd
# 編寫dockerfile檔案
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
# 構建映象
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
# 執行映象
$ docker run cmd-test:0.1
.
..
.dockerenv
bin
dev
# 想追加一個命令 -l 成為ls -al
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed:container_linux.go:349: starting container process caused "exec: \"-l\":executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
# cmd的情況下 -l 替換了CMD["ls","-l"]。 -l 不是命令所有報錯
測試ENTRYPOINT
# 編寫dockerfile檔案
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我們的命令,是直接拼接在我們得ENTRYPOINT命令後面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
3.5、實戰:Tomcat映象
1、準備映象檔案
準備tomcat 和 jdk到當前目錄,編寫好README 。
2、編寫dokerfile
FROM centos #
MAINTAINER cheng<[email protected]>
COPY README /usr/local/README #複製檔案
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #複製解壓
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #複製解壓
RUN yum -y install vim
ENV MYPATH /usr/local #設定環境變數
WORKDIR $MYPATH #設定工作目錄
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #設定環境變數
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #設定環境變數
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #設定環境變數 分隔符是:
EXPOSE 8080 #設定暴露的埠
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 設定預設命令
3、構建映象
# 因為dockerfile命名使用預設命名 因此不用使用-f 指定檔案
$ docker build -t mytomcat:0.1 .
$ docker build -t diytomcat .
4、run映象
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs
mytomcat:0.1
5、訪問測試
6、釋出專案(由於做了卷掛載,我們直接在本地編寫專案就可以釋出了!)
發現:專案部署成功,可以直接訪問!
我們以後開發的步驟:需要掌握Dockerfile的編寫!我們之後的一切都是使用docker映象來發布執行!
3.6、釋出自己的映象
2、確定這個賬號可以登入
3、登入
$ docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username
4、提交 push映象.
# push自己的映象到伺服器上!$ docker push diytomcat
# 會發現push不上去,因為如果沒有字首的話預設是push到 官方的library
# 解決方法
# 第一種 build的時候新增你的dockerhub使用者名稱,然後在push就可以放到自己的倉庫了
$ docker build -t chengcoder/mytomcat:0.1 .
# 第二種 使用docker tag #然後再次push
$ docker tag 容器id chengcoder/mytomcat:1.0
#然後再次push
$ docker push kuangshen/tomcat:1.0
提交的時候也是按照映象的層級來提交的!
阿里雲映象服務上
1、登入阿里雲
2、找到容器映象服務
3、建立名稱空間
4、建立容器映象
看官網 很詳細https://cr.console.aliyun.com/repository/
$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]
# 修改id 和 版本
sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0
# 修改版本
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]