摘要:安裝完成后,可以用以下命令查看下版本信息。另外,如果要?jiǎng)h除剛運(yùn)行的兩個(gè)容器,可以總結(jié)本文從數(shù)據(jù)持久化開(kāi)始說(shuō)起,淺談了和并附送如何用這兩種方式分別搭建環(huán)境,并在對(duì)比中展示了它們各自的特點(diǎn)。
上一文中提到,每次對(duì)容器做了改動(dòng),如果不把它 commit 成新的鏡像,在刪除容器后,數(shù)據(jù)也會(huì)丟失,有沒(méi)有什么更好的辦法來(lái)保存數(shù)據(jù)呢?使用數(shù)據(jù)卷就可以解決這個(gè)問(wèn)題。
另外,相對(duì)于用 commit 容器創(chuàng)建鏡像,使用 Dockerfile 在創(chuàng)鏡像的同時(shí)還可以包含很多命令進(jìn)去,可以簡(jiǎn)化后續(xù)操作。
對(duì)于需要用到多個(gè)容器的應(yīng)用,Docker 也提供了更強(qiáng)大的工具 Compose 來(lái)管理容器。
本文就將淺談 Docker 的 數(shù)據(jù)管理、Dockerfile、Compose 這三個(gè)方面,同時(shí)用實(shí)例來(lái)演示,助你快速掌握 Docker 基本技能。
環(huán)境說(shuō)明:上一篇文章我用的是 Ubuntu,這篇文章?lián)Q win 來(lái)玩玩。用的 shell 是 CMD(美化版)。
win 下,配置鏡像加速也非常方便,只需要在如下位置填寫阿里云的專屬加速地址就可以了。
從 MySQL 實(shí)例來(lái)看數(shù)據(jù)管理如果我們運(yùn)行了一個(gè) MySQL 容器,數(shù)據(jù)庫(kù)等信息就是存放在容器內(nèi)的,停止容器到還沒(méi)事,一旦我們?cè)趧h除容器之前忘了導(dǎo)出數(shù)據(jù),那么所有的數(shù)據(jù)就會(huì)丟失。這是非常 不安全 的。
況且就算我們不會(huì)忘了在刪除容器之前導(dǎo)出數(shù)據(jù),如果要用到多個(gè)需要存儲(chǔ)數(shù)據(jù)的容器,我們也要一個(gè)一個(gè)把數(shù)據(jù)導(dǎo)出來(lái)嗎?這是非常 不方便 的。
而 Docker 就提供了一個(gè)獨(dú)立于容器之外的存儲(chǔ)技術(shù) 數(shù)據(jù)卷(Volume),數(shù)據(jù)卷的本質(zhì)是一個(gè)文件目錄,它可以是本機(jī)的目錄也可以是一個(gè)容器中的目錄(如果把數(shù)據(jù)卷放在了一個(gè)多帶帶的容器中,這個(gè)容器也被稱為 數(shù)據(jù)卷容器)。
使用 數(shù)據(jù)卷 就可以將多個(gè)容器內(nèi)的數(shù)據(jù)多帶帶 持久化 在一個(gè)本機(jī)目錄或者一個(gè)多帶帶的容器中了。
例如下面這個(gè)例子:
$ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql -e MYSQL_DATABASE=jpress -e MYSQL_ROOT_PASSWORD=root mysql
-d 后臺(tái)運(yùn)行,-p 映射本機(jī)端口 3307 到容器內(nèi)的 3306 ,--name是指定容器的別名,-v local-dir:container-dir 將本地的目錄作為數(shù)據(jù)卷掛載到容器內(nèi)的目錄進(jìn)行數(shù)據(jù)持久化,-e 是 mysql 的參數(shù),后面跟上 MySQL 的環(huán)境變量,/var/lib/mysql是 MySQL 存儲(chǔ)數(shù)據(jù)的目錄。
-e MYSQL_DATABASE= 可以指定運(yùn)行容器時(shí)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),-e MYSQL_ROOT_PASSWORD= 指定 MySQL 的密碼,MySQL 用戶名默認(rèn)是 root。
上面的那條命令雖長(zhǎng),但主要的操作是數(shù)據(jù)持久化的那一步,下面我們來(lái)驗(yàn)證一下,數(shù)據(jù)究竟有沒(méi)有被持久化:
$ docker pull mysql $ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql -e MYSQL_DATABASE=jpress -e MYSQL_ROOT_PASSWORD=root mysql $ docker stop sql $ docker rm sql $ docker run -d -p 3307:3306 --name sql -v E:/jpress/mysql:/var/lib/mysql mysql $ docker exec -it sql bash $ SHOW DATABASES;
有圖有真相:
圖中的文字已經(jīng)足夠說(shuō)明做數(shù)據(jù)持久化的好處了。
DockerfileDockerfile 是一個(gè) 配置文件,里面可以放多條處理命令,一次配置好了可以簡(jiǎn)化后續(xù)的部分操作。需要注意的是,一個(gè) Dockerfile 只能包含一個(gè)基礎(chǔ)鏡像,就像函數(shù)一樣,一個(gè)配置文件只干一件事。
一個(gè) Dockerfile 里面一般有兩類信息:
基礎(chǔ)鏡像和維護(hù)者的信息
多條操作鏡像和容器的命令
下面通過(guò)創(chuàng)建自己的 Tomcat 鏡像來(lái)演示 Dockerfile 的用法(Tocmcat 已包含 JDK):
vi Dockerfile
在 Dockerfile 中寫入以下信息,#后面的是注釋:
#基礎(chǔ)鏡像和維護(hù)者的信息 #使用一個(gè) Tomcat 鏡像作為基礎(chǔ)鏡像 From tomcat #注明創(chuàng)建者的信息,也可以不寫 MAINTAINER stormxing#多條操作鏡像和容器的命令(這里舉例一條) #復(fù)制 war 包到鏡像內(nèi)的 webapps 目錄里 COPY jpress.war /usr/local/tomcat/webapps
這里用到的 war 包是一個(gè)開(kāi)源的 Java 博客,官網(wǎng)是:
https://github.com/JpressProj...
war 包我已經(jīng)打好了,下載地址是:
http://stormxing.oss-cn-beiji...
接下來(lái)用 Dockerfile 構(gòu)建我們的鏡像:
docker build -t myweb .
-t myweb是為新的鏡像起一個(gè)名字,.表示 Dockerfile 的路徑,由于是它在當(dāng)前路徑所以是 .
然后,運(yùn)行鏡像后訪問(wèn)localhost:8080/jpress,就可以看到網(wǎng)頁(yè)了。
$ docker run -d -p 8080:8080 myweb
點(diǎn)下一步之后按提示輸入信息,還記得嗎,上面我們已經(jīng)搞定數(shù)據(jù)庫(kù)了(沒(méi)想到吧),這里直接填寫信息既可以了,這個(gè)數(shù)據(jù)庫(kù)主機(jī)并不是 localhost ,而是容器外的 ip,也就是我們的本機(jī) ip,用 ipconfig就能查到。
最后點(diǎn)下一步,按提示設(shè)置后臺(tái)登陸的用戶名和密碼,輸入localhost:8080/jpress/admin就可以進(jìn)入到后臺(tái)管理頁(yè)面。
至此,我們還 順便 知道了如何用 Docker 搭建 JavaWeb 環(huán)境了。
多容器應(yīng)用工具(Compose)一個(gè) Dockerfile 能包含一個(gè)基礎(chǔ)鏡像,而比較復(fù)雜的項(xiàng)目是要用多個(gè)容器部署的,一個(gè)一個(gè)創(chuàng)建還是有點(diǎn)麻煩的,而 Compose 就是一個(gè)管理多容器應(yīng)用的工具。
Compose 安裝Docker-compose 只有在 Linux 上是需要多帶帶下載的,Windows 和 Mac 自帶。并且它是放在 GitHub 上面維護(hù)的,所以國(guó)內(nèi)從 GitHub 上下載它速度非常慢,可以訪問(wèn)下面的地址從 daocloud 下載鏡像。
https://get.daocloud.io/#inst...
執(zhí)行以下兩條命令即可完成安裝。
$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose
安裝完成后,可以用以下命令查看下版本信息。
$ docker-compose --version從 jpress 來(lái)看 docker-compose
docker-compose 類似于 Dockerfile,也是一個(gè)配置文件,但不同的是,一個(gè) Dockerfile 只能跑一個(gè)鏡像,而 docker-compose 就能一次跑多個(gè),而且還能配合 Dockerfile 來(lái)使用。
這里我們演示用 docker-compose 來(lái)跑 jpress。
編寫配置文件(這個(gè)文件名同 Dockerfile 一樣是約定好的)
vi docker-compose.yml
填寫以下內(nèi)容:
version: "3" services: mysql: image: mysql ports: - "3307:3306" volumes: - "E:/jpress/sql:/var/lib/mysql" container_name: sql environment: MYSQL_DATABASE: jpress MYSQL_ROOT_PASSWORD: root tomcat: build: . ports: - "8080:8080" container_name: web
注意縮進(jìn),tomcat 和 mysql 都是包含在 services 下面的。build: .指調(diào)用之前寫的 Dockerfile 來(lái)運(yùn)行 Tomcat,MySQL 的數(shù)據(jù)卷注意要重新創(chuàng)建,否則會(huì)使用之前的數(shù)據(jù),其他的在之前都見(jiàn)到過(guò),看字段的名字就知道意思了。
我這個(gè)文件是新建在 Dockerfile 的同一個(gè)目錄里的:
執(zhí)行一下命令就能運(yùn)行了,結(jié)果跟上面的構(gòu)建方式是一樣的
$ docker-compose up -d
如此看來(lái)用 docker-compose 果然簡(jiǎn)化了很多操作,只需要一次配置好,然后直接運(yùn)行就可以了。
另外,如果要?jiǎng)h除剛運(yùn)行的兩個(gè)容器,可以:
$ docker-compose stop $ docker-compose rm總結(jié)
本文從數(shù)據(jù)持久化開(kāi)始說(shuō)起,淺談了 Dockerfile 和 docker-compose 并附送如何用這兩種方式分別搭建 JavaWeb 環(huán)境,并在對(duì)比中展示了它們各自的特點(diǎn)。
最后結(jié)合 上篇文章 畫張導(dǎo)圖送給你,可不是用來(lái)收藏的喲:
本文用到的所有文件已整理到 GitHub:
https://github.com/stormxing/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27244.html
摘要:如今前端工程越來(lái)越復(fù)雜,打造一個(gè)好用的工作流也顯得越來(lái)越重要。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令,則會(huì)覆蓋掉指定的命令。個(gè)人感覺(jué)在項(xiàng)目多協(xié)作人數(shù)多的情況下,還是很方便的。 showImg(https://segmentfault.com/img/remote/1460000011553749?w=1100&h=225); 如今前端工程越來(lái)越復(fù)雜,打造一個(gè)好用的工作流也顯得越來(lái)越重要。本...
摘要:如今前端工程越來(lái)越復(fù)雜,打造一個(gè)好用的工作流也顯得越來(lái)越重要。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令,則會(huì)覆蓋掉指定的命令。個(gè)人感覺(jué)在項(xiàng)目多協(xié)作人數(shù)多的情況下,還是很方便的。 showImg(https://segmentfault.com/img/remote/1460000011553749?w=1100&h=225); 如今前端工程越來(lái)越復(fù)雜,打造一個(gè)好用的工作流也顯得越來(lái)越重要。本...
摘要:接下來(lái),我們來(lái)看一個(gè)更酷的工作流程,即通過(guò)引入來(lái)實(shí)現(xiàn)項(xiàng)目的持續(xù)集成。是一個(gè)持續(xù)集成發(fā)布平臺(tái),支持對(duì)容器進(jìn)行測(cè)試。取消對(duì)的選中狀態(tài)。 showImg(https://segmentfault.com/img/bVk4cF); 借助Docker,我們可以更容易地進(jìn)行web應(yīng)用部署,而同時(shí)不必頭疼于項(xiàng)目依賴、環(huán)境變量以及各種配置問(wèn)題,Docker可以快捷、高效地處理好這一切。 而這也是本...
摘要:看看它里面的鏡像是怎么寫的還是很有收獲的相關(guān)不正宗入門教程啟動(dòng)一個(gè)容器不正宗入門教程構(gòu)建一個(gè)鏡像不正宗入門教程使用博客原文 本章通過(guò)一個(gè)具體的demo來(lái)了解 docker-compose docker-compose 是做什么的 在構(gòu)建一個(gè)完整的服務(wù)時(shí),我們通常啟動(dòng)一個(gè)容器, 一旦出現(xiàn)多個(gè)容器需要同時(shí)啟動(dòng)的時(shí)候手打是下下之策, 因?yàn)闀r(shí)間一長(zhǎng)難免會(huì)忘記細(xì)節(jié),寫腳本也不是不可以,但是大家沒(méi)...
摘要:聯(lián)調(diào)測(cè)試,無(wú)需依賴他人。針對(duì)以上問(wèn)題,有兩種解決方法,一個(gè)是自己搭建私有服務(wù),另一個(gè)是用云服務(wù)的鏡像管理平臺(tái)如阿里云的容器鏡像服務(wù)。利用,先對(duì)阿里云的服務(wù)進(jìn)行登錄。推送后,就能在阿里云的倉(cāng)庫(kù)上看到這個(gè)鏡像。 Docker簡(jiǎn)述 Docker是一種OS虛擬化技術(shù),是一個(gè)開(kāi)源的應(yīng)用容器引擎。它可以讓開(kāi)發(fā)者將應(yīng)用打包到一個(gè)可移植的容器中,并且該容器可以運(yùn)行在幾乎所有l(wèi)inux系統(tǒng)中(Windo...
閱讀 1202·2021-11-22 15:24
閱讀 4511·2021-09-23 11:51
閱讀 2348·2021-09-08 09:36
閱讀 3540·2019-08-30 15:43
閱讀 1319·2019-08-30 13:01
閱讀 1142·2019-08-30 12:48
閱讀 567·2019-08-29 12:52
閱讀 3392·2019-08-29 12:41