docker容器

1. Docker安裝

如果是在centos上安裝docker,建議在7系列上安裝。
安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2

從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名注冊(cè)、虛擬空間、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。

添加Docker軟件包源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安裝Docker CE

yum install docker-ce -y

啟動(dòng)

systemctl start docker

開機(jī)啟動(dòng)

systemctl enable docker

查看Docker信息

docker info
配置docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh|sh -s http://bc437cce.m.daocloud.io
Docker默認(rèn)連接的國外官方鏡像,通常根據(jù)網(wǎng)絡(luò)情況不同,訪問時(shí)快時(shí)慢,大多時(shí)候獲取速度非常慢,為了提升效率可以自建倉庫或者修改為國內(nèi)倉庫源,提高拉取鏡像的速度。
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"]
}

systemctl restart docker

2. docker管理

2.1 創(chuàng)建一個(gè)nginx容器,并放入后臺(tái)運(yùn)行
docker container run -d nginx
2.2 列出當(dāng)前正在運(yùn)行的容器
docker container ls
指定容器名稱、主機(jī)名和設(shè)置環(huán)境變量
docker container run -d --name nginx01 -e TEST=123 -h nginx01 nginx

2.3 進(jìn)入容器查看
docker container exec -it nginx01 bash
root@nginx01:/# echo $TEST
123
root@nginx01:/# hostname
nginx01
2.4 讓用戶訪問容器
docker container run -d --name nginx02 -p 88:80 nginx
[root@salt-master ~]# netstat -tnlp|grep 88
tcp6 0 0 :::88 :::* LISTEN 23224/docker-proxy

瀏覽器訪問如下
docker容器

2.5 容器資源管理
容器是密集型的,啟動(dòng)大量容器,如果不對(duì)容器進(jìn)行資源限制,難免會(huì)因?yàn)槟硞€(gè)容器占用大量資源,導(dǎo)致宿主機(jī)資源耗盡。資源限制常用選項(xiàng)。
執(zhí)行docker run命令時(shí)能使用的和內(nèi)存限制相關(guān)的所有選項(xiàng)如下
選項(xiàng) 描述
-m,--memory 內(nèi)存限制,格式是數(shù)字加單位,單位可以為 b,k,m,g。最小為 4M
--memory-swap 允許交換到磁盤中的內(nèi)存量
--memory-swappiness 容器使用SWAP分區(qū)交換的百分比。(0-100,默認(rèn)為-1
--oom-kill-disable 是否阻止 OOM killer kill掉容器,默認(rèn)沒設(shè)置
--oom-score-adj 容器被 OOM killer kill的優(yōu)先級(jí),范圍是[-1000, 1000],默認(rèn)為 0
--kernel-memory 核心內(nèi)存限制。格式同上,最小為 4M
--cpuset-cpus="" 允許使用的 CPU 集,值可以為 0-3,0,1
--cpus 可以使用的cpu數(shù)量
限制容器內(nèi)存使用
docker container run -d --name nginx03 --memory='100m' --memory-swap='100m' --oom-kill-disable nginx
查看當(dāng)前容器內(nèi)存限制及使用
[root@salt-master ~]# docker stats --no-stream nginx03
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
01fde633ae01 nginx03 0.00% 3.691MiB / 100MiB 3.69% 648B / 0B 2.1MB / 0B 2

cpu限額
允許容器最多使用50%的cpu
[root@salt-master ~]# docker container run -d --name nginx04 --cpus=".5" nginx
建議:設(shè)置memory再禁用oom killer,cpu使用不超過50%。

3. 生產(chǎn)環(huán)境常用docker命令匯總

3.1 docker info
顯示 Docker 系統(tǒng)信息,包括鏡像和容器數(shù)。
docker version 顯示docker版本信息
3.2 Docker pull
從docker倉庫中下載鏡像
如docker pull docker.io/nginx
3.3 Docker run
基于docker run啟動(dòng)nginx鏡像,并且啟動(dòng)到/bin/bash解釋器;
docker run -itd docker.io/nginx /bin/bash
-i表示:interactive交互;
-t表示:tty終端;
d表示:daemon后臺(tái)啟動(dòng);
基于docker run啟動(dòng)nginx鏡像,啟動(dòng)到/bin/bash解釋器,同時(shí)映射本地80端口至容器80端口;
docker run -p 80:80 -itd docker.io/nginx /bin/bash
-p端口映射,第一個(gè)80宿主機(jī)監(jiān)聽端口,第二個(gè)80端口為容器監(jiān)聽;
瀏覽器輸入宿主機(jī)IP+80端口,即可訪問容器中的80端口所在服務(wù)
3.4 Docker images
查看已下載的本地docker鏡像列表
3.5 Docker ps
查看當(dāng)前正在運(yùn)行中的容器,docker ps -a 查看當(dāng)前Linux系統(tǒng)所有容器,包括運(yùn)行和已經(jīng)停止、其他容器(所有容器)
3.6 Docker search
從docker倉庫中搜索鏡像
如docker search nginx docker search tomcat

3.7 docker inspect
docker inspect 容器ID 查看容器詳細(xì)信息

  1. docker exec
    進(jìn)入docker容器操作相關(guān)命令
    如在Docker中容器運(yùn)行指令:df -h
    [root@salt-master ~]# docker exec 1c1d2d958de9 df -h
    Filesystem Size Used Avail Use% Mounted on
    overlay 17G 7.5G 9.6G 44% /
    tmpfs 64M 0 64M 0% /dev
    tmpfs 493M 0 493M 0% /sys/fs/cgroup
    /dev/mapper/cl-root 17G 7.5G 9.6G 44% /etc/hosts
    shm 64M 0 64M 0% /dev/shm
    tmpfs 493M 0 493M 0% /proc/acpi
    tmpfs 493M 0 493M 0% /proc/scsi
    tmpfs 493M 0 493M 0% /sys/firmware

docker exec -it 1c1d2d958de9 /bin/bash 進(jìn)入容器進(jìn)行交互
3.8 docker kill
kill掉正在運(yùn)行中的某個(gè)容器
docker kill 1c1d2d958de9
3.9 docker rm
刪除某個(gè)指定的已經(jīng)停止Docker容器,加上-f參數(shù)表示強(qiáng)制刪除某個(gè)指定的正在運(yùn)行中的Docker容器
3.10 docker rmi
從Docker images列表中刪除某個(gè)鏡像
還有其他一些命令,如下:

docker push 推送指定鏡像或者庫鏡像至docker源服務(wù)器
docker history 展示一個(gè)鏡像形成歷史
docker attach 當(dāng)前shell下attach連接指定運(yùn)行鏡像
docker build 通過Dockerfile定制鏡像,如docker build .
docker commit 提交當(dāng)前容器為新的鏡像
docker cp 從容器中拷貝指定文件或者目錄到宿主機(jī)中
docker create 創(chuàng)建一個(gè)新的容器,同run,但不啟動(dòng)容器
docker diff 查看docker容器變化
docker events 從docker服務(wù)獲取容器實(shí)時(shí)事件
docker export 導(dǎo)出容器的內(nèi)容流作為一個(gè)tar歸檔文件[對(duì)應(yīng)import]
docker import 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)映像[對(duì)應(yīng)export]
docker load 從一個(gè)tar包中加載一個(gè)鏡像[對(duì)應(yīng)save]
docker login 注冊(cè)或者登陸一個(gè)docker源服務(wù)器
docker logout Dockerregistry退出
docker logs 輸出當(dāng)前容器日志信息
docker port 查看映射端口對(duì)應(yīng)的容器內(nèi)部源端口
docker pause 暫停容器
docker restart 重啟運(yùn)行的容器
docker save 保存一個(gè)鏡像為一個(gè)tar包[對(duì)應(yīng)load]
docker tag 給源中鏡像打標(biāo)簽
docker top 查看容器中運(yùn)行的進(jìn)程信息
docker unpause 取消暫停容器
docker wait 截取容器停止時(shí)的退出狀態(tài)值

4. Docker鏡像原理剖析

完整的Docker鏡像可以支撐一個(gè)Docker容器的運(yùn)行,在Docker容器運(yùn)行過程中主要提供文件系統(tǒng)數(shù)據(jù)支撐。Docker鏡像是分層結(jié)構(gòu)的,是由多個(gè)層級(jí)組成,每個(gè)層級(jí)分別存儲(chǔ)各種軟件實(shí)現(xiàn)某個(gè)功能,Docker鏡像作為Docker中最基本的概念,有以下幾個(gè)特性:

1)鏡像是分層的,每個(gè)鏡像都由一個(gè)或多個(gè)鏡像層組成;
2)可通過在某個(gè)鏡像加上一定的鏡像層得到新鏡像;
3)通過編寫Dockerfile或基于容器Commit實(shí)現(xiàn)鏡像制作;
4)每個(gè)鏡像層擁有唯一鏡像ID,Docker引擎默認(rèn)通過鏡像ID來識(shí)別鏡像;
5)鏡像在存儲(chǔ)和使用時(shí),共享相同的鏡像層,在PULL鏡像時(shí),已有的鏡像層會(huì)自動(dòng)跳過下載;
6)每個(gè)鏡像層都是只讀,即使啟動(dòng)成容器,也無法對(duì)其真正的修改,修改只會(huì)作用于最上層的容器層。
docker容器

如圖所示為一個(gè)完整的Docker容器系統(tǒng),可以看出:
Docker容器是一個(gè)或多個(gè)運(yùn)行進(jìn)程,而這些運(yùn)行進(jìn)程將占有相應(yīng)的內(nèi)存,相應(yīng)的CPU計(jì)算資源,相應(yīng)的虛擬網(wǎng)絡(luò)設(shè)備以及相應(yīng)的文件系統(tǒng)資源。Docker容器所占用的文件系統(tǒng)資源,則通過Docker鏡像的鏡像層文件來提供?;诿總€(gè)鏡像的Json文件,可以通過解析Docker鏡像的json的文件,獲知應(yīng)該在這個(gè)鏡像之上運(yùn)行什么樣的進(jìn)程,應(yīng)該為進(jìn)程配置什么樣的環(huán)境變量,而Docker守護(hù)進(jìn)程實(shí)現(xiàn)了從靜態(tài)向動(dòng)態(tài)的轉(zhuǎn)變。
Docker虛擬化引也是一個(gè)C/S(Client/Server)結(jié)構(gòu)的應(yīng)用,如圖所示
docker容器
該圖為Docker虛擬化完整體系結(jié)構(gòu)圖,包括如下各個(gè)組件:
1)Docker Server是一個(gè)常駐進(jìn)程;
2)REST API 實(shí)現(xiàn)了client和server間的交互協(xié)議;
3)Docker CLI 實(shí)現(xiàn)容器和鏡像的管理,為用戶提供統(tǒng)一的操作界面;
4)Images為容器提供了統(tǒng)一的軟件、文件底層存儲(chǔ);
5)Container是Docker虛擬化的產(chǎn)物,直接作為生產(chǎn)使用;
6)Network為Docker容器提供完整網(wǎng)絡(luò)通信;
7)Volume為Docker容器提供額外磁盤、文件存儲(chǔ)對(duì)象。

5. Dockerfile鏡像管理及優(yōu)化最佳實(shí)踐

官方倉庫雖然有數(shù)十萬計(jì)的免費(fèi)鏡像,但無法滿足公司業(yè)務(wù)需求,這就需要我們自己去構(gòu)建鏡像。
Docker可以通過Dockerfile自動(dòng)構(gòu)建鏡像,Dockerfile是一個(gè)文本文檔,其中包含了用戶在命令行上所有命令來組合鏡像。使用docker build自動(dòng)構(gòu)建。
官方文檔:https://docs.docker.com/engine/reference/builder/
Docker通過從一個(gè)Dockerfile包含所有命令的文本文件中讀取指定來自動(dòng)構(gòu)建鏡像,這些命令按順序構(gòu)建給定鏡像。一個(gè)Dockerfile遵循特定的格式和指令集,常用指令集如下:
docker容器

5.1 構(gòu)建nginx基礎(chǔ)鏡像
編寫Dockerfile文件,Dockerfile-nginx 內(nèi)容如下
FROM centos:7
MAINTAINER https://blog.51cto.com/tuwei
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel libxslt-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/
RUN wget http://nginx.org/download/nginx-1.14.2.tar.gz && tar xf nginx-1.14.2.tar.gz && cd nginx-1.14.2 && ./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module && \
make -j 4 && make install && \
mkdir -p /usr/local/nginx/conf/vhost && \
rm -rf /usr/local/nginx/html/
&& \
echo "ok" >/usr/local/nginx/html/status.html && \
rm -rf ../nginx-1.14.2
ENV PATH $PATH:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
構(gòu)建 docker build -t nginx-114 -f Dockerfile-nginx .
5.2 構(gòu)建php鏡像
Dockerfile-php內(nèi)容如下
FROM centos:7
MAINTAINER https://blog.51cto.com/tuwei
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
tar zxf php-5.6.36.tar.gz && \
cd php-5.6.36 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--enable-fpm --enable-opcache --enable-static=no \
--with-MySQL --with-mysqli --with-pdo-mysql \
--enable-phar --with-pear --enable-session \
--enable-sysvshm --with-tidy --with-openssl \
--with-zlib --with-curl --with-gd --enable-bcmath \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--with-iconv --enable-posix --enable-zip \
--enable-mbstring --with-mhash --with-mcrypt --enable-hash \
--enable-xml --enable-libxml --enable-debug=no && \
make -j 4 && make install && \
cp php.ini-production /usr/local/php/etc/php.ini && \
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \
mkdir /usr/local/php/log && \
rm -rf ../php*

ENV PATH $PATH:/usr/local/php/sbin
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]
構(gòu)建
docker build -t php-56 -f Dockerfile-php .
5.3 項(xiàng)目鏡像
有了基礎(chǔ)鏡像,就可以封裝項(xiàng)目到新的鏡像。
[root@localhost project]# cat Dockerfile-nginx
FROM nginx-114
COPY nginx.conf /usr/local/nginx/conf/

[root@localhost project]# cat Dockerfile-php
FROM php-56
COPY wwwroot /wwwroot
CMD ["php-fpm"]
Nginx配置文件。增加對(duì)php的處理
[root@localhost project]# cat nginx.conf
user nobody;
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~ .php$ {

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
           }

}

}

部署:

docker network create lnmp
docker volume create wwwroot
docker container run -d --name lnmp_nginx -p 88:80 --net lnmp --mount src=wwwroot,dst=/usr/local/nginx/html nginx:v1
docker container run -d --name lnmp_php --net container:lnmp_nginx --mount src=wwwroot,dst=/usr/local/nginx/html php:v1
創(chuàng)建PHP容器時(shí)指定與Nginx容器同一個(gè)網(wǎng)絡(luò),這樣Nginx就可以代理127.0.0.1:9000到PHP-FPM了。
5.5 編寫Dockerfile最佳實(shí)踐
5.5.1 減少鏡像層
一次RUN指令形成新的一層,盡量Shell命令都寫在一行,減少鏡像層。
5.5.2 優(yōu)化鏡像大?。呵謇頍o用數(shù)據(jù)
一次RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會(huì)帶到下一層,所以要在每一層清理對(duì)應(yīng)的殘留數(shù)據(jù),減小鏡像大小。
5.5.3 減少網(wǎng)絡(luò)傳輸時(shí)間
最好在內(nèi)部有一個(gè)存放軟件包的地方,類似于上述的PHP官方下載地址,如果用到maven構(gòu)建這樣的操作,同時(shí)也更改為私有maven倉庫,減少網(wǎng)絡(luò)傳輸時(shí)間,提高鏡像構(gòu)建速度。
5.5.4 多階段鏡像構(gòu)建
如果運(yùn)行一個(gè)項(xiàng)目,根據(jù)咱們上面的做法,是直接把代碼拷貝到基礎(chǔ)鏡像里,如果是一個(gè)需要預(yù)先代碼編譯的項(xiàng)目呢?例如JAVA語言,如何代碼編譯、部署在一起完成呢!
上面做法需要事先在一個(gè)Dockerfile構(gòu)建一個(gè)基礎(chǔ)鏡像,包括項(xiàng)目運(yùn)行時(shí)環(huán)境及依賴庫,再寫一個(gè)Dockerfile將項(xiàng)目拷貝到運(yùn)行環(huán)境中,有點(diǎn)略顯復(fù)雜了。
像JAVA這類語言如果代碼編譯是在Dockerfile里操作,還需要把源代碼構(gòu)建進(jìn)去,但實(shí)際運(yùn)行時(shí)只需要構(gòu)建出的包,這種把源代碼放進(jìn)去有一定安全風(fēng)險(xiǎn),并且也增加了鏡像體積。
為了解決上述問題,Docker 17.05開始支持多階段構(gòu)建(multi-stage builds),可以簡化Dockerfile,減少鏡像大小。
例如,構(gòu)建JAVA項(xiàng)目鏡像:
git clone https://github.com/b3log/solo.git

cd solo

vi Dockerfile

FROM maven AS build
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package
FROM tomcat-85
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
構(gòu)建 docker build -t solo:v1 -f Dockerfile-solo .

docker container run -d -v /usr/local/jdk1.8:/usr/local/jdk solo:v1

首先,第一個(gè)FROM 后邊多了個(gè) AS 關(guān)鍵字,可以給這個(gè)階段起個(gè)名字。
然后,第二部分FROM用的我們上面構(gòu)建的Tomcat鏡像,COPY關(guān)鍵字增加了--from參數(shù),用于拷貝某個(gè)階段的文件到當(dāng)前階段。這樣一個(gè)Dockerfile就都搞定了。
小結(jié):鏡像小有很多好處,例如快速部署、快速回滾。減少服務(wù)中斷時(shí)間,同時(shí)鏡像倉庫占用磁盤空間也少了。

6. 企業(yè)私有倉庫搭建harbor

構(gòu)建Docker倉庫方式除了使用Registry之外,還可以使用Harbor。
如下為Registry方式缺點(diǎn):

  1. 缺少認(rèn)證機(jī)制,任何人都可以隨意拉取及上傳鏡像,安全性缺失;
  2. 缺乏鏡像清理機(jī)制,鏡像可以push卻不能刪除,日積月累,占用空間會(huì)越來越大;
  3. 缺乏相應(yīng)的擴(kuò)展機(jī)制;
    鑒于以上缺點(diǎn),我們通常在生產(chǎn)環(huán)境中,不會(huì)直接使用docker registry來實(shí)現(xiàn)提供鏡像服務(wù)。
    6.1 harbor簡介
    Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,通過添加一些企業(yè)必需的功能特性,例如安全、標(biāo)識(shí)和管理等,擴(kuò)展了開源Docker Distribution。
    作為一個(gè)企業(yè)級(jí)私有Registry服務(wù)器,Harbor提供了更好的性能和安全。提升用戶使用Registry構(gòu)建和運(yùn)行環(huán)境傳輸鏡像的效率。Harbor支持安裝在多個(gè)Registry節(jié)點(diǎn)的鏡像資源復(fù)制,鏡像全部保存在私有Registry中,確保數(shù)據(jù)和知識(shí)產(chǎn)權(quán)在公司內(nèi)部網(wǎng)絡(luò)中管控。另外,Harbor也提供了高級(jí)的安全特性,諸如用戶管理,訪問控制和活動(dòng)審計(jì)等。
    6.2 Harbor倉庫部署
    Harbor倉庫部署兩種方式,一種是off-line ,一種是on-line,即離線和在線安裝,此處選擇離線安裝。

6.2.1 安裝Docker-Compose快速編排工具
yum install epel-release –y
yum install python-pip –y
pip install --upgrade pip
pip install docker-compose
6.2.2 下載Habor并且解壓安裝
網(wǎng)上下載離線安裝包,解壓后修改Habor配置文件harbor.cfg,修改hostname為本機(jī)IP地址,然后運(yùn)行腳本進(jìn)行安裝。
其他docker客戶端需要上傳鏡像到harbor倉庫,需要修改docker倉庫源為harbor地址。
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.56.134 添加的地址為harbor地址。然后重啟docker服務(wù)。
harbor倉庫搭建好后,可以創(chuàng)建項(xiàng)目,注冊(cè)成員。其他docker客戶端可以登錄harbor倉庫。
如docker login 192.168.56.134/library,如需要上傳鏡像到harbor倉庫,登錄后將鏡像格式進(jìn)行修改,例如:
docker tag centos:7 192.168.56.134/library/centos:7
push該鏡像到harbor倉庫
docker push 192.168.56.134/library/centos:7
查看harbor倉庫:
docker容器
企業(yè)生產(chǎn)環(huán)境一般是利用jenkins拉取代碼然后打包成docker鏡像并上傳到harbor倉庫,然后從harbor拉取鏡像部署到實(shí)際環(huán)境

新聞名稱:docker容器
當(dāng)前URL:http://muchs.cn/article30/jcgpso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、云服務(wù)器、營銷型網(wǎng)站建設(shè)、定制網(wǎng)站電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)