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