成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用

這篇文章主要講解了“怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用”吧!

成都創(chuàng)新互聯(lián)公司是一家以網(wǎng)站設(shè)計(jì)建設(shè),小程序設(shè)計(jì)、網(wǎng)站開(kāi)發(fā)設(shè)計(jì),網(wǎng)絡(luò)軟件產(chǎn)品開(kāi)發(fā),企業(yè)互聯(lián)網(wǎng)推廣服務(wù)為主的民營(yíng)科技公司。主要業(yè)務(wù)涵蓋:為客戶提供網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站開(kāi)發(fā)、域名申請(qǐng)、網(wǎng)站優(yōu)化排名、買(mǎi)友情鏈接等服務(wù)領(lǐng)域。憑借建站老客戶口碑做市場(chǎng),建設(shè)網(wǎng)站時(shí),根據(jù)市場(chǎng)搜索規(guī)律和搜索引擎的排名收錄規(guī)律編程,全力為建站客戶設(shè)計(jì)制作排名好的網(wǎng)站,深受老客戶認(rèn)可和贊譽(yù)。

近些年來(lái),Docker由于提供了一套非常方便地創(chuàng)建并運(yùn)行應(yīng)用容器的方法,而在全球掀起了一股容器化的熱潮。容器通過(guò)將軟件及其所需要的運(yùn)行環(huán)境一同打包帶走,從而將人們從依賴的苦海中拯救出來(lái)。雖然Docker設(shè)計(jì)的初衷并不是操作系統(tǒng)容器,更不是一個(gè)直接運(yùn)行在裸機(jī)上的操作系統(tǒng),但是docker這套強(qiáng)大的工具也會(huì)給我們管理操作系統(tǒng)帶來(lái)巨大的便利。


為什么要用Docker鏡像當(dāng)作桌面系統(tǒng)?這就要從普通桌面系統(tǒng)的不方便之處說(shuō)起。通常我們都擁有不止一臺(tái)電腦,我們希望這些電腦能夠保持一致。這里所說(shuō)的“一致”,用一個(gè)例子來(lái)講,就是我在一臺(tái)電腦上編輯了一半的文件,不需要認(rèn)為拷貝到另一臺(tái)電腦上,而是直接打開(kāi)電腦就能編輯。如果這個(gè)文件只是一個(gè)純文本文件,或者一個(gè)Microsoft  Word文檔,那么實(shí)現(xiàn)這個(gè)一致性非常簡(jiǎn)單:把文件扔到Dropbox之類的云同步盤(pán)就好。然而對(duì)于專業(yè)用戶來(lái)講,這種一致性的保持并非單純的扔到Dropbox里面那么簡(jiǎn)單:比如說(shuō)你最近忙于一個(gè)項(xiàng)目,這個(gè)項(xiàng)目要用到若干編程語(yǔ)言,然后在電腦里裝了一堆庫(kù),一堆工具軟件,有圖形界面的,也有命令行的。在工作的過(guò)程中,你有可能不斷安裝新的工具,或者決定棄用某個(gè)之前計(jì)劃使用的庫(kù)或者工具。要讓你的工作在你的若干臺(tái)電腦上都能工作,就要一直維護(hù)不同機(jī)器的環(huán)境的一致性:在一臺(tái)機(jī)器上安裝的工具,要在所有機(jī)器上重新安裝一遍。在一臺(tái)機(jī)器上升級(jí)了的庫(kù),要在所有機(jī)器上都升級(jí),稍微有所差池,就有可能出現(xiàn)某個(gè)腳本/程序在一臺(tái)機(jī)器上跑的好好的,在另一臺(tái)機(jī)器上卻無(wú)法運(yùn)行的問(wèn)題。

docker哲學(xué)

不熟悉docker的讀者可以戳這里來(lái)了解docker。Docker的使用非常簡(jiǎn)單:我們通過(guò)寫(xiě)一個(gè)Dockerfile,在Dockerfile中寫(xiě)入相應(yīng)的命令來(lái)安裝以及配置我們想要的庫(kù)跟工具。不熟悉docker的讀者可以看一下下面這個(gè)抄來(lái)的Dockerfile的例子,來(lái)了解一下Dockerfile長(zhǎng)啥樣子:

FROM ubuntu MAINTAINER Kimbro Staken RUN apt-get install -y software-properties-common python RUN add-apt-repository ppa:chris-lea/node.js RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nodejs #RUN apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1 RUN mkdir /var/www ADD app.js /var/www/app.js CMD ["/usr/bin/node", "/var/www/app.js"]

有了Dockerfile,只需要docker  build一條命令就可以創(chuàng)建一個(gè)docker鏡像。同時(shí)Docker公司提供一個(gè)叫做DockerHub的服務(wù),可以免費(fèi)托管公開(kāi)鏡像。只需要使用docker  push就可以直接把鏡像上傳到DockerHub。在不同的電腦上只需要docker  pull就可以從DockerHub獲取***版的鏡像。DockerHub還支持自動(dòng)構(gòu)建,通過(guò)把DockerHub帳號(hào)跟GitHub帳號(hào)關(guān)聯(lián)起來(lái),就可以讓DockerHub在GitHub上面的Dockerfile出現(xiàn)更改的時(shí)候自動(dòng)重新生成鏡像。

本文開(kāi)頭所說(shuō)的這種一致性的維護(hù),docker實(shí)際上已經(jīng)在給我們提供答案了:我們通過(guò)構(gòu)建一個(gè)docker鏡像,讓這個(gè)鏡像包含著我們項(xiàng)目所需要的所有的一切。這樣的話,我們開(kāi)發(fā),測(cè)試,部署等等一切任務(wù),都可以在先用docker  run來(lái)開(kāi)啟一個(gè)容器,然后在容里面進(jìn)行所有的工作。當(dāng)我們決定修改運(yùn)行環(huán)境,比如引入新的庫(kù)的時(shí)候,就在Dockerfile中進(jìn)行相應(yīng)的修改,重新生成鏡像,然后在不同的機(jī)器上用docker  pull來(lái)更新一下就好。這種使用哲學(xué),通過(guò)一個(gè)中心化了的倉(cāng)庫(kù),非常優(yōu)雅地解決了不同機(jī)器上環(huán)境一致的問(wèn)題。美中不足的是,并不是所有的程序都能在容器里運(yùn)行的,也并不是所有的程序都方便在容器里運(yùn)行的。如果你用到了圖形界面的程序,或者說(shuō)是一些系統(tǒng)級(jí)別的程序,那么在容器里面使用這些程序會(huì)麻煩很多,有的甚至根本無(wú)法實(shí)現(xiàn)。于是自然地就會(huì)想到,如果我們能夠在每次開(kāi)機(jī)的時(shí)候,直接把某個(gè)docker生成的鏡像掛載起來(lái)當(dāng)根目錄來(lái)使用,就可以讓這個(gè)鏡像直接在裸機(jī)上(而不是在容器中)運(yùn)行,來(lái)做我們的日常桌面系統(tǒng)了。

這種做法,除了在保持一致性方面帶來(lái)的便利以外,還有一些其他的好處:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 整個(gè)系統(tǒng)保存在云端,本地的內(nèi)容僅僅是云端的一份緩存而已,這樣就完全沒(méi)有必要定期對(duì)系統(tǒng)進(jìn)行備份了。

  3. 你的系統(tǒng)是如何從零開(kāi)始一步一步配置成你想要的樣子的,所有的一切都清晰地展現(xiàn)在Dockerfile里面。Dockerfile就是你***的筆記。

  4. 完全不用擔(dān)心系統(tǒng)長(zhǎng)時(shí)間使用產(chǎn)生一些殘余的垃圾文件、或者某些系統(tǒng)中某些程序的數(shù)據(jù)出現(xiàn)損壞,因?yàn)槊看伍_(kāi)機(jī),我們用的都是一個(gè)全新的系統(tǒng)。

  5. 要裝一臺(tái)新機(jī)器,并不需要從頭安裝操作系統(tǒng),只要從DockerHub拉取鏡像拿來(lái)用就好,安裝系統(tǒng)這個(gè)過(guò)程變得極其方便。

  6. 系統(tǒng)更新的過(guò)程實(shí)際上就是根據(jù)Dockerfile從***的軟件倉(cāng)庫(kù)重新從頭安裝生成docker鏡像的過(guò)程,不會(huì)出現(xiàn)某些更新遇到文件沖突或者依賴無(wú)法處理,需要人為干預(yù)才能完成的問(wèn)題。

docker存儲(chǔ)驅(qū)動(dòng)的工作原理

Docker的存儲(chǔ)驅(qū)動(dòng)官方有介紹其工作原理,這里只是簡(jiǎn)單概括一下。Docker使用了層的概念,docker在構(gòu)建鏡像的時(shí)候,會(huì)逐行執(zhí)行我們的Dockerfile中的每一行,每執(zhí)行一行的時(shí)候,docker就會(huì)創(chuàng)建出一個(gè)新的層來(lái)存放新的內(nèi)容。當(dāng)我們執(zhí)行docker  pull或者docker push的時(shí)候,docker實(shí)際上傳跟下載的是這些層之間的增量。每當(dāng)執(zhí)行docker  run,docker就會(huì)把這些下載下來(lái)的層組合到一起,組合成一個(gè)完整的鏡像,然后新建一個(gè)讀寫(xiě)層,所有運(yùn)行過(guò)程中的寫(xiě)入都會(huì)被寫(xiě)入到讀寫(xiě)層中,而鏡像本身則是保持只讀,不會(huì)被更改?!皩印边@個(gè)概念具體實(shí)現(xiàn)起來(lái),根據(jù)docker目錄(通常為/var/lib/docker這個(gè)目錄)所在的文件系統(tǒng)的不同而不同,具體的實(shí)現(xiàn)在docker中被稱為graph  driver,docker自帶的graph driver包括aufs、 overlay、btrfs、zfs、devicemapper等。這些graph  driver大多使用了寫(xiě)時(shí)復(fù)制的技術(shù),這樣在把各個(gè)層組合在一起的過(guò)程不需要重新拷貝一份數(shù)據(jù),實(shí)際的拷貝是在寫(xiě)入的時(shí)候發(fā)生的。

由于筆者使用的是btrfs,所以本文就以btrfs為例子來(lái)介紹怎么讓系統(tǒng)啟動(dòng)到docker鏡像上去。btrfs是一個(gè)寫(xiě)時(shí)復(fù)制的系統(tǒng),由于docker的鏡像是由一個(gè)一個(gè)的層疊在一起組成的,docker在使用btrfs的時(shí)候,每往上疊一層,docker就會(huì)創(chuàng)建一個(gè)原來(lái)層的快照,然后把新層的內(nèi)容寫(xiě)到快照里面去。然后docker會(huì)在從鏡像創(chuàng)建容器的時(shí)候,給鏡像的最頂層做個(gè)快照,把這個(gè)快照當(dāng)作容器讀寫(xiě)層來(lái)用。

啟動(dòng)到docker鏡像中去

明白了docker存儲(chǔ)驅(qū)動(dòng)的工作原理,還需要知道Linux的啟動(dòng)過(guò)程才能達(dá)成我們的目標(biāo)。Linux在啟動(dòng)的時(shí)候,一般會(huì)讓啟動(dòng)器給內(nèi)核裝載一個(gè)內(nèi)存盤(pán)initramfs,然后內(nèi)核完成簡(jiǎn)單的早期初始化以后,就會(huì)解壓內(nèi)存盤(pán)的內(nèi)容到根目錄/,然后啟動(dòng)內(nèi)存盤(pán)中的init程序(一般為/init),這個(gè)init程序會(huì)進(jìn)行進(jìn)一步的初始化(比如說(shuō)加載文件系統(tǒng)的驅(qū)動(dòng),對(duì)文件系統(tǒng)進(jìn)行fsck等),這一步初始化完成了以后,這個(gè)init程序就會(huì)根據(jù)內(nèi)核選項(xiàng)中的root、rootflags等內(nèi)容掛載真正的根目錄,然后通過(guò)switch_root程序啟動(dòng)真正根目錄中的init程序,這個(gè)init程序則會(huì)完成***的初始化工作,比如掛載fstab、加載圖形界面等等。很多發(fā)行版都提供制作initramfs的工具,比如archlinux的mkinitcpio,這些工具通常都是模塊化的,允許用戶自己添加hook。

讓系統(tǒng)啟動(dòng)到docker鏡像所需要的知識(shí)已經(jīng)完備了。思路也清晰了:通過(guò)給initramfs中添加hook,讓initramfs中的init在掛載root之前從docker本地緩存中的鏡像中創(chuàng)建出一個(gè)快照作為讀寫(xiě)層,然后把這個(gè)讀寫(xiě)層當(dāng)作真正的root來(lái)掛載。具體操作上,在啟動(dòng)管理器里面寫(xiě)啟動(dòng)項(xiàng)的內(nèi)核選項(xiàng)的時(shí)候,root就寫(xiě)/var/lib/docker所在的分區(qū),而rootflags里面至少要有一項(xiàng)subvol=XXXXX,其中XXXXX是我們打算創(chuàng)建的讀寫(xiě)層的位置。然后重中之重則是,寫(xiě)一個(gè)hook,這個(gè)hook干的事情是:找到想要的docker鏡像對(duì)應(yīng)的btrfs子卷,給這個(gè)子卷創(chuàng)建一個(gè)快照,命名為XXXXX(跟內(nèi)核選項(xiàng)中的名字保持一致)。這樣的話,在Linux把控制權(quán)交給initramfs中的init程序以后,init程序會(huì)先去從docker緩存中的子卷創(chuàng)造出XXXXX快照,然后把XXXXX快照當(dāng)作root來(lái)掛載以及進(jìn)行接下來(lái)的操作。如果讀者跟筆者一樣使用Arch  Linux的話,那么所有的這些工作筆者已經(jīng)做了,讀者可以直接拿來(lái)用。

筆者的源碼位于GitHub: https://github.com/zasdfgbnm/mkinitcpio-docker-hooks  ,同時(shí)讀者也可以直接從AUR中搜索mkinitcpio-docker-hooks來(lái)安裝筆者的hook。下面就來(lái)介紹一下這個(gè)hook的使用方法。

mkinitcpio-docker-hooks的使用

mkinitcpio-docker-hooks的使用流程大概分為如下幾步:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 確保你的/var/lib/docker位于某個(gè)btrfs分區(qū)中

  3. 準(zhǔn)備一個(gè)適合在裸機(jī)上啟動(dòng)的docker鏡像

  4. 然后在這個(gè)鏡像中安裝并配置mkinitcpio-docker-hooks

  5. 準(zhǔn)備內(nèi)核跟initramfs

  6. 準(zhǔn)備top layer的內(nèi)容

  7. 設(shè)置啟動(dòng)管理器

docker鏡像的準(zhǔn)備

要想啟動(dòng)到docker鏡像中去,首先你得有一個(gè)適合在裸機(jī)上啟動(dòng)的docker鏡像。很多docker鏡像,為了減小鏡像的大小,是不會(huì)附帶只有裸機(jī)上才能用到的軟件包(比如dhcpcd)的,所以讀者可能需要在Dockerfile中手動(dòng)安裝這些軟件包,對(duì)于Arch  Linux來(lái)講,只需要安裝base組就可以了。由于接下來(lái)要安裝mkinitcpio-docker-hooks,這里推薦使用一個(gè)已經(jīng)內(nèi)置yaourt的鏡像,筆者使用的是自己的archlinux-yaourt鏡像zasdfgbnm/archlinux-yaourt。所以,Dockerfile的開(kāi)頭看起來(lái)是這個(gè)樣子的:

FROM zasdfgbnm/archlinux-yaourt USER root RUN pacman -Syu --noconfirm base

作為示例,這里就不安裝base之外的其他軟件了,讀者請(qǐng)自己根據(jù)需要安裝其他軟件。

安裝并配置mkinitcpio-docker-hooks

mkinitcpio-docker-hooks的安裝是在docker里面而不是當(dāng)前運(yùn)行在裸機(jī)上的系統(tǒng)中進(jìn)行的。之所以要把這個(gè)軟件包安裝在docker鏡像里面,很重要的原因是因?yàn)長(zhǎng)inux內(nèi)核不提供ABI的穩(wěn)定性,所以內(nèi)核模塊跟內(nèi)核的版本必須嚴(yán)格對(duì)應(yīng),不然模塊是無(wú)法加載的。為了保持這種一致性,我們采取的措施是,在docker里面安裝mkinitcpio-docker-hooks,在docker中生成initramfs,并且在啟動(dòng)的時(shí)候用鏡像里面的內(nèi)核啟動(dòng),就可以確保內(nèi)核、initramfs中的模塊、啟動(dòng)到鏡像以后的/lib/modules三者保持一致。安裝過(guò)程在Dockerfile中的寫(xiě)法如下:

RUN sudo -u user yaourt -S --noconfirm mkinitcpio-docker-hooks

安裝完了mkinitcpio-docker-hooks以后還需要配置,配置文件在/etc/docker-btrfs.json,初始內(nèi)容如下:

{     "docker_image": "archlinux/base",     "docker_tag": "latest" }

我們需要做的就是把這兩個(gè)變量的值替換為我們想要的值,比如說(shuō)這里我打算把我的docker鏡像的名字叫做“sample_image”。同時(shí),我們還需要在/etc/mkinitcpio.conf中添加docker-btrfs這個(gè)hook。

綜上,可以在Dockerfile中使用如下命令來(lái)配置:

RUN sed -i 's/archlinux\/base/sample_image/g' /etc/docker-btrfs.json  RUN perl -i -p -e 's/(?<=^HOOKS=\()(.*)(?=\))/$1 docker-btrfs/g' /etc/mkinitcpio.conf

現(xiàn)在,我們有了一個(gè)完整的示例Dockerfile了:

FROM zasdfgbnm/archlinux-yaourt USER root RUN pacman -Syu --noconfirm base RUN sudo -u user yaourt -S --noconfirm mkinitcpio-docker-hooks RUN sed -i 's/archlinux\/base/sample_image/g' /etc/docker-btrfs.json RUN perl -i -p -e 's/(?<=^HOOKS=\()(.*)(?=\))/$1 docker-btrfs/g' /etc/mkinitcpio.conf

只需要通過(guò)docker build . -t sample_image就可以構(gòu)建自己的鏡像了。

準(zhǔn)備內(nèi)核跟initramfs

鏡像生成好了以后,下一步就是準(zhǔn)備內(nèi)核跟構(gòu)建initramfs了。注意這一步操作盡量在你打算用來(lái)啟動(dòng)docker鏡像的機(jī)器上進(jìn)行,因?yàn)閙kinitcpio會(huì)自動(dòng)根據(jù)機(jī)器把相應(yīng)的內(nèi)核模塊放入initramfs中去,如果在別的機(jī)器上進(jìn)行的話,那就可能會(huì)有一些驅(qū)動(dòng)沒(méi)有被自動(dòng)裝入initramfs中。如前所述,這一步的工作是在docker容器中進(jìn)行的。首先運(yùn)行容器并開(kāi)啟一個(gè)shell:

docker run -v $(pwd):/workspace -w /workspace -it sample_image bash

然后在容器中執(zhí)行如下命令:

mkinitcpio -p linux cp /boot/* . exit

然后就可以在當(dāng)前目錄下看到準(zhǔn)備好的initramfs-linux-fallback.img、initramfs-linux.img以及vmlinuz-linux了。

準(zhǔn)備top layer的內(nèi)容

Top  layer是mkinitcpio-docker-hooks引入的新概念,它指的是某個(gè)驅(qū)動(dòng)器中的某個(gè)目錄,這個(gè)目錄會(huì)在啟動(dòng)的時(shí)候讀寫(xiě)層創(chuàng)建之后,真正的root掛載之前,通過(guò)busybox的cp  -a命令整個(gè)拷貝到讀寫(xiě)層里面去。為什么需要top  layer呢?因?yàn)槲覀冃枰诙嗯_(tái)機(jī)器上啟動(dòng)同一個(gè)鏡像,而不同機(jī)器上的往往會(huì)根據(jù)需要配置不同的配置文件,比如/etc/fstab以及/etc/X11/xorg.conf。另外,DockerHub免費(fèi)賬戶上的鏡像都是公開(kāi)的,/etc/passwd、/etc/shadow等的私密性文件也不適合放在鏡像里面存儲(chǔ)。

準(zhǔn)備top  layer的內(nèi)容,實(shí)際上就是找一個(gè)文件夾,把需要單獨(dú)配置的文件,按照從根目錄算起的相對(duì)路徑存放在這個(gè)文件夾里面。比如說(shuō)如果你想給某臺(tái)機(jī)器單獨(dú)配置/etc/fstab,那么你就應(yīng)該在top  layer的目錄中添加etc/fstab這個(gè)文件。這里推薦的具體的操作流程是:首先通過(guò)docker run -v $(pwd):/workspace -w  /workspace -it sample_image bash進(jìn)入容器中的shell,然后在其中做各種配置,比如useradd  ...,完了以后把新生成的配置文件拷貝到top layer的文件夾中去

設(shè)置啟動(dòng)管理器

設(shè)置好了top  layer以后,我們基本上可以算是萬(wàn)事具備只差東風(fēng)了。我們只需要簡(jiǎn)單設(shè)置一下啟動(dòng)管理器就可以啟動(dòng)我們的系統(tǒng)了。這里以refind為例子,這里假設(shè)我們的所有東西放在一個(gè)label為“l(fā)inux”的btrfs分區(qū)中,docker目錄(也就是你系統(tǒng)啟動(dòng)以后會(huì)掛載到/var/lib/docker的目錄)存放在這個(gè)分區(qū)根目錄下的一個(gè)叫做“docker”的子卷中,而內(nèi)核、initramfs以及top  layer都是位于分區(qū)根目錄下的“boot_docker”文件夾中,而我們希望創(chuàng)建的讀寫(xiě)層名字叫做“docker_rwlayer”,那么相應(yīng)的refind.conf中的菜單項(xiàng)的代碼如下:

menuentry archlinux-docker {         icon EFI/refind/icons/os_arch.png         volume linux         loader boot_docker/vmlinuz-linux         initrd boot_docker/initramfs-linux.img         options "root=LABEL=linux rootflags=subvol=docker_rwlayer rw docker_path=docker toplayer=LABEL=linux toplayer_path=boot_docker" }

其中內(nèi)核選項(xiàng)中,我們通過(guò)root來(lái)指定docker目錄所在的分區(qū),rootflags中的subvol來(lái)指定讀寫(xiě)層的位置,docker_path來(lái)指定docker目錄在root中的相對(duì)位置;通過(guò)toplayer來(lái)指定top  layer目錄所在的分區(qū),toplayerflags來(lái)指定top layer所在分區(qū)的掛載選項(xiàng),toplayer_path來(lái)指定top  layer的目錄在toplayer分區(qū)中的相對(duì)位置。

一切就緒,重啟并享受吧!

感謝各位的閱讀,以上就是“怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

標(biāo)題名稱:怎么把Docker鏡像當(dāng)作桌面系統(tǒng)來(lái)用
本文路徑:http://jinyejixie.com/article38/ppsdpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)站改版搜索引擎優(yōu)化、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化