1. 程式人生 > 其它 >Docker 學習筆記 (續)

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映象的檔案!命令引數指令碼!

構建步驟:

  1. 編寫一個dockerfile檔案
  2. docker build 構建稱為一個映象
  3. docker run執行映象
  4. docker push釋出映象(DockerHub 、阿里雲倉庫)

但是很多官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!

官方既然可以製作映象,那我們也可以!

3.2、DockerFile構建過程

基礎知識:

  1. 每個保留關鍵字(指令)都是必須是大寫字母
  2. 執行從上到下順序
  3. ”#“表示註釋
  4. 每一個指令都會建立提交一個新的映象曾,並提交!

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、釋出自己的映象

1、地址 https://hub.docker.com/

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:[映象版本號]

3.7 小結