天天看點

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

docker入門(利用docker部署web應用)

目錄

第一章 什麼是docker

1.1 docker的發展史

1.2 docker國内應用史

1.3 什麼是Docker

第二章 了解docker

2.1 docker思想

2.1.1 集裝箱

2.1.2 标準化

2.1.3 隔離

2.2 docker解決的問題

2.2.1 系統環境不一緻

2.2.2 系統好卡,哪個哥們又寫死循環了

2.2.3 雙11來了,伺服器撐不住了

第三章 走進docker

3.1 鏡像

3.2 容器

3.3 倉庫

第四章 centos下docker安裝

第五章 docker初體驗

5.1 docker基本指令

5.2 docker運作鏡像流程

第六章 docker運作nginx

6.1 運作nginx鏡像

6.2 docker網絡

6.2.1 網絡介紹

6.2.2 實際通路端口

第七章 docker部署第一個java web應用

7.1 制作自己的鏡像

7.2 運作自己的鏡像

第一章 什麼是docker

1.1 docker的發展史

2010年幾個年輕人成立了一個做PAAS平台的公司dotCloud.起初公司發展的不錯,不但拿到過一些融資,還獲得了美國著名孵化器YCombinator的支援,後來微軟谷歌亞馬遜這樣的大廠商也紛紛加入PAAS平台,競争十分激烈,dotCloud舉步維艱.

2013年可能是公司發展的不是很好,工程師又不想自己的努力付之東流,于是他們決定将他們的核心技術開源.這項技術就是docker.當時docker的功能就是将linux容器中的應用代碼打包,可以輕松的在伺服器之間進行遷移.

無心插柳柳成蔭,docker技術風靡全球,于是dotCloud公司改名為docker Inc,并全面投入到docker的開發之中.

2014.6 Docker釋出了第一個版本 Docker1.0

2014.7 獲得C輪融資 $4000W

2015.4 獲得D輪融資 $9500W

至今已經釋出到docker 

1.2 docker國内應用史

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

由此看出,不管開發測試還是運維,絕大多數人都應該會接觸到docker.是以學docker還是很有必要的.

1.3 什麼是Docker

docker是一個用來裝應用的容器,就像杯子可以裝水,筆筒可以放筆,書包可以放書,可以把hello word放在docker中,可以把網站放入docker中,可以把任何想得到的程式放在docker中.

官方解釋:

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

第二章 了解docker

2.1 docker思想

2.1.1 集裝箱

沒有集裝箱之前運輸貨物,東西零散容易丢失,有了集裝箱之後貨物不容易丢失,我們可以把貨物想象成程式,目前我們要把程式部署到一台新的機器上,可能會啟動不起來,比如少一些配置檔案什麼的或者少了什麼資料,有了docker的集裝箱可以保證我們的程式不管運作在哪不會缺東西.

2.1.2 标準化

1. 運輸方式

docker運輸東西有一個超級碼頭,任何地方需要貨物都由鲸魚先送到超級碼頭,然後再由鲸魚從超級碼頭把貨物送到目的地去.對應的技術來說,比如我們要把桌上型電腦的應用部署到筆記本上,我們可能選擇用QQ發過去或者用U盤拷過去,docker就标準化了這個過程,我們隻需在桌上型電腦上執行一個docker指令,把鲸魚派過來,把程式送到超級碼頭去,再在筆記本上執行一個docker指令,然後由鲸魚把程式從超級碼頭送到筆記本上去.

2. 存儲方式

當我們把程式存儲到筆記本上時,我們需要一個目錄,且我們要記住這個目錄,因為下次我們可能還要修改,有了docker之後我們就不用記住了程式在哪裡了,我們使用的時候隻需要一條指令就行了.

3. API接口

docker提供了一系列rest api的接口,包含了對docker也就是對我們的應用的一個啟動停止檢視删除等等,如當我們要啟動tomcat時我們要執行startup指令,當我們要停止時要執行shutdown指令,如果不是tomcat,我們可能還需要一些别的指令.有了docker我們記docker的指令就可以對其進行操作.

2.1.3 隔離

我們在使用虛拟機時有自己的cpu,硬碟,記憶體,完全感覺不到外面主機的存在,docker也差不多,不過它更輕量,我們建立虛拟機可能要幾分鐘,但是docker隻需要一秒.最底層的技術時linux一種核心的限制機制,叫做LXC,LXC是一種輕量級的容器虛拟化技術.最大效率的隔離了程序和資源.通過cgroup,namespace等限制,隔離程序組所使用的實體資源,比如CPU,MEMORY等等,這個機制在7,8年前已經加入到linux核心了,直到2013年docker出世的時候才火起來,大家可能奇怪為什麼這麼好的技術埋沒這麼多年都沒人發現呢?英雄造時勢,時勢造英雄,如果沒有雲計算,靈活開發,高頻度的彈性伸縮需求,沒有IT行業這麼多年長足的發展,也就沒有docker.

2.2 docker解決的問題

2.2.1 系統環境不一緻

開發:我本地沒問題.運維:伺服器沒問題. 這個問題就變成了皮球.

如果一個應用要正常的啟動起來需要什麼?比如java web應用.

需要一個作業系統,作業系統之上要jdk,tomcat,我們的代碼,配置檔案.

作業系統的改變可能會導緻我們的應用開不起來,比如我們調用了某些系統指令.

jdk版本也可能導緻程式的運作失敗.比如class檔案需要1.7編譯,我們裝了個1.6的jdk.

tomcat版本也能導緻失敗,比如舊的版本一些配置在新版本中不再支援.

代碼的話就比如應用了C槽,D盤的一個檔案,或者是用了系統的一些環境編碼.

配置的話我們可能少了某個配置檔案等等.

下面docker來了,它把作業系統,jdk,tomcat,代碼,配置全部放到集裝箱裡.再打包放到鲸魚上,由鲸魚給我們送到伺服器上,在我的機器上怎麼運作,在别的機器上也怎麼運作.不會有任何的問題.一句話就是docker解決了運作環境不一緻所帶來的問題.

2.2.2 系統好卡,哪個哥們又寫死循環了

如果有跟别人共用伺服器的同學可能有這樣的體會,莫名其妙發現自己的程式挂了,一查原因要不是記憶體不夠了,要不是硬碟滿了,還有就是發現某個服務變慢了,甚至敲終端都比較卡,但是linux本身就是一個多使用者的作業系統本身就可以供多個使用者使用,docker的隔離性可以解決這個問題,就算别人的程式還是死循環瘋狂吃CPU,還是封裝瘋狂打日志把硬碟占滿,還是記憶體洩漏,把記憶體占滿,都不會導緻我們的程式運作錯誤.因為docker在啟動的時候就限定好了,它最大使用的CPU硬碟,如果超過了,就會殺掉對應程序.

2.2.3 雙11來了,伺服器撐不住了

大部分系統業務量并不是每天都比較平均的,特别是一些電商系統,每天總有那麼幾天業務量是平時的幾倍甚至幾十倍,如果按雙11的規模去準備伺服器那麼對于平時的規模來說又是極大的浪費,是以就在節日前臨時擴充機器,過完節再把多餘的節點下線,這就給運維帶來了非常大的工作量,一到過節就在各個機器上部署各種各樣的服務,我們啟動程式需要java,tocmat等等,并且還可能起不來還要調試,這是非常惡心的工作,有了docker一切都變得美好了,隻要點一下伺服器就可以從10台變成100台甚至1000,1W台.都是分分鐘的事情.

為什麼會這麼快呢?都是用标準的方式把我們的程式運過來,下載下傳過來,再用标準的方式把它運作起來,就可以做到隻要在每台機器上都執行一兩條指令,就可以讓程式正常跑起來,并且不用擔心有問題.

第三章 走進docker

鏡像就是上面說的集裝箱,倉庫就是超級碼頭,容器就是我們運作程式的地方.docker運作程式的過程就是去倉庫把鏡像拉到本地,然後用一條指令把鏡像運作起來變成容器.

build:建構,就是建構鏡像.

ship:運輸,運輸鏡像,從倉庫和主機運輸.

run:運作的鏡像就是一個容器.

build,ship,run和鏡像,倉庫,容器是一一對應的.

3.1 鏡像

鏡像的英文名交image.前面我們講到了集裝箱,鲸魚拖着的所有集裝箱就是一個鏡像.

從本質上來說鏡像就是一系列檔案,可以包括我們應用程式的檔案,也可以包括我們應用的運作環境的檔案,既然是檔案,那麼是以什麼樣的格式在本地儲存的呢?

說到存儲格式,就要提到linux的一個存儲技術,叫做聯合檔案系統,是一種分層的檔案系統,可以将不同的目錄挂到同一個虛拟檔案系統下.

比如test1下有三個檔案夾,test2下有兩個檔案夾,還有一個readme檔案.聯合檔案系統就是可以在一個檔案夾(test)中看到多個檔案夾(test1,test2)中的内容.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

通過這種方式可以實作檔案的分層,test1可以把它看作第一層,test2可以把它看作第二層,每一層有每一層自己的檔案,docker就是利用了這種分層的概念實作了鏡像存儲.

下圖就是鏡像的存儲格式,這張圖是分層的,最下面一層,上面也是一層層的好像集裝箱羅列在一起.這就是鏡像最直覺的存儲方式.下面是作業系統的引導,上面是linux作業系統,再上面是一些相關的軟體,如果是我們自己的程式,就可以是tomcat,jdk,再往上是應用代碼,每一層是我們自己都可以控制得,最上面一層先忽略不看,因為這是和容器有關的.注意一點,docker鏡像系統的每一層都是隻讀的,然後把每一層加載完成之後這些檔案都會被看成是同一個目錄,相當于隻有一個檔案系統.docker的這種檔案系統被稱之為鏡像.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

圖1

3.2 容器

為了便于了解,大家可以把容器想象成虛拟機,每個虛拟機都有自己的檔案系統,可以把圖1整個一部分看成是檔案系統,與虛拟機系統的差別是這裡面的檔案系統是一層一層的,并且最下面的n層都是隻讀的,隻有上面一層是可寫的.為什麼要有可寫的這層呢?大家的程式運作起來,勢必會要寫一些日志,寫一些檔案,或者對系統的某一些檔案做一些修改,是以容器在最上面一層建立了可讀可寫的檔案系統.

在程式的運作過程中,如果要寫鏡像檔案時,因為鏡像的每一層都是隻讀的,它會把檔案的每一層拷到檔案的最上層,然後再對它進行修改,修改之後,當我們的應用讀一個檔案時會從頂層進行查找,如果沒有才會找下一層.

由于容器的最上一層是可以修改的,鏡像是不能修改的,這樣就能保證鏡像可以生成多個容器獨立運作,沒有任何幹擾.

3.3 倉庫

我們的鏡像是要在其它機器上運作,如何進行傳輸呢?

這就用到了docker倉庫,我們要先把我們的鏡像傳到docker倉庫中,再由目的地把docker倉庫拉過去,這就完成了這樣的一次傳輸過程.

誰提供了這樣的倉庫呢?docker自己提供了,hub.docker.com,但是非常慢,為了解決這個問題,國内很多公司也在做自己的倉庫.比較知名的是由網易蜂巢提供的 https://c.163yun.com/hub#/m/home/

第四章 centos下docker安裝

因為我這裡使用的是centos是以就在centos下安裝.

參考部落格與網站:

https://www.jb51.net/article/161580.htm

https://blog.csdn.net/jsnhux/article/details/89847109

https://docs.docker.com/install/linux/docker-ce/centos/

1. Docker 要求 CentOS 系統的核心版本高于 3.10,檢視本頁面的前提條件來驗證你的CentOS 版本是否支援 Docker 。

通過 uname -r 指令檢視你目前的核心版本

2.  如果安裝過請先解除安裝

yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine
           

3.安裝依賴設定yum倉庫

安裝依賴:

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
           

設定倉庫:

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
           

4. 安裝docker

yum install docker-ce docker-ce-cli containerd.io
           

5. 啟動并加入開機啟動

systemctl start docker
           

6.驗證是否安裝成功

docker version
           

顯示如下即安裝成功! 

Client: Docker Engine - Community
 Version:           20.10.3
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        48d30b5
 Built:             Fri Jan 29 14:34:14 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.3
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       46229ca
  Built:            Fri Jan 29 14:32:37 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

           

測試運作Hello-World

[[email protected] zcapp]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
           

第五章 docker初體驗

5.1 docker基本指令

1.docker pull [options] NAME[:TAG]

通過此指令可以docker遠端倉庫拉取鏡像到本地.

name是拉取鏡像的名稱,:TAG表示是可選的,如果不選表明時latest,如果選擇表明是指定版本的.

options是拉去的一些參數.

當不加請求位址的時候回去docker的官網拉取鏡像.

2.docker images [options] [REPOSITORY[:TAG]]

options是選項,後面是指定鏡像的名稱.這個用的不多,可能當本地鏡像非常多的時候要指定檢視某一個鏡像.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

IMAGE ID 其實是一個64位的字元串,它可以唯一辨別我們的鏡像,這裡隻顯示了16位,後面的被截掉了.

3. docker run [options] IMAGE[:TAG] [COMMAND] [ARG..]

IMAGE是鏡像的名字

COMMAND是運作起來的時候要執行什麼指令.

ARG表示這條指令運作需要的參數.

5.2 docker運作鏡像流程

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

docker pull:首先docker pull向docker daemon發送了一條指令pull,告訴docker daemon要拉取某一個鏡像,docker daemon會在本機檢查鏡像是否存在,如果存在且版本就是我們想要拉取的版本,它就不會做任何的操作.如果不存在下一步它會到docker的倉庫中找我們要拉取的鏡像名字,如果找到了就會有docker倉庫傳送到我們的本地,把我們要的鏡像傳送到我們的本地來.

docker run:首先把指令發送到我們的docker daemon,docker daemon會先檢查鏡像在本機是否存在,如果不存在相當于執行了一個docker pull的過程,下載下傳回來之後會以一定方式把鏡像運作起來變成docker容器.

第六章 docker運作nginx

6.1 運作nginx鏡像

我們打開網易蜂巢鏡像中心 https://c.163yun.com/hub#/m/home/

搜尋nginx,可以看到有兩個nginx,他們的名字和頭上和圖示都不一樣,一個是鲸魚,一個是兩個球.

帶有鲸魚的鏡像表示這個鏡像是從官網的鏡像中心複制過來的.這個鏡像與docker的鏡像是一摸一樣的.我們使用此鏡像.

點進去,會有下載下傳位址,複制裡面的位址,然後拉取鏡像.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

複制到系統中運作.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

運作完後可以檢視鏡像狀态

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

在前台運作容器指令如下,輸入後容器就會運作,按ctrl+c可以終止容器的運作.

docker run hub.c.163.com/library/nginx
           

在背景運作容器:

docker run -d hub.c.163.com/library/nginx
           
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

檢視運作的容器:

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

更多關于運作的指令:

docker run --help
           

因為我們在平時運作的時候需要調試容器内部的設定、檢視一下日志等等.我們可以通過如下指令進入容器内部:

指令的大體内容:

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

指令具體内容: 

 -i保證我們的輸入有效,即使在沒有detach的情況下也能運作.

-t表示将配置設定給我們一個僞終端.我們将在僞終端輸入我們的内容.

後面跟着的是容器的id,即我們上面用ps查詢出來的id,這個id可以少寫幾位,它會自動識别.

可輸入如下指令了解更多:

docker exec --help
           

輸入指令後發現我們前面的辨別也變了,相當于進入了一個新的電腦.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

可以查詢一下nginx在什麼位置

which nginx
           

打開ps檢視一下目前運作的程序.我這裡提示沒有ps指令.我從網上查了一下發現是因為目前系統沒有安裝這個指令,然後我安裝了一下.從指令可以看出,這個nginx容器附帶的系統應該是ubuntu不是centos.

安裝ps指令:

-get update
 
apt-get install procps
           

利用ps指令檢視程序,可以發現nginx已經在運作了.

ps -ef
           
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

輸入 exit即可退出傳回原來的系統. 

6.2 docker網絡

6.2.1 網絡介紹

上面我們隻運作了nginx,并沒有用浏覽器進行通路,這裡我們嘗試用浏覽器通路,但是之前我們要了解一下docker網絡.

我們直到docker的隔離性,網絡也是個隔離性的一部分,linux使用了命名空間來進行資源的隔離,比如pid namespace就是用來隔離程序的,mount namespace是用來隔離檔案系統的,network namespace 是用來隔離網絡的.每一個network namespace都提供了一個獨立的網絡環境,包括網卡路由iptable規則等等,都是與以其它的network space隔離的.

1. docker容器在預設情況下,一般會配置設定一個獨立的network-namespace,也就是網絡類型中的Bridge模式.

在使用Bridge時就涉及到了一個問題,既然它有獨立的namesapce,這就需要一種技術使容器内的端口可以在主機上通路到,這種技術就是端口映射,docker可以指定你想把容器内的某一個端口可以在容器所在主機上的某一個端口它倆之間做一個映射,當你在通路主機上的端口時,其實就是通路容器裡面的端口.

2. 還有一種類型是Host模式,如果在啟動容器的時候指定使用Host模式,那麼這個容器将不會獲得一個獨立的network namespace,而是和主機共同使用一個,這個時候容器将不會虛拟出自己的網卡,配置出自己的ip.而是使用主控端上的ip和端口.也就是說在docker上使用網絡和在主機上使用網絡是一樣的.

3. 還有一種網絡類型是None.也就是沒有網絡,這種情況docker将不會和外界的任何東西進行通訊.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

6.2.2 實際通路端口

剛才我們在運作nginx鏡像的時候并沒有指定端口映射,是以我們這裡停掉nginx容器.

docker stop containerId
           
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

1. -p(小寫)是開放一個容器的端口到主機上

在背景運作,開放主機8080端口映射到容器的80端口上.

docker run -d -p 8080:80 hub.c.163.com/library/nginx
           

檢視主機8080端口是否開啟

netstat -na |grep 8080
           
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

是開啟的那麼通路 主機ip:8080 即可通路到nginx.

2. -P(大寫)是開放容器所有的端口到主機上一個随機的端口.

停掉剛才的docker服務.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

使用大P

docker run -d -P hub.c.163.com/library/nginx
           

可以看到随機給我的端口是32768 

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

然後用 ip:32768去通路即可通路到nginx. 

第七章 docker部署第一個java web應用

我們還需要學習Dockerfile,它告訴docker我們怎樣制作我們的鏡像,我們鏡像的每一步操作分别是什麼,寫好Dockerfile後我們私用docker build指令執行Dockerfile裡面的每一件事情.最終會把Dockerfile建構出來.

在這裡因為是做一個示範,是以我們使用了一個開源的java web應用Jpress.

7.1 制作自己的鏡像

1. 從網易的鏡像中心找一個tomcat的鏡像

docker pull hub.c.163.com/library/tomcat:latest

因為tomat鏡像肯定有jdk,是以我們就不用單獨再裝jdk了.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

2.編寫dockerfile

我們需要建立一個dockerfile告訴docker需要做什麼,這裡我建立了Dockerfile,并将我們的web檔案放到了和它同一個目錄下.

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

首先我們的鏡像是要運作在tomcat中的,是以填寫 from tomcat,以tomcat為基礎.maintainer是所有者的意思.因為war包是要放在webapps中的,是以我們使用copy指令複制到tomcat的webapps.

為什麼webapps在local中?我們可以去下載下傳鏡像的網站查詢,向下拉就好了.具體網址 : https://c.163yun.com/hub#/m/repository/?repoId=2955

這裡說一個個人猜想,每個容器都包含一個自己的系統,是以這裡的/usr/local/tomcat/webapps指的是tomcat容器中的位置,那麼哪裡指定是tomcat容器呢?就是在一開始的from指定的.

from hub.c.163.com/library/tomcat
 
maintainer zhangchen [email protected]
 
COPY jpress.war /usr/local/tomcat/webapps
           

3.建構容器

注意這裡是有個點的,點标明是在根據目前目錄建構

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

可以使用docker images檢視鏡像是否build成功

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

發現一個none,表明建構成功了.

可以重新建構給它起個名字 -t是給鏡像指定一個tag

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

更多的參數查詢:

docker build --help
           

7.2 運作自己的鏡像

運作我們制作的鏡像并指定端口

docker run -d -p  8080:8080 jpress
           

通路我們的網站,發現網站已經可以正常通路了.

然後發現它要求我們安裝自己的資料庫,是以我們利用docker安裝mysql.

在鏡像中心搜尋并拉取mysql

docker pull hub.c.163.com/library/mysql:latest
           

在鏡像中心檢視配置,并配置root使用者密碼

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub.c.163.com/library/mysql
           

 發現我們沒有建立資料庫,于是停止這個容器的運作,并在與劇中建立jpress資料庫.

docker stop 4be94fb2df1d3a28c1
           
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql
           

這樣我們的資料庫就建立成功了.

進入網站後要輸入網站資訊,輸入資料庫位址時,注意不要輸入localhost,因為我們jpress是運作在容器内的,我們會通路tomcat容器内的3306,我們應該用ifconfig查詢我們本機的ip位址.我這裡的内網ip是172.17.10.68

docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用
docker入門(利用docker部署web應用)docker入門(利用docker部署web應用)第一章 什麼是docker第二章 了解docker 第三章 走進docker第四章 centos下docker安裝 第五章 docker初體驗 第六章 docker運作nginx 第七章 docker部署第一個java web應用

以上都做完後,我們的網站就可以跑起來了.

http://59.110.164.62:8080/jpress/