中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

嘉興做網(wǎng)站的公司有哪些廊坊百度關(guān)鍵詞排名平臺(tái)

嘉興做網(wǎng)站的公司有哪些,廊坊百度關(guān)鍵詞排名平臺(tái),余姚網(wǎng)站建設(shè),vs2013可以做網(wǎng)站么目錄 三. docker鏡像構(gòu)建 1. docker鏡像結(jié)構(gòu) 2. 鏡像運(yùn)行的基本原理 3. 鏡像獲得方式 4. 鏡像構(gòu)建 5. Dockerfile實(shí)例 6. 鏡像優(yōu)化方案 6.1. 鏡像優(yōu)化策略 6.2. 鏡像優(yōu)化示例:縮減鏡像層 6.3. 鏡像優(yōu)化示例:多階段構(gòu)建 6.4. 鏡像優(yōu)化示例:使用最精簡(jiǎn)鏡像 四. docke…

目錄

三. docker鏡像構(gòu)建

1. docker鏡像結(jié)構(gòu)

2. 鏡像運(yùn)行的基本原理

3. 鏡像獲得方式

4. 鏡像構(gòu)建

5. Dockerfile實(shí)例

6. 鏡像優(yōu)化方案

6.1. 鏡像優(yōu)化策略

6.2. 鏡像優(yōu)化示例:縮減鏡像層

6.3. 鏡像優(yōu)化示例:多階段構(gòu)建

6.4. 鏡像優(yōu)化示例:使用最精簡(jiǎn)鏡像

四. docker 鏡像倉(cāng)庫(kù)的管理

1. 什么是docker倉(cāng)庫(kù)

2. docker hub

3. docker hub的使用方法

3. docker倉(cāng)庫(kù)的工作原理

4. pull原理

5. push原理

6. 搭建docker的私有倉(cāng)庫(kù)

6.1. 為什么搭建私有倉(cāng)庫(kù)

6.2. 搭建簡(jiǎn)單的Registry倉(cāng)庫(kù)

6.3. 為Registry提加密傳輸

6.4. 為倉(cāng)庫(kù)建立登陸認(rèn)證

7. 構(gòu)建企業(yè)級(jí)私有倉(cāng)庫(kù)

7.1. 部署harbor

7.2. 管理倉(cāng)庫(kù)

五. Docker 網(wǎng)絡(luò)

1. docker原生bridge網(wǎng)路

2. docker原生網(wǎng)絡(luò)host

3. docker 原生網(wǎng)絡(luò)none

4. docker的自定義網(wǎng)絡(luò)

4.1. 自定義橋接網(wǎng)絡(luò)

4.2. 為什么要自定義橋接

4.3. 如何讓不同的自定義網(wǎng)絡(luò)互通?

4.4. joined容器網(wǎng)絡(luò)

4.5. joined網(wǎng)絡(luò)示例演示

5. 容器內(nèi)外網(wǎng)的訪問(wèn)

5.1 容器訪問(wèn)外網(wǎng)

5.2 外網(wǎng)訪問(wèn)docker容器

6. docker跨主機(jī)網(wǎng)絡(luò)

6.1 CNM (Container Network Model)

6.2 macvlan網(wǎng)絡(luò)方式實(shí)現(xiàn)跨主機(jī)通信


三. docker鏡像構(gòu)建

1. docker鏡像結(jié)構(gòu)
  • 共享宿主機(jī)的kernel

  • base鏡像提供的是最小的Linux發(fā)行版

  • 同一docker主機(jī)支持運(yùn)行多種Linux發(fā)行版

  • 采用分層結(jié)構(gòu)的最大好處是:共享資源

2. 鏡像運(yùn)行的基本原理
  • Copy-on-Write 可寫容器層

  • 容器層以下所有鏡像層都是只讀的

  • docker從上往下依次查找文件

  • 容器層保存鏡像變化的部分,并不會(huì)對(duì)鏡像本身進(jìn)行任何修改一個(gè)鏡像最多127層

3. 鏡像獲得方式
  • 基本鏡像通常由軟件官方提供

  • 企業(yè)鏡像可以用官方鏡像+Dockerfile來(lái)生成

  • 系統(tǒng)關(guān)于鏡像的獲取動(dòng)作有兩種:

  • docker pull 鏡像地址

  • docker load –i 本地鏡像包

4. 鏡像構(gòu)建
#FROM COPY 和MAINTAINER
[root@Docker-node1 ~]# mkdir docker/
[root@Docker-node1 ~]# cd docker/
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile   #基礎(chǔ)鏡像
[root@Docker-node1 docker]# docker build -t busybox:v1 . #構(gòu)建鏡像
[root@Docker-node1 docker]# docker images history busybox:v1
[root@Docker-node1 docker]#docker run -it --rm --name test1 busybox:v1[root@Docker-node1 docker]# mv Dockerfile timinglee
[root@Docker-node1 docker]# docker build -f /root/docker/timinglee -t example:v2 .    #-f指定名字
[root@Docker-node1 docker]# docker images[root@Docker-node1 docker]# mv timinglee Dockerfile
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org    #rhel版本不一樣,指令不同 #指定郵箱信息
[root@Docker-node1 docker]# docker build -t busybox:v2 .
[root@Docker-node1 docker]#docker images history busybox:v2cp /etc/passwd
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd  #復(fù)制當(dāng)前目錄文件到容器指定位置,passwd必須在當(dāng)前目錄中
[root@Docker-node1 docker]#docker build -t busybox:v3 .
[root@Docker-node1 docker]#docker images history busybox:v3
[root@Docker-node1 docker]#docker run -it --rm --name test busybox:v3 #啟動(dòng)進(jìn)入文件,看對(duì)應(yīng)目錄有沒(méi)有文件
#如果已存在可以,刪掉docker rm -f test[root@Docker-node1 docker]# tar zcf zhuzhuxia.tar.gz Dockerfile passwd
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
[root@Docker-node1 docker]# docker build -t busybox:v4 .
[root@Docker-node1 docker]# docker run -it --rm --name tes busybox:v4[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
RUN mkdir /lee
[root@Docker-node1 docker]# docker build -t busybox:v5 .
[root@Docker-node1 docker]# docker images history busybox:v5
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v5[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
RUN mkdir /lee
CMD ["/bin/sh", "-c", "echo hello lee"]   #CMD的不同寫法
#CMD echo joker
[root@Docker-node1 docker]# docker build -t busybox:v6 .
[root@Docker-node1 docker]# docker images history busybox:v6
[root@Docker-node1 docker]# docker run -it --name test busybox:v6[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
RUN mkdir /lee
ENV name=timinglee
ENTRYPOINT ["/bin/sh", "-c", "echo xiaofeifei"]   #不可替代
CMD ["/bin/sh", "-c", "echo $NAME"]   #CMD被替代
[root@Docker-node1 docker]# docker build -t busybox:v6 .
[root@Docker-node1 docker]# docker images history busybox:v6
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v6  #有內(nèi)容;CMD
[root@Docker-node1 docker]# docker rm test
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v6 sh  #無(wú)內(nèi)容;CMD
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v6 sh  #有內(nèi)容;測(cè)試ENTRYPOINT[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
RUN mkdir /lee
EXPOSE 80 443   #暴露端口
ENV name=timinglee
ENTRYPOINT ["/bin/sh", "-c", "sleep 10000000"]   #不可替代
CMD ["/bin/sh", "-c", "echo $NAME"]   #CMD被替代
[root@Docker-node1 docker]# docker build -t busybox:v6 .
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v6  
[root@Docker-node1 docker]# docker run -d --rm --name test busybox:v6 
[root@Docker-node1 docker]# docker ps #看端口
[root@Docker-node1 docker]# docker stop test[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
RUN touch /leefile 
LABEL Mail=lee@timinglee.org
COPY passwd /passwd
ADD zhuzhuxia.tar.gz /mnt
RUN mkdir /lee
EXPOSE 80 443
WORKDIR /mnt   #工作目錄
VOLUME /lee   #目錄掛載
[root@Docker-node1 docker]# docker build -t busybox:v6 .
[root@Docker-node1 docker]# docker run -it --rm --name test busybox:v6  
[root@Docker-node1 docker]# docker inspect test  #看"Mounts"的下面有沒(méi)有目錄/lee
5. Dockerfile實(shí)例
#清理容器
[root@node9 ~]# docker images
[root@node9 ~]# docker rmi <IMAGE ID> 
[root@node9 ~]# docker rmi `docker images | awk '/none/{print $1}'`
[root@node9 ~]# docker rmi busybox:v{1..7}#可以先拖入企業(yè)7鏡像centos和nginx1.26軟件包,提前下載。
[root@node9 ~]# docker load -i /mnt/centos-7#建立構(gòu)建目錄,編寫構(gòu)建文件
[root@node9 ~]# mdkir docker
[root@node9 ~]# cd docker/
[root@node9 docker]# mv /nginx-1.26.1.tar.gz . #移動(dòng)文件到當(dāng)前。
[root@node9 docker]# vim Dockerfile
FROM centos:7
LABEL Mail=lee@timinglee.org
ADD /nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install -y gcc make pcre-devel openssl-devel
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]#通過(guò)dockerfile生成鏡像
[root@node9 docker]# docker build -t nginx:v1 #出現(xiàn)倉(cāng)庫(kù)報(bào)錯(cuò),添加一個(gè)rhel7.9鏡像虛擬機(jī)。
#添加一個(gè)端口
[root@node9 docker]# yum install httpd -y
[root@node9 docker]# vim /etc/httpd/conf/httpd.conf
...
listen 8888
...
[root@node9 docker]# systemctl start httpd#掛載端口
[root@node9 docker]# mkdir /var/www/html/rhel7.9
[root@node9 docker]# mount /dev/sr1 /var/www/html/rhel7.9#查看ip
[root@node9 docker]# docker inspect centos:7
[root@node9 docker]# ping 172.17.0.2#進(jìn)入容器
[root@node9 docker]# docker run -it --name centos centos:7
cd /etc/yum.repos.d/
rm -fr *
vim centos7.repo
[centos7]
name=centos7
baseurl=http://172.17.0.1:8888/rhel7.9
gpgcheck=0#將一個(gè)名為 “centos” 的容器創(chuàng)建一個(gè)新的鏡像,并為新鏡像添加注釋信息 “add repo”,新鏡像命名為 “centos:repo”
[root@node9 docker]# docker commit -m "add repo" centos centos:repo
[root@node9 docker]# docker rm centos#修改配置文件
[root@node9 docker]# vim Dockerfile
FROM centos:repo
LABEL Mail=lee@timinglee.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install -y gcc make pcre-devel openssl-devel
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]#再一次生成鏡像
[root@node9 docker]# docker build -t nginx:v1 #查看容器
[root@server1 docker]# docker images
6. 鏡像優(yōu)化方案
6.1. 鏡像優(yōu)化策略
  • 選擇最精簡(jiǎn)的基礎(chǔ)鏡像

  • 減少鏡像的層數(shù)

  • 清理鏡像構(gòu)建的中間產(chǎn)物

  • 選擇最精簡(jiǎn)的基礎(chǔ)鏡像

  • 減少鏡像的層數(shù)

  • 清理鏡像構(gòu)建的中間產(chǎn)物

6.2. 鏡像優(yōu)化示例:縮減鏡像層
[root@node9 docker]# vim Dockerfile
FROM centos:repo
LABEL Mail=lee@timinglee.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module -- with-http_stub_status_module && make && make install && rm -fr nginx-
1.26.1 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]   #CMD 是 Dockerfile 中的一個(gè)指令,用于定義容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令。
["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]:這是一個(gè)命令列表。其中,/usr/local/nginx/sbin/nginx 是啟動(dòng) Nginx 服務(wù)器的命令路徑。-g 是 Nginx 的全局配置指令參數(shù),daemon off 表示以非守護(hù)進(jìn)程模式運(yùn)行 Nginx,即讓 Nginx 在前臺(tái)運(yùn)行,這樣容器就不會(huì)在啟動(dòng) Nginx 后立即退出,而是保持運(yùn)行狀態(tài)直到容器被停止或者出現(xiàn)錯(cuò)誤。[root@node9 docker]# docker build -t nginx:v2 .
[root@node9 docker]# docker images nginx
[root@node9 docker]# vim Dockerfile
FROM centos:repo
LABEL Mail=lee@timinglee.org
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module -- with-http_stub_status_module && make && make install && rm -fr nginx-
1.26.1 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]   #CMD 是 Dockerfile 中的一個(gè)指令,用于定義容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令。
["/usr/local/nginx/sbin/nginx", "-g", "daemon off"]:這是一個(gè)命令列表。其中,/usr/local/nginx/sbin/nginx 是啟動(dòng) Nginx 服務(wù)器的命令路徑。-g 是 Nginx 的全局配置指令參數(shù),daemon off 表示以非守護(hù)進(jìn)程模式運(yùn)行 Nginx,即讓 Nginx 在前臺(tái)運(yùn)行,這樣容器就不會(huì)在啟動(dòng) Nginx 后立即退出,而是保持運(yùn)行狀態(tài)直到容器被停止或者出現(xiàn)錯(cuò)誤。[root@node9 docker]# docker build -t nginx:v2 .
[root@node9 docker]# docker images nginx
6.3. 鏡像優(yōu)化示例:多階段構(gòu)建
[root@node9 docker]# vim Dockerfile
FROM centos:repo AS build
ADD nginx-1.26.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.26.1
RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module -- with-http_stub_status_module && make && make install && rm -fr nginx-
1.26.1 && yum clean allFROM centos:repo
LABEL Mail=lee@timinglee.org
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@node9 docker]# docker build -t nginx:v3 .
[root@node9 docker]# docker images nginx
6.4. 鏡像優(yōu)化示例:使用最精簡(jiǎn)鏡像

使用google提供的最精簡(jiǎn)鏡像

#下載地址:
https://github.com/GoogleContainerTools/distroless#下載鏡像:
docker pull gcr.io/distroless/base
#提前下載,直接拖入即可。#利用最精簡(jiǎn)鏡像構(gòu)建
[root@node9 docker]# vim Dockerfile
FROM nginx:1.23 AS base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /usr/sbin/nginx-debug /opt && \
cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libpcre* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base-debian11
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]
[root@node9 ~]# docker build -t nginx:v4 .
[root@node9 ~]# docker images nginx
測(cè)試:
[root@node9 ~]# docker run --rm -d --name wevserver nginx:v4
[root@node9 ~]# docker ps

四. docker 鏡像倉(cāng)庫(kù)的管理

1. 什么是docker倉(cāng)庫(kù)

Docker 倉(cāng)庫(kù)(Docker Registry) 是用于存儲(chǔ)和分發(fā) Docker 鏡像的集中式存儲(chǔ)庫(kù)。 它就像是一個(gè)大型的鏡像倉(cāng)庫(kù),開發(fā)者可以將自己創(chuàng)建的 Docker 鏡像推送到倉(cāng)庫(kù)中,也可以從倉(cāng)庫(kù)中拉 取所需的鏡像。 Docker 倉(cāng)庫(kù)可以分為公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù): 公共倉(cāng)庫(kù),如 Docker Hub,任何人都可以訪問(wèn)和使用其中的鏡像。許多常用的軟件和應(yīng)用都有在 Docker Hub 上提供的鏡像,方便用戶直接獲取和使用。 例如,您想要部署一個(gè) Nginx 服務(wù)器,就可以從 Docker Hub 上拉取 Nginx 的鏡像。 私有倉(cāng)庫(kù)則是由組織或個(gè)人自己搭建和管理的,用于存儲(chǔ)內(nèi)部使用的、不希望公開的鏡像。 比如,一家企業(yè)為其特定的業(yè)務(wù)應(yīng)用創(chuàng)建了定制化的鏡像,并將其存儲(chǔ)在自己的私有倉(cāng)庫(kù)中, 以保證安全性和控制訪問(wèn)權(quán)限。 通過(guò) Docker 倉(cāng)庫(kù),開發(fā)者能夠方便地共享和復(fù)用鏡像,加速應(yīng)用的開發(fā)和部署過(guò)程。

2. docker hub

官網(wǎng):https://hub.docker.com/ Docker Hub 是 Docker 官方提供的一個(gè)公共的鏡像倉(cāng)庫(kù)服務(wù)。 它是 Docker 生態(tài)系統(tǒng)中最知名和廣泛使用的鏡像倉(cāng)庫(kù)之一,擁有大量的官方和社區(qū)貢獻(xiàn)的鏡像。 以下是 Docker Hub 的一些關(guān)鍵特點(diǎn)和優(yōu)勢(shì):

  1. 豐富的鏡像資源:涵蓋了各種常見的操作系統(tǒng)、編程語(yǔ)言運(yùn)行時(shí)、數(shù)據(jù)庫(kù)、Web 服務(wù)器等眾多應(yīng)用 的鏡像。 例如,您可以輕松找到 Ubuntu、CentOS 等操作系統(tǒng)的鏡像,以及 MySQL、Redis 等數(shù)據(jù)庫(kù) 的鏡像。

  2. 官方支持:提供了由 Docker 官方維護(hù)的一些重要鏡像,確保其質(zhì)量和安全性。

  3. 社區(qū)貢獻(xiàn):開發(fā)者們可以自由上傳和分享他們創(chuàng)建的鏡像,促進(jìn)了知識(shí)和資源的共享。

  4. 版本管理:對(duì)于每個(gè)鏡像,通常都有多個(gè)版本可供選擇,方便用戶根據(jù)需求獲取特定版本。

  5. 便于搜索:用戶可以通過(guò)關(guān)鍵詞輕松搜索到所需的鏡像。

3. docker hub的使用方法
#登陸官方倉(cāng)庫(kù)
[root@docker ~]# docker login
Log in with your Docker ID or email address to push and pull images from Docker
Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to
create one.
You can log in with your password or a Personal Access Token (PAT). Using a
limited-scope PAT grants better security and is required for organizations using
SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: timinglee
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded#登陸信息保存位置
[root@docker ~]# cd .docker/
[root@docker .docker]# ls
config.json
[root@docker .docker]# cat config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu"}}
}[root@docker ~]# docker tag nginx:v3 timinglee/nginx:v3   #修改名字,類似索引[root@docker ~]# docker push timinglee/nginx:v3
3. docker倉(cāng)庫(kù)的工作原理

倉(cāng)庫(kù)中的三個(gè)角色

  • index docker索引服務(wù),負(fù)責(zé)并維護(hù)有關(guān)用戶帳戶、鏡像的校驗(yàn)以及公共命名空間的信息。

  • registry docker倉(cāng)庫(kù),是鏡像和圖表的倉(cāng)庫(kù),它不具有本地?cái)?shù)據(jù)庫(kù)以及不提供用戶認(rèn)證,通過(guò)Index Auth service的Token的方式進(jìn)行認(rèn)證

  • Registry Client Docker充當(dāng)registry客戶端來(lái)維護(hù)推送和拉取,以及客戶端的授權(quán)。

4. pull原理

鏡像拉取分為以下幾步: 1.docker客戶端向index發(fā)送鏡像拉去請(qǐng)求并完成與index的認(rèn)證 2.index發(fā)送認(rèn)證token和鏡像位置給dockerclient 3.dockerclient攜帶token和根據(jù)index指引的鏡像位置取連接registry 4.Registry會(huì)根據(jù)client持有的token跟index核實(shí)身份合法性 5.index確認(rèn)此token合法性 6.Registry會(huì)根據(jù)client的請(qǐng)求傳遞鏡像到客戶端

5. push原理

鏡像上傳的步驟: 1.client向index發(fā)送上傳請(qǐng)求并完成用戶認(rèn)證 2.index會(huì)發(fā)方token給client來(lái)證明client的合法性 3.client攜帶index提供的token連接Registry 4.Registry向index合適token的合法性 5.index證實(shí)token的合法性 6.Registry開始接收客戶端上傳過(guò)來(lái)的鏡像

6. 搭建docker的私有倉(cāng)庫(kù)
6.1. 為什么搭建私有倉(cāng)庫(kù)

docker hub雖然方便,但是還是有限制

  • 需要internet連接,速度慢

  • 所有人都可以訪問(wèn)

  • 由于安全原因企業(yè)不允許將鏡像放到外網(wǎng)

好消息是docker公司已經(jīng)將registry開源,我們可以快速構(gòu)建企業(yè)私有倉(cāng)庫(kù) 地址: https://docs.docker.com/registry/deploying/

6.2. 搭建簡(jiǎn)單的Registry倉(cāng)庫(kù)
#下載Registry鏡像
[root@node9 ~]#  docker pull registry
#我是提前下載了,所以直接拖入。
[root@node9 ~]# docker load -i registry.tag.gz 
ce7f800efff9: Loading layer  7.644MB/7.644MB
30609d4f10dd: Loading layer  792.6kB/792.6kB
3b6a51496c9d: Loading layer  17.55MB/17.55MB
e704e9e3e9dc: Loading layer  3.584kB/3.584kB
f019f591461d: Loading layer  2.048kB/2.048kB
Loaded image: registry:latest#開啟Registry
[root@node9 ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
338896d1cc20d7e06ef39a0a3351b71b2a91b81dcfb12cae1818efd646fd05b4
[root@node9 ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS              PORTS                                       NAMES
338896d1cc20   registry                 "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
d571fb7d7d7c   timinglee/mario:latest   "python3 -m http.ser…"   14 hours ago         Up 14 hours         0.0.0.0:80->8080/tcp, :::80->8080/tcp       game2#上傳鏡像到倉(cāng)庫(kù)中
#給要上傳的鏡像大標(biāo)簽
[root@node9 ~]# docker tag nginx:latest 172.25.254.100:5000/nginx:latest#docker在上傳的過(guò)程中默認(rèn)使用https,但是我們并沒(méi)有建立https認(rèn)證需要的認(rèn)證文件所以會(huì)報(bào)錯(cuò)
[root@node9 ~]# docker push 172.25.254.100:5000/nginx:latest
The push refers to repository [172.25.254.100:5000/nginx]
Get "https://172.25.254.100:5000/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)#配置非加密端口
[root@node9 ~]# cat /etc/docker/daemon.json 
{"insecure-registries":["http://172.25.254.100:5000"]
}
[root@node9 ~]# systemctl restart docker#上傳鏡像
[root@node9 ~]# docker push 172.25.254.100:5000/nginx:latest
The push refers to repository [172.25.254.100:5000/nginx]
5f0272c6e96d: Pushed 
f4f00eaedec7: Pushed 
55e54df86207: Pushed 
ec1a2ca4ac87: Pushed 
8b87c0c66524: Pushed 
72db5db515fd: Pushed 
9853575bc4f9: Pushed 
latest: digest: sha256:127262f8c4c716652d0e7863bba3b8c45bc9214a57d13786c854272102f7c945 size: 1778#查看鏡像上傳
[root@node9 ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["nginx"]}
6.3. 為Registry提加密傳輸
#走加密端口
[root@node9 ~]# cat /etc/docker/daemon.json  #內(nèi)容清掉。
[root@node9 ~]# systemctl restart docker#本地解析
vim /etc/hosts
172.25.254.100  node9.timinglee.org#生成認(rèn)證key和證書
[root@node9 ~]# mkdir -p certs
[root@node9 ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" \ #指定備用名稱
-x509 -days 365 -out certs/timinglee.org.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:timinglee
Organizational Unit Name (eg, section) []:docker
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:admin@timinglee.org#啟動(dòng)registry倉(cāng)庫(kù)
[root@docker ~]# docker run -d -p 443:443 --restart=always --name registry \
> --name registry -v /opt/registry:/var/lib/registry \
> -v /root/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key registry
[root@node9 ~]# docker rm -f registry
registry
[root@node9 ~]# docker ps測(cè)試:
docker tag busybox:latest reg.timinglee.org/busybox:latest
[root@docker docker]# docker push reg.timinglee.org/busybox:latest #docker客戶端沒(méi)有key和證書
Error response from daemon: Get "https://reg.timinglee.org/v2/": tls: failed toverify certificate: x509: certificate signed by unknown authority#為客戶端建立證書
[root@docker docker]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p
[root@docker docker]# cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker docker]# systemctl restart docker
[root@node9 ~]# docker push reg.timinglee.org/busybox:latest
The push refers to repository [reg.timinglee.org/busybox]
d51af96cf93e: Pushed 
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527
[root@docker docker]# curl -k https://reg.timinglee.org/v2/_catalog
{"repositories":["busybox"]}
6.4. 為倉(cāng)庫(kù)建立登陸認(rèn)證
#安裝建立認(rèn)證文件的工具包
[root@docker docker]# dnf install httpd-tools -y#建立認(rèn)證文件
[root@docker ~]# mkdir auth
[root@docker ~]# htpasswd -Bc auth/htpasswd lee #-B 強(qiáng)制使用最安全加密方式,默認(rèn)用md5加密
New password:
Re-type new password:
Adding password for user timinglee#添加認(rèn)證到registry容器中
[root@docker ~]# docker run -d -p 443:443 --restart=always --name registry \
> --name registry -v /opt/registry:/var/lib/registry \
> -v /root/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key \
> -v /root/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> registry#允許 curl 連接到使用自簽名證書的服務(wù)器(-k 表示忽略 SSL 證書驗(yàn)證)。-u lee:123 用于提供用戶名 lee 和密碼 123 進(jìn)行基本身份驗(yàn)證。從指定的 URL 獲取數(shù)據(jù),并以 JSON 格式返回了一個(gè)包含 repositories 數(shù)組的響應(yīng),數(shù)組中包含了 busybox 和 nginx
[root@docker ~]# curl -k https://node9.timinglee.org/v2/_catalog -u lee:123
{"repositories":["busybox","nginx"]}#當(dāng)倉(cāng)庫(kù)開啟認(rèn)證后必須登陸倉(cāng)庫(kù)才能進(jìn)行鏡像上傳
#未登陸情況下上傳鏡像
[root@node9 ~]# docker push reg.timinglee.org/nginx
Using default tag: latest
The push refers to repository [reg.timinglee.org/nginx]
5f0272c6e96d: Preparing 
f4f00eaedec7: Preparing 
55e54df86207: Preparing 
ec1a2ca4ac87: Preparing 
8b87c0c66524: Preparing 
72db5db515fd: Preparing 
9853575bc4f9: Preparing 
no basic auth credentials#未登陸請(qǐng)款下也不能下載
[root@node9 ~]# docker tag nginx:latest reg.timinglee.org/nginx
[root@node9 ~]# docker push reg.timinglee.org/nginx
[root@node9 ~]# docker pull reg.timinglee.org/nginx
Using default tag: latest
Error response from daemon: Head "https://reg.timinglee.org/v2/nginx/manifests/latest": no basic auth credentials#登陸測(cè)試
[root@docker ~]# docker login reg.timinglee.org
Username: lee
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded#退出登錄
docker logout reg.timinglee.org
7. 構(gòu)建企業(yè)級(jí)私有倉(cāng)庫(kù)

下載軟件包地址 Releases · goharbor/harbor · GitHub Harbor 是由vmware公司開源的企業(yè)級(jí) Docker Registry 項(xiàng)目。 它提供了以下主要功能和特點(diǎn):

  1. 基于角色的訪問(wèn)控制(RBAC):可以為不同的用戶和用戶組分配不同的權(quán)限,增強(qiáng)了安全性和管理 的靈活性。

  2. 鏡像復(fù)制:支持在不同的 Harbor 實(shí)例之間復(fù)制鏡像,方便在多個(gè)數(shù)據(jù)中心或環(huán)境中分發(fā)鏡像。

  3. 圖形化用戶界面(UI):提供了直觀的 Web 界面,便于管理鏡像倉(cāng)庫(kù)、項(xiàng)目、用戶等。

  4. 審計(jì)日志:記錄了對(duì)鏡像倉(cāng)庫(kù)的各種操作,有助于追蹤和審查活動(dòng)。

  5. 垃圾回收:可以清理不再使用的鏡像,節(jié)省存儲(chǔ)空間。

7.1. 部署harbor
#提前下載,直接解壓。
[root@docker ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker ~]# ls
anaconda-ks.cfg certs harbor-offline-installer-v2.5.4.tgz
auth harbor
cp -r /root/certs/ /data/
[root@docker ~]# cd harbor/
[root@docker harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: 123
[root@docker harbor]# ./install.sh --help
Please set --with-notary #證書簽名
Please set --with-trivy #安全掃描
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor
[root@docker harbor]# ./install.sh --with-chartmuseum#管理harbor的容器
[root@docker harbor]# docker compose stop   #停止
[root@docker harbor]# docker compose up -d   #重新加載
7.2. 管理倉(cāng)庫(kù)
#Windows本地解析
172.25.254.100  reg.timinglee.org#在瀏覽器上訪問(wèn)172.25.254.100
1.登陸;賬號(hào):admin 密碼:123
2.建立倉(cāng)庫(kù)項(xiàng)目 項(xiàng)目名字:xiaozhuhzu,#在后面拉取鏡像時(shí)需要加上這個(gè)標(biāo)簽#上傳鏡像
[root@docker harbor]# docker login reg.timinglee.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
[root@node9 ~]# docker tag busybox:latest reg.timinglee.org/xiaozhuzhu/busybox:v1
[root@node9 ~]# docker push reg.timinglee.org/xiaozhuzhu/busybox:v1
The push refers to repository [reg.timinglee.org/xiaozhuzhu/busybox]
d51af96cf93e: Pushed 
v1: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527
測(cè)試:
在瀏覽器上查看上傳的鏡像

五. Docker 網(wǎng)絡(luò)

docker的鏡像是令人稱道的地方,但網(wǎng)絡(luò)功能還是相對(duì)薄弱的部分 docker安裝后會(huì)自動(dòng)創(chuàng)建3種網(wǎng)絡(luò):bridge、host、none

#切換模式iptables
grubby --update-kernel ALL --args iptables=true#查看network
[root@node9 ~]# docker network ls
NETWORK ID     NAME                        DRIVER    SCOPE
0f5f6bc4bbf6   bridge                      bridge    local
ea9a34a2492b   harbor_harbor               bridge    local
1b13291bf8c7   harbor_harbor-chartmuseum   bridge    local
1b469e272a9a   host                        host      local
ce6ef696809d   none                        null      local#清理一些不用的網(wǎng)絡(luò)
cd harbor/
docker compose down
1. docker原生bridge網(wǎng)路

docker安裝時(shí)會(huì)創(chuàng)建一個(gè)名為 docker0 的Linux bridge,新建的容器會(huì)自動(dòng)橋接到這個(gè)接口

[root@node9 ~]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:e0:53:92:60 brd ff:ff:ff:ff:ff:ff
12: br-1b13291bf8c7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:7a:e8:5f:36 brd ff:ff:ff:ff:ff:ff
13: br-ea9a34a2492b: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:d1:58:69:b4 brd ff:ff:ff:ff:ff:ff

bridge模式下容器沒(méi)有一個(gè)公有ip,只有宿主機(jī)可以直接訪問(wèn),外部主機(jī)是不可見的。 容器通過(guò)宿主機(jī)的NAT規(guī)則后可以訪問(wèn)外網(wǎng)

[root@docker mnt]# docker run -d --name web -p 80:80 nginx:1.23
defeba839af1b95bac2a200fd1e06a45e55416be19c7e9ce7e0c8daafa7dd470
[root@docker mnt]# ifconfig
....
veth7f320e9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet6 fe80::986b:99ff:fe19:f8d9  prefixlen 64  scopeid 0x20<link>ether 9a:6b:99:19:f8:d9  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 21  bytes 2556 (2.4 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0veth7f320e9 為容器使用的網(wǎng)卡
#軟件包bridge-utils-1.5-9.el7.x86_64
[root@docker mnt]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02425fe2346c no veth022a7c9
2. docker原生網(wǎng)絡(luò)host

host網(wǎng)絡(luò)模式需要在容器創(chuàng)建時(shí)指定 --network=host host模式可以讓容器共享宿主機(jī)網(wǎng)絡(luò)棧,這樣的好處是外部主機(jī)與容器直接通信,但是容器的網(wǎng)絡(luò)缺少隔離性。

[root@docker ~]# docker run -it --name test --network host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:E0:53:92:60  inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0inet6 addr: fe80::42:e0ff:fe53:9260/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8335 errors:0 dropped:0 overruns:0 frame:0TX packets:10143 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:4402060 (4.1 MiB)  TX bytes:71967675 (68.6 MiB)eth0      Link encap:Ethernet  HWaddr 00:0C:29:70:64:35  inet addr:172.25.254.100  Bcast:172.25.254.255  Mask:255.255.255.0inet6 addr: fe80::f21f:eb6:d618:77cb/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:538105 errors:0 dropped:0 overruns:0 frame:0TX packets:42952 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:773168166 (737.3 MiB)  TX bytes:13541075 (12.9 MiB)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:11834 errors:0 dropped:0 overruns:0 frame:0TX packets:11834 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1045343 (1020.8 KiB)  TX bytes:1045343 (1020.8 KiB)veth7f320e9 Link encap:Ethernet  HWaddr 9A:6B:99:19:F8:D9  inet6 addr: fe80::986b:99ff:fe19:f8d9/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:23 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B)  TX bytes:2696 (2.6 KiB)如果公用一個(gè)網(wǎng)絡(luò),那么所有的網(wǎng)絡(luò)資源都是公用的,比如啟動(dòng)了nginx容器那么真實(shí)主機(jī)的80端口被占用,在啟動(dòng)第二個(gè)nginx容器就會(huì)失敗
3. docker 原生網(wǎng)絡(luò)none

none模式是指禁用網(wǎng)絡(luò)功能,只有l(wèi)o接口,在容器創(chuàng)建時(shí)使用 --network=none指定。

[root@docker ~]# docker run -it --name test --rm --network none busybox 
/ # ifconfig
lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
4. docker的自定義網(wǎng)絡(luò)

自定義網(wǎng)絡(luò)模式,docker提供了三種自定義網(wǎng)絡(luò)驅(qū)動(dòng):

bridge overlay macvlan bridge驅(qū)動(dòng)類似默認(rèn)的bridge網(wǎng)絡(luò)模式,但增加了一些新的功能, overlay和macvlan是用于創(chuàng)建跨主機(jī)網(wǎng)絡(luò) 建議使用自定義的網(wǎng)絡(luò)來(lái)控制哪些容器可以相互通信,還可以自動(dòng)DNS解析容器名稱到IP地址。

4.1. 自定義橋接網(wǎng)絡(luò)
#在建立自定以網(wǎng)絡(luò)時(shí),默認(rèn)使用橋接模式
[root@node9 ~]# docker network create my_net1
3c765727244e0bf1e19ee4c6539232e51eea30a115b36ce5ae908ea4833d9c1d
[root@node9 ~]# docker network ls
NETWORK ID     NAME                        DRIVER    SCOPE
0f5f6bc4bbf6   bridge                      bridge    local
1b469e272a9a   host                        host      local
3c765727244e   my_net1                     bridge    local
ce6ef696809d   none                        null      local#橋接默認(rèn)是單調(diào)遞增
[root@docker ~]# ifconfig
br-1b13291bf8c7: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255inet6 fe80::42:7aff:fee8:5f36  prefixlen 64  scopeid 0x20<link>ether 02:42:7a:e8:5f:36  txqueuelen 0  (Ethernet)RX packets 8335  bytes 4402060 (4.1 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 10143  bytes 71967675 (68.6 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 fe80::42:e0ff:fe53:9260  prefixlen 64  scopeid 0x20<link>ether 02:42:e0:53:92:60  txqueuelen 0  (Ethernet)RX packets 8335  bytes 4402060 (4.1 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 10143  bytes 71967675 (68.6 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0#橋接也支持自定義子網(wǎng)和網(wǎng)關(guān)
[root@node9 ~]# docker network create my_net2 --subnet 192.168.0.0/24 --gateway 192.168.0.100
2d17ab32024ae8d4272650c7ac0fe9aada6e7acb93409e35a29ff30b8a610382
[root@node9 ~]# docker network inspect my_net2
[{"Name": "my_net2","Id": "2d17ab32024ae8d4272650c7ac0fe9aada6e7acb93409e35a29ff30b8a610382","Created": "2024-08-28T16:28:22.122754722+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/24","Gateway": "192.168.0.100"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]
4.2. 為什么要自定義橋接
[root@docker ~]# docker run -d --name web1 nginx
d5da7eaa913fa6cdd2aa9a50561042084eca078c114424cb118c57eeac473424
[root@docker ~]# docker run -d --name web2 nginx
0457a156b02256915d4b42f6cc52ea71b18cf9074ce550c886f206fef60dfae5
[root@docker ~]# docker inspect web1
"Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null,"NetworkID": "7abac7f53cd3e9f8c9ec6cca5d736f390f4ccd326852a3b61e8c42f8953b94ac","EndpointID": "65d7c1a72a48499e4b5c361305bcb8e7054b37626ec5d5de70d7395ba6f5baa7","Gateway": "172.17.0.1","IPAddress": "172.17.0.2",      #注意ip信息"IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": null[root@docker ~]# docker inspect web1"Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null,"NetworkID": "7abac7f53cd3e9f8c9ec6cca5d736f390f4ccd326852a3b61e8c42f8953b94ac","EndpointID": "26a3af63c8c7d97ea722a6bc25220d5ad73157dcf58f9e7df8a1b7639ae0ed8e","Gateway": "172.17.0.1","IPAddress": "172.17.0.3",   #注意ip信息"IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": null#關(guān)閉容器后重啟容器,啟動(dòng)順序調(diào)換
[root@docker ~]# docker stop web1 web2
web1
web2
[root@docker ~]# docker start web2
web2
[root@docker ~]# docker start web1
web1
#我們會(huì)發(fā)容器ip顛倒docker引擎在分配ip時(shí)時(shí)根據(jù)容器啟動(dòng)順序分配到,誰(shuí)先啟動(dòng)誰(shuí)用,是動(dòng)態(tài)變更的
多容器互訪用ip很顯然不是很靠譜,那么多容器訪問(wèn)一般使用容器的名字訪問(wèn)更加穩(wěn)定
docker原生網(wǎng)絡(luò)是不支持dns解析的,自定義網(wǎng)絡(luò)中內(nèi)嵌了dns[root@docker ~]# docker run -d --network my_net1 --name web3 nginx
d9ed01850f7aae35eb1ca3e2c73ff2f83d13c255d4f68416a39949ebb8ec699f
[root@docker ~]# docker run -it --network my_net1 --name test busybox
/ # ping web3
PING web (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.197 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.096 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.087 ms注意:不同的自定義網(wǎng)絡(luò)是不能通訊的
#在rhel7中使用的是iptables進(jìn)行網(wǎng)絡(luò)隔離,在rhel9中使用nftpables
[root@docker ~]# nft list ruleset可以看到網(wǎng)絡(luò)隔離策略
4.3. 如何讓不同的自定義網(wǎng)絡(luò)互通?
[root@node9 ~]# docker network create mynet1 -d bridge
b7251c3df5a0094a5a6e46ed0b95b28c340f3fc07c582bd21b1466828b58a55c
[root@node9 ~]# docker network create mynet2 -d bridge
9feb3fab05a8dca230e76d49722a8d819c0134c473b2d01935ce3a5b482e6499
[root@node9 ~]# docker run -it --name testone --network mynet1 busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:32 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:4597 (4.4 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)#又開一個(gè)會(huì)話。
[root@node9 ~]# docker run -it --name testtwo --network mynet2 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02  inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:36 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5244 (5.1 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)/ # ping testone
ping: bad address 'testone'   #沒(méi)有執(zhí)行指令ping不通
/ # ifconfig                    #執(zhí)行指令多一個(gè)網(wǎng)卡,可以ping
eth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02  inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:45 errors:0 dropped:0 overruns:0 frame:0TX packets:6 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:6154 (6.0 KiB)  TX bytes:380 (380.0 B)eth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:03  inet addr:172.18.0.3  Bcast:172.18.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:15 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:2016 (1.9 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:794 (794.0 B)  TX bytes:794 (794.0 B)/ # ping testone
PING testone (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.145 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.146 ms
^C
--- testone ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.145/0.145/0.146 ms#在上面test容器中加入網(wǎng)絡(luò)eth1
[root@node9 ~]# docker network connect mynet1 testtwo
4.4. joined容器網(wǎng)絡(luò)

Joined容器一種較為特別的網(wǎng)絡(luò)模式,?在容器創(chuàng)建時(shí)使用--network=container:vm1指定。(vm1指定的是運(yùn)行的容器名) 處于這個(gè)模式下的 Docker 容器會(huì)共享一個(gè)網(wǎng)絡(luò)棧,這樣兩個(gè)容器之間可以使用localhost高效快速通信。

[root@node9 ~]# docker rm testone
testone
[root@node9 ~]# docker rm testtwo
testtwo
[root@node9 ~]# docker run -it --name testone --network mynet1 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:15 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:2007 (1.9 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)[root@node9 ~]# docker run -it --name testtwo --network container:testone  busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0  #注意看ip信息UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:19 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:2416 (2.3 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)#重新刪掉,為了效果,重新配。
[root@node9 ~]# docker rm testone
testone
[root@node9 ~]# docker rm testtwo
testtwo[root@node9 ~]# docker run -d --name testone --network mynet1 nginx
[root@node9 ~]# docker run -it --name testtwo --network container:testone centos:7
[root@b526153da4e6 /]# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
4.5. joined網(wǎng)絡(luò)示例演示

利用容器部署phpmyadmin管理mysql

#提前下載mysql包
[root@node9 ~]# docker load -i phpmyadmin-latest.tar.gz 
[root@node9 ~]# docker load -i mysql-5.7.tar.gz #運(yùn)行phpmysqladmin
[root@docker ~]# docker run -d --name mysqladmin --network mynet1 \
-e PMA_ARBITRARY=1 \     #在web頁(yè)面中可以手動(dòng)輸入數(shù)據(jù)庫(kù)地址和端口
-p 80:80 phpmyadmin:latest#運(yùn)行數(shù)據(jù)庫(kù)
[root@docker ~]# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD='123' \ #設(shè)定數(shù)據(jù)庫(kù)密碼
--network container:mysqladmin \ #把數(shù)據(jù)庫(kù)容器添加到phpmyadmin容器中
mysql:5.7測(cè)試:
在瀏覽器訪問(wèn)172.25.254.100。在hphmyadmin界面新建mysql。#登錄docker的mysql
docker exec -it mysql bash
mysql -uroot -p123
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| peihua316          |
| performance_schema |
| sys                |
| yangcun            |
| zhuzhuxia          |
+--------------------+
7 rows in set (0.00 sec)
mysql> SHOW TABLES FROM peihua316;
+---------------------+
| Tables_in_peihua316 |
+---------------------+
| 316                 |
+---------------------+
1 row in set (0.00 sec)
mysql> select * from peihua316.316;
+------+-------+------+-------+
| yaos | caimb | xies | liups |
+------+-------+------+-------+
| 2    | 3     | 1    | 4     |
+------+-------+------+-------+
1 row in set (0.01 sec)Note
開啟的phpmyadmin容器中是沒(méi)有數(shù)據(jù)庫(kù)的
這里填寫的localhost:3306是因?yàn)閙ysql容器和phpmyadmin容器公用一個(gè)網(wǎng)絡(luò)站
5. 容器內(nèi)外網(wǎng)的訪問(wèn)
5.1 容器訪問(wèn)外網(wǎng)

在rhel7中,docker訪問(wèn)外網(wǎng)是通過(guò)iptables添加地址偽裝策略來(lái)完成容器網(wǎng)文外網(wǎng) 在rhel7之后的版本中通過(guò)nftables添加地址偽裝來(lái)訪問(wèn)外網(wǎng)。

#清理網(wǎng)絡(luò)環(huán)境,回到原來(lái)的網(wǎng)絡(luò)環(huán)境
[root@node9 ~]# docker rm -f mysql
[root@node9 ~]# docker rm -f mysqladmin
[root@node9 ~]# docker network rm mynet2
mynet2
[root@node9 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
540ffd549691   bridge    bridge    local
1b469e272a9a   host      host      local
ce6ef696809d   none      null      local#切換模式iptables
grubby --update-kernel ALL --args iptables=true   #之前配置過(guò)就不用再配置。iptables是為了看效果,一般不用這個(gè)。#啟動(dòng)一個(gè)網(wǎng)絡(luò)
[root@node9 ~]# docker run --rm -it --name test busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:14 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:1728 (1.6 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)/ # ping www.baidu.com
PING www.baidu.com (36.155.132.76): 56 data bytes
64 bytes from 36.155.132.76: seq=0 ttl=127 time=27.229 ms   #這里可以先ping可不可以通,之后再關(guān)掉iptables -t nat -D POSTROUTING 1 這個(gè)協(xié)議,再ping一下。
[root@node9 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0 #內(nèi)網(wǎng)訪問(wèn)外網(wǎng)策略
Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
5.2 外網(wǎng)訪問(wèn)docker容器

端口映射 -p 本機(jī)端口:容器端口來(lái)暴漏端口從而達(dá)到訪問(wèn)效果。

#通過(guò)docker-proxy對(duì)數(shù)據(jù)包進(jìn)行內(nèi)轉(zhuǎn)
[root@docker ~]# docker run -d --name webserver --rm -p 80:80 nginx
[root@node9 ~]# ps ax | grep proxy3572 ?        Sl     0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 803578 ?        Sl     0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 803666 pts/1    S+     0:00 grep --color=auto proxy#通過(guò)dnat策略來(lái)完成瀏覽內(nèi)轉(zhuǎn),有雙保險(xiǎn)。
[root@node9 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:8#刪掉DNAT,再外面curl 172.25.254.100。應(yīng)該是通的。因?yàn)橛须p保險(xiǎn)。
iptables -t nat -D DOCKER 2
iptables -t nat -nL
[root@node9 ~]# curl 172.25.254.100
6. docker跨主機(jī)網(wǎng)絡(luò)

在生產(chǎn)環(huán)境中,我們的容器不可能都在同一個(gè)系統(tǒng)中,所以需要容器具備跨主機(jī)通信的能力 跨主機(jī)網(wǎng)絡(luò)解決方案 docker原生的overlay和macvlan 第三方的flannel、weave、calico 眾多網(wǎng)絡(luò)方案是如何與docker集成在一起的 libnetwork docker容器網(wǎng)絡(luò)庫(kù) CNM (Container Network Model)這個(gè)模型對(duì)容器網(wǎng)絡(luò)進(jìn)行了抽象

6.1 CNM (Container Network Model)

CNM分三類組件 Sandbox:容器網(wǎng)絡(luò)棧,包含容器接口、dns、路由表。(namespace) Endpoint:作用是將sandbox接入network (veth pair) Network:包含一組endpoint,同一network的endpoint可以通信

6.2 macvlan網(wǎng)絡(luò)方式實(shí)現(xiàn)跨主機(jī)通信

macvlan網(wǎng)絡(luò)方式

  • Linux kernel提供的一種網(wǎng)卡虛擬化技術(shù)。

  • 無(wú)需Linux bridge,直接使用物理接口,性能極好

  • 容器的接口直接與主機(jī)網(wǎng)卡連接,無(wú)需NAT或端口映射。

  • macvlan會(huì)獨(dú)占主機(jī)網(wǎng)卡,但可以使用vlan子接口實(shí)現(xiàn)多macvlan網(wǎng)絡(luò)

  • vlan可以將物理二層網(wǎng)絡(luò)劃分為4094個(gè)邏輯網(wǎng)絡(luò),彼此隔離,vlan id取值為1~4094

macvlan網(wǎng)絡(luò)間的隔離和連通

  • macvlan網(wǎng)絡(luò)在二層上是隔離的,所以不同macvlan網(wǎng)絡(luò)的容器是不能通信的

  • 可以在三層上通過(guò)網(wǎng)關(guān)將macvlan網(wǎng)絡(luò)連通起來(lái)

  • docker本身不做任何限制,像傳統(tǒng)vlan網(wǎng)絡(luò)那樣管理即可 實(shí)現(xiàn)方法如下:

#在兩臺(tái)docker主機(jī)上各添加一塊網(wǎng)卡,設(shè)置僅主機(jī)模式,開啟混雜模式:
#一臺(tái):172.25.254.100 雙網(wǎng)卡  一臺(tái):172.25.254.200  雙網(wǎng)卡
#兩臺(tái)機(jī)子都要有docker;提前下載busybox鏡像包。
#172.25.254.100    #兩臺(tái)機(jī)子都需要打開模式
[root@docker ~]# ip link set eth1 promisc on
[root@docker ~]# ip link set up eth1
[root@docker ~]# ifconfig eth1
eth1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
ether 00:0c:29:ec:fc:dd txqueuelen 1000 (Ethernet)
RX packets 83 bytes 8696 (8.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0#添加macvlan網(wǎng)路;#兩臺(tái)機(jī)子都需要添加
[root@docker ~]# docker network create \
-d macvlan \
--subnet 4.4.4.0/24 \
--gateway 4.4.4.4 \
-o parent=eth1 macvlan1
[root@docker ~]# docker network ls#測(cè)試
#在172.25.254.100中
[root@docker ~]# docker run -it --rm --name busybox --network macvlan1 --ip 4.4.4.2 busybox
/ # ifconfig
/ # ping 4.4.4.1
#在172.25.254.200中
[root@docker-node2 ~]# docker run -it --name busybox --network macvlan1 --ip 1.1.1.200 --rm busybox
/ # ifconfig
http://www.risenshineclean.com/news/9153.html

相關(guān)文章:

  • 常州百度搜索優(yōu)化seo刷詞工具在線
  • java能做網(wǎng)站開發(fā)么超級(jí)推薦的關(guān)鍵詞怎么優(yōu)化
  • 網(wǎng)站規(guī)劃思想方法有哪些內(nèi)容電商運(yùn)營(yíng)工資大概多少
  • 58同城做公司網(wǎng)站怎修改做任務(wù)賺傭金的平臺(tái)
  • 成都網(wǎng)站建設(shè)哪家東莞seo建站公司
  • 周口師范做網(wǎng)站商丘seo排名
  • wordpress 后臺(tái)忘了如何做關(guān)鍵詞優(yōu)化
  • 什么網(wǎng)站可以做拍a發(fā)布會(huì)杭州seo網(wǎng)站
  • 實(shí)時(shí)爬蟲網(wǎng)站是怎么做的品牌網(wǎng)絡(luò)營(yíng)銷策劃
  • 添加建設(shè)銀行的網(wǎng)站怎么查看域名是一級(jí)還是二級(jí)域名
  • 淄博網(wǎng)站建設(shè)報(bào)價(jià)seo營(yíng)銷推廣多少錢
  • 公司網(wǎng)站設(shè)計(jì)欣賞關(guān)鍵詞優(yōu)化排名首頁(yè)
  • 一個(gè)網(wǎng)站做局打水山東最新資訊
  • 網(wǎng)站開發(fā)需要技術(shù)淘寶關(guān)鍵詞排名查詢工具免費(fèi)
  • 濟(jì)南網(wǎng)站建設(shè)(力選聚搜網(wǎng)絡(luò))搜索引擎排名影響因素有哪些
  • 怎么夸一個(gè)網(wǎng)站做的好看欽州seo
  • 管理系統(tǒng) 網(wǎng)站模板比較好的品牌策劃公司有哪些
  • 網(wǎng)頁(yè)設(shè)計(jì)圖片超鏈接海曙seo關(guān)鍵詞優(yōu)化方案
  • 平臺(tái)類網(wǎng)站有哪些搜索引擎分類
  • wordpress圖片css鄭州seo地址
  • 國(guó)展做網(wǎng)站的公司網(wǎng)絡(luò)推廣哪個(gè)好
  • 學(xué)做網(wǎng)站論壇vip賬戶如何注冊(cè)百度賬號(hào)
  • 北京工程建設(shè)交易網(wǎng)標(biāo)題優(yōu)化
  • 建網(wǎng)站 免費(fèi)搜索引擎營(yíng)銷分析
  • 北京市保障性住房建設(shè)投資中心網(wǎng)站6搜索引擎下載安裝
  • ASP動(dòng)態(tài)網(wǎng)站制作國(guó)外b站不收費(fèi)免費(fèi)2023
  • 大連市建委培訓(xùn)官方網(wǎng)站微信公眾號(hào)營(yíng)銷
  • 行業(yè)網(wǎng)站開發(fā)運(yùn)營(yíng)方案免費(fèi)推廣平臺(tái)排行
  • 煙臺(tái)h5網(wǎng)站制作sem優(yōu)化和seo的區(qū)別
  • 什么網(wǎng)站做簡(jiǎn)歷比較好seo營(yíng)銷服務(wù)