dockerweb應用文件存儲
1. 03-Docker存儲引擎
目前docker的默認存儲引擎為overlay2,不同的存儲引擎需要相應的文件系統支持,如需要磁碟分區的時候傳遞d-type穩健分層功能,即需要傳遞內核參數並開啟格式化磁碟的時候指定的功能
Docker 存儲引擎的核心思想是「層」的概念,理解了這個層,就基本可以理解它的設計思路。當我們拉取一個 Docker 鏡像的時候,可以看到如下:
一個鏡像被分成許多的「層」,每「層」包含了若乾的文件,而一層層堆疊起來就組成了我們的一個完整的鏡像。我們鏡像中的文件就是所有「層」文件的並集。 我們構建 Docker 鏡像一般採用 Dockerfile 的方式,而 Dockerfile 的每行命令,其實就會生成一個「層」,即使什麼文件都沒有添加。
文件的創建是在讀寫層增加文件,那修改和刪除呢?
這就要提一下 Docker 設計的 -on-write (CoW) 策略。
當我們試圖讀取一個文件時,Docker 會從上到下一層層去找這個文件,找到的第一個就是我們的文件。所以下面層相同的文件就被「覆蓋」了。而修改就是當我們找到這個文件時,將它「復制」到讀寫層並修改,這樣讀寫層的文件就是我們修改後的文件,並且「覆蓋」了鏡像中的文件了。而刪除就是創建了一個特殊的 whiteout 文件,這個 whiteout 文件覆蓋的文件即表示刪除了。
這樣的設計有什麼好處嗎?
第一個好處是減少了存儲空間,由於鏡像被分成了多個層,而各個層是靜態只讀的,是可以共享的。當你從一個鏡像構建另一個鏡像時,只需要添加新的層,原有的層不會被復制。
我們可以用 docker history 命令查看我們創建的鏡像,相同的層將共享且只保存一份。
我們可以在系統的 /var/lib/docker/<存儲驅動>/ 下看到我們所有的層。
第二個好處是啟動容器就變得非常輕量和快速。因為我們的容器只是添加了一個「空」的讀寫層,其他的都是復用的只讀層,需要用時才會去搜索。
Docker 的存儲引擎針對不同的文件系統,是由不同的存儲驅動。
Docker 主要有一下幾類存儲驅動:
有條件的情況下,我們還是建議選擇 overlay2 的存儲驅動。
linux 系統正常運行, 通常需要兩個文件系統:
OverlayFS 是從 aufs 之上改進和簡化而來的,比 aufs 和 devicemapper 有更好的性能,大部分情況下也比 btrfs 好。
OverlayFS 結構分為三個層: LowerDir 、 Upperdir 、 MergedDir
LowerDir、Upperdir、MergedDir 關系圖:
特性:
獲取鏡像存儲路徑
Lower層
LowerDir 層的存儲是不允許創建文件, 此時的LowerDir實際上是其他的鏡像的UpperDir層,也就是說在構建鏡像的時候, 如果發現構建的內容相同, 那麼不會重復的構建目錄,而是使用其他鏡像的Upper 層來作為本鏡像的Lower
Merged層
屬於對外展示層,只能在運行中的容器查看,鏡像是查看不了的
1)查看init層地址指向
容器在啟動的過程中, Lower 會自動掛載init的一些文件
2) init層主要內容是什麼?
init層是以一個uuid+-init結尾表示,放在只讀層(Lowerdir)和讀寫層(Upperdir)之間,
作用只是存放/etc/hosts、/etc/resolv.conf 等文件。
3) 為什麼需要init層?
(1) 容器在啟動以後, 默認情況下lower層是不能夠修改內容的, 但是用戶有需求需要修改主機名與域名地址, 那麼就需要添加init層中的文件(hostname, resolv.conf), 用於解決此類問題.
(2) 修改的內容只對當前的容器生效, 而在docker commit提交為鏡像時候,並不會將init層提交。
(3) init 文件存放的目錄為/var/lib/docker/overlay2/<init_id>/diff
4) 查看init層文件
hostname與resolv.conf 全部為空文件, 在系統啟動以後由系統寫入。
配置 Docker 存儲驅動非常簡單,只需要修改配置文件即可。
方法1
方法2
2. 修改docker遷移數據和修改默認存儲路徑
由於docker默認會存儲在 /var/lib/docker/ 目錄下,而該目錄又掛載在 / 根分區,隨著長時間的運行佔用的磁碟會越來侍察越多,而默認的根分區只有50G所以就要考慮遷移和修改docker的默認存儲路徑到一個新的分區上了亮坦。
通過修改docker.service文件,使用-g參數指定存儲位置,默認位置為/var/敬談桐lib/docker
找到 ExecStart這一行,加入 --graph /home/docker
到此遷移完成。
3. 怎麼把web應用程序搬到docker上
本文的目標是建判扒橡立一個Docker web app。這樣,掘旁你就可以直觀的感受,docker是如何部署一個web應用。
首先,我們此模建立一個空目錄來存放我們需要的文件。
我們建立的是一個node.js的web服務應用。、
4. 如何在docker中部署web應用
需要在當前目錄下建立如下三個文件。
1).gitignore
node_moles/*
2)package.json
{
"name": "docker-centos-hello",
"private": true,
"version"灶襪: "0.0.1",
"description": "Node.js Hello world app on CentOS using docker",
"author": "Daniel Gasienica <[email protected]>",
"dependencies": {
"express": "3.2.4"
}
}
3)server.js
var express = require('express'),
app = express(),
redis = require('redis'),
RedisStore = require('connect-redis')(express),
server = require('http').createServer(app);
app.configure(function() {
app.use(express.cookieParser('keyboard-cat'));
app.use(express.session({
store: new RedisStore({
host: process.env.REDIS_HOST || 'localhost',
port: process.env.REDIS_PORT || 6379,
db: process.env.REDIS_DB || 0
}),
cookie: {
expires: false,
maxAge: 30 * 24 * 60 * 60 * 1000
}
}));
});
app.get('/', function(req, res) {
res.json({
status: "ok"
});
});
var port = process.env.HTTP_PORT || 3000;
server.listen(port);
console.log('Listening on port ' + port);
配置銷辯知Dockerfile
我們需要通過Dockerfile來配置我們的docker鏡像。
FROM ubuntu:14.04
MAINTAINER zengjinlong <[email protected]>
RUN apt-get update
#Install Redis
RUN apt-get -y -qq install python redis-server
RUN apt-get -y -qq install wget
#Install Node
RUN cd /opt && \
wget http://nodejs.org/dist/v0.10.33/node-v0.10.33-linux-x64.tar.gz && \
tar -xzf node-v0.10.33-linux-x64.tar.gz && \
mv node-v0.10.33-linux-x64 node && \
cd /usr/local/bin && \
ln -s /opt/node/bin/* . && \
rm -f /opt/node-v0.10.33-linux-x64.tar.gz
#Set the working directory
WORKDIR /src
j
CMD ["/bin/bash"]
有了Dockerfile之後,就可以通過docker build來建立我們的鏡像。
docker build -t minimicall/node_web:0.1 .
這里需要說明的是,你需要靈活的根據你的ubuntu真實的環境來變化中間的指令。例如,當虧消我們第一次執行的時候,告訴我找不到python redis-server,我想應該是我的apt 源太out了,所以,我加了RUN apt-get update.就解決了這個問題。
當我wget的時候,說沒有這個指令,那麼我就得安裝wget.而nodejs的地址,也是我去從nodejs的官網查找的。所以碰到問題,具體問題具體分析。
查看我們建立的鏡像。
micall@micall-ThinkPad:~/docker/nodejs_web_app$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
minimicall/node_web 0.1 730770dff17f 6 minutes ago 268.7 MB
centos centos6 70441cac1ed5 2 weeks ago 215.8 MB
ubuntu 14.04 5506de2b643b 4 weeks ago 199.3 MB
啟動我們的鏡像:
sudo docker run -i -t --rm \
> -p 3000:3000 \
> -v `pwd`:/src \
> minimicall/node_web:0.1
這時候我們已經進入到了這個鏡像啟動的容器裡面了。
root@d80a2ed6b4c0:/src#
執行下列命令
root@d80a2ed6b4c0:/src# npm install --quiet > /dev/null
npm WARN engine [email protected]: wanted: {"node":"<0.9.0"} (current: {"node":"0.10.33","npm":"1.4.28"})
root@d80a2ed6b4c0:/src# npm install -g nodemon --quiet > /dev/null
root@d80a2ed6b4c0:/src# ls
Dockerfile Dockerfile~ index.js~ package.json server.js src
Dockerfile.centos index.js node_moles package.json~ server.js~
root@d80a2ed6b4c0:/src# nodemon server.js
22 Nov 14:37:31 - [nodemon] v1.2.1
22 Nov 14:37:31 - [nodemon] to restart at any time, enter `rs`
22 Nov 14:37:31 - [nodemon] watching: *.*
22 Nov 14:37:31 - [nodemon] starting `node server.js`
Listening on port 3000
這個時候用瀏覽器打開:http://localhost:3000/,會的到如下結果。
{
"status": "ok"
}
5. docker使用NFS解決數據存儲問題
NFS :Net File System 網路文件存儲系統
將雲存儲的磁碟掛載到本地計算機,本文所用的NFS提供商是阿里雲網路文件存儲系統。
1. 首先在阿里雲配置好網路文件存儲系統
具體文檔在擾睜該鏈接中:https://help.aliyun.com/document_detail/27526.html?spm=a2c4g.11186623.6.559.121b5ddemjaPZP
2. 在本地信含linux測試掛載
首先安裝nfs客戶端工具
sudo apt-get install nfs-common
掛載,執行下列命令後,即可看到 /mount-point 掛載點出現,有關mount和umount命令的使用,需要自行網路和谷歌
sudo mount -t nfs -o vers=4.0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-id-xxxx.region.nas.aliyuncs.com:/緩坦歲 /mount-point
3. 使用docker創建驅動為nfs類型的磁碟(volume,不推薦使用bind mount)
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.138.130,rw --opt device=:/data/nfs volume-nfs
4. 運行容器時,掛載 volume-nfs 磁碟即可
使用-v選項將volume掛載到容器上
docker run -dit --name data1 -v volume-nfs:/mnt ubuntu:16.04
6. docker在web開發中得使用流程是怎樣的
docker在web開發中得使用流程概述:
1、創建java鏡像:
把所有的文件都放置在docker目錄下,分別為不同的功能創建不同的目錄。
$ sudo mkdir docker/java
$ sudo cd docker/java
接下來在該目錄下創建一個jdk的Dockerfile文件,具體內容如下:
# openjdk 6
# version 1.0
FROM ubuntu:14.04
MAINTAINER mhy "[email protected]"
RUN apt-get update
RUN apt-get install -y -q openjdk-7-jdk
WORKDIR /
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
CMD ["/bin/bash"]
創斗譽建完Dockerfile之後來生成一個jdk的鏡像
$ sudo docker build -t pobaby/java .
以上已經實現了一個簡單的基於Docker容器運行的Java Web程空櫻段序。
7. docker網站如何保存
你只要把你的mysql資料庫容器啟動的時候,把數據文件的存儲目錄通過docker的volume掛載映射到主機磁碟上就基本問了,wordpress也可以同理把文件映射到主機磁碟上,這樣就好做備份什麼的了
8. 如何使用docker部署web應用
步驟一 - 創建Dockerfile
如下的Dockerfile可以滿足以上的要求:
**FROM** golang:1.6
*# Install beego and the bee dev tool*
**RUN** go get github.com/astaxie/beego && go get github.com/beego/bee
*# Expose the application on port 8080*
**EXPOSE** 8080
*# Set the entry point of the container to the bee command that runs the*
*# application and watches for changes*
**CMD** ["bee", "run"]
第一行,
FROM golang:1.6
將Go的官方映像文件作為基礎映像。該映像文件預安裝了 Go 1.6 . 該映像已經把 $GOPATH 的值設置到了 /go 。所有安裝在 /go/src 中的包將能夠被go命令訪問。
第二行,
RUN go get github.com/astaxie/beego && go get github.com/beego/bee
安裝 beego 包和 bee 工具。 beego 包將在應用程序中使用。 bee 工具用語在開發中再現地重新載入咱們的代碼。
第三行,
EXPOSE 8080
在開發主機上利用容器為應用程序開放8080埠。
最後一行,
CMD ["bee", "run"]
使用bee命令啟動應用程序的在線重新載入。
步驟二 - 構建image
一旦創建了Docker file,運行如下的命令來創建image:
docker build -t ma-image .
執行以上的命令將創建名為ma-image的image。該image現在可以用於使用該應用程序的任何人。這將確保這個團隊能夠使用一個統一的開發環境。
為了查看自己的系統上的image列表,運行如下的命令:
docker images
這行該命令將輸出與以下類似的內容:
REPOSITORY TAG IMAGE ID CREATED SIZE
ma-image latest 8d53aa0dd0cb 31 seconds ago 784.7 MB
golang 1.6 22a6ecf1f7cc 5 days ago 743.9 MB
注意image的確切名字和編號可能不同,但是,應該扮知槐至少看到列表中有 golang 和 ma-image image。
步驟三 - 運行容器
一旦 ma-image 已經完成,可以使用以下的命令啟動一個容器:
docker run -it --rm --name ma-instance -p 8080:8080 \
-v /app/MathApp:/go/src/MathApp -w /go/src/MathApp ma-image
讓咱們分析一下上面的命令來看看它做了什麼。
。docker run命令用於從一個image上啟動一個容器
。-it 標簽以交互的方式啟動容器
。--rm 標簽在容器關閉後將會將其清除
。--name ma-instance 將容器命名為ma-instance
。-p 8080:8080 標簽允許通過8080端廳友口訪問該容器
。-v /app/MathApp:/go/src/MathApp更復雜一些。它將主機的猛晌/app/MathApp映射到容器中的/go/src/MathApp。這將使得開發文件在容器的內部和外部都可以訪問。
。ma-image 部分聲明了用於容器的image。
執行以上的命令將啟動Docker容器。該容器為自己的應用程序開發了8080埠。無論何時做了變更,它都將自動地重構自己的應用程序。自己將在console(控制台)上看到以下的輸出:
bee :1.4.1
beego :1.6.1
Go :go version go1.6 linux/amd64
2016/04/10 13:04:15 [INFO] Uses 'MathApp' as 'appname'
2016/04/10 13:04:15 [INFO] Initializing watcher...
2016/04/10 13:04:15 [TRAC] Directory(/go/src/MathApp)
2016/04/10 13:04:15 [INFO] Start building...
2016/04/10 13:04:18 [SUCC] Build was successful
2016/04/10 13:04:18 [INFO] Restarting MathApp ...
2016/04/10 13:04:18 [INFO] ./MathApp is running...
2016/04/10 13:04:18 [asm_amd64.s:1998][I] http server Running on :8080
9. 構建docker鏡像,download依賴包存儲問題
Dockerfile 中每一條指令對應了image中的一層。從上到下,如果有一層發生變化,那麼這一層以後的層都要重新構建。 所以,在Docker 構建鏡像的最佳實踐,是要求把不經常變化的層放在Dockerfile 配置的最上層。 對於那些 一直不變的文件,應該做成base鏡像,構建新鏡像的時候從這個base鏡像開始構建。
可以嘗試一下添加一條指令,比如 RUN touch /home/test.txt ,看看從構建的鏡像運行的容器有沒有這個文件。
10. Docker部署WEB 應用
1、環境:阿里雲伺服器
2、CentOS7系統
3、Docker成功部署
這里前提docker 已經成功部署啦,現有有一個簡單的測試案例,在docker上部署一個應用從而訪問web。
接下來讓我們嘗試使用 docker 構建一個 web 應用程序。
我們將在docker容器中運行一個 Python Flask 應用來運行一個web應用。
通過 -p 參數來設置一樣的埠:
docker ps 查看正在運行的容器
容器內部的 5000 埠映射到我們本地主機的 5000 埠上。
這時我們可以通過瀏覽器訪問WEB應用
發現 訪問失敗
指定外網埠為5000,
1. 本地測試能否打開測試頁
本地沒有問題。
2. 瀏覽器中訪問
在任意一台電殲稿擾腦上輸入公網IP+埠號 (此埠號為運行WEB應用時指定的埠號5000) 如我的阿里雲公網IP為123.11.11.11 此時在任意氏旦一台有網路的瀏覽器地敬羨址欄輸入公網IP:http://123.11.11.11:5000 應該會出現測試頁
但現在出現如下圖所示:
顯示打不開
查啦大量資料,以前曾經也解決過,一定弄明白自已購買的地區後,再去設置安全組的配置規則。
***1. 登錄阿里雲管理控制台****
2.找到雲伺服器ECS-概覽
5. 手動添加埠5000
6. 最後保存,再從瀏覽器地址欄輸入公網IP加埠號5000成功顯示測試頁如圖: