當前位置:首頁 » 存儲配置 » dockerweb應用文件存儲

dockerweb應用文件存儲

發布時間: 2023-05-25 06:30:35

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依賴包存儲問題

  1. Dockerfile 中每一條指令對應了image中的一層。從上到下,如果有一層發生變化,那麼這一層以後的層都要重新構建。 所以,在Docker 構建鏡像的最佳實踐,是要求把不經常變化的層放在Dockerfile 配置的最上層。 對於那些 一直不變的文件,應該做成base鏡像,構建新鏡像的時候從這個base鏡像開始構建。

  2. 可以嘗試一下添加一條指令,比如 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成功顯示測試頁如圖:

熱點內容
java電話簿 發布:2025-02-07 19:49:26 瀏覽:795
超級腳本製作 發布:2025-02-07 19:31:30 瀏覽:486
怎麼查看支付寶的賬號密碼 發布:2025-02-07 19:26:48 瀏覽:16
惠普伺服器查看ip指令 發布:2025-02-07 19:26:47 瀏覽:434
演算法設計模式 發布:2025-02-07 19:15:52 瀏覽:745
伺服器1u能連接幾台電腦 發布:2025-02-07 18:50:02 瀏覽:153
立人編譯 發布:2025-02-07 18:48:32 瀏覽:765
日產途達四驅的有哪些配置 發布:2025-02-07 18:42:02 瀏覽:832
伺服器搭建鏡像站 發布:2025-02-07 18:41:55 瀏覽:377
游戲上雲成標配雲伺服器該怎麼選 發布:2025-02-07 18:26:13 瀏覽:141