[轉]Docker超詳細基礎教程,快速入門docker

一、docker概述

1.什么是docker

Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)。

簡單來說,docker是一個用來裝應用的容器,就像杯子可以裝水,筆筒可以放筆,書包可以放書,可以把深度學習放在docker中,可以把網站放入docker中,可以把任何想得到的程序放在docker中。

2.docker思想

2.1 集裝箱

如果沒有集裝箱,運輸貨物的時候,東西零散容易丟失,但是一旦有了集裝箱,那么貨物就會被裝載在里面,運輸的時候就不容易丟失了。目前我們需要將程序部署到一臺新的機器上,可能會啟動不起來,比如缺失庫或者配置文件等。那我們如果將程序想象成貨物,我們只需要用一個集裝箱將這些程序打包好,就可以在部署后保證程序可以正常運行,而docker就是這個集裝箱

2.2 標準化

運輸方式:

如果我們把臺式機的應用部署到服務器上,我們可能選擇用移動硬盤拷過去,而有了docker,我們就可以將這個過程標準化。
docker運輸東西通過一個超級碼頭,任何地方需要貨物都由鯨魚先送到超級碼頭,然后再由鯨魚從超級碼頭把貨物送到目的地。
在剛才例子中,我們只需要在臺式機執行一個docker命令,把鯨魚派過來,把程序送到超級碼頭去,再在服務器上執行一個docker命令,然后由鯨魚把程序從超級碼頭送到服務器上去。

存儲方式:

當我們把程序存儲到服務器上時,因為下次我們有可能還要修改存儲目錄,所以我們需要記住這個目錄。而有了docker之后我們就不用記住了程序在哪里了,我們使用的時候只需要一條命令就行了。

API接口:

docker提供了一系列rest api的接口,包含了對docker也就是對我們的應用的一個啟動停止查看刪除等等。有了docker,通過docker命令就可以對其進行操作。

2.3 隔離

我們在使用虛擬機時有自己的cpu、硬盤、內存,完全感覺不到外面主機的存在。docker也差不多,不過它更輕量,我們創建虛擬機可能要幾分鐘,但是docker只需要一秒。最底層的技術是linux一種內核的限制機制,叫做LXC。
LXC是一種輕量級的容器虛擬化技術,最大效率的隔離了進程和資源。通過cgroup、namespace等限制,隔離進程組所使用的物理資源,比如CPU,MEMORY等等。這個機制在7、8年前已經加入到linux內核了,直到2013年docker出世的時候才火起來,大家可能奇怪為什么這么好的技術埋沒這么多年都沒人發現呢?
英雄造時勢,時勢造英雄,如果沒有云計算、敏捷開發、高頻度的彈性伸縮需求,沒有IT行業這么多年長足的發展,也就沒有docker。

3.為什么選擇docker??

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢

  1. 更高效的利用系統資源。
  2. 更快速的啟動時間
  3. 一致的運行環境
  4. 持續交付和部署
  5. 更輕松的遷移
  6. 更輕松的維護和擴展

4.走進docker

鏡像就是上面說的集裝箱,倉庫就是超級碼頭,容器就是我們運行程序的地方。docker運行程序的過程,就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器。
build:構建,就是構建鏡像.
ship:運輸,運輸鏡像,從倉庫和主機運輸.
run:運行的鏡像就是一個容器.
build,ship,run和鏡像,倉庫,容器是一一對應的。

4.1 鏡像

鏡像的英文名叫image。前面我們講到了集裝箱,鯨魚拖著的所有集裝箱就是一個鏡像。

從本質上來說鏡像就是一系列文件,可以包括我們應用程序的文件,也可以包括我們應用的運行環境的文件。既然是文件,那么是以什么樣的格式在本地保存的呢?

說到存儲格式,就要提到linux的一個存儲技術,叫做聯合文件系統。它是一種分層的文件系統,可以將不同的目錄掛到同一個虛擬文件系統下。

比如test1下有三個文件夾,test2下有兩個文件夾,還有一個readme文件。聯合文件系統就是可以在一個文件夾(test)中看到多個文件夾(test1,test2)中的內容。

通過這種方式可以實現文件的分層,test1可以把它看作第一層,test2可以把它看作第二層。每一層有每一層自己的文件,docker就是利用了這種分層的概念實現了鏡像存儲。

鏡像的存儲格式如下圖所示。

這張圖是分層的。最下面一層,上面也是一層層的好像集裝箱羅列在一起。這就是鏡像最直觀的存儲方式。下面是操作系統的引導,上面是linux操作系統,再上面是一些相關的軟件。如果是我們自己的程序,就可以是tomcat,jdk,再往上是應用代碼。每一層是我們自己都可以控制得,最上面一層先忽略不看,因為這是和容器有關的。注意一點,docker鏡像系統的每一層都是只讀的,然后把每一層加載完成之后這些文件都會被看成是同一個目錄,相當于只有一個文件系統。docker的這種文件系統被稱之為鏡像。

4.2 容器

為了便于理解,大家可以把容器想象成虛擬機。每個虛擬機都有自己的文件系統,可以把上圖整個一部分看成是文件系統,與虛擬機系統的區別是這里面的文件系統是一層一層的,并且最下面的n層都是只讀的,只有上面一層是可寫的。為什么要有可寫的這層呢?大家的程序運行起來,勢必會要寫一些日志,寫一些文件,或者對系統的某一些文件做一些修改,所以容器在最上面一層創建了可讀可寫的文件系統

因為鏡像的每一層都是只讀的,所以在程序的運行過程中要寫鏡像文件時,它會把文件的每一層拷到文件的最上層,然后再對它進行修改。修改之后,當我們的應用讀一個文件時會從頂層進行查找,如果沒有才會找下一層。

由于容器的最上一層是可以修改的,鏡像是不能修改的,這樣就能保證鏡像可以生成多個容器獨立運行,沒有任何干擾。

4.3 倉庫

我們的鏡像是要在其它機器上運行,如何進行傳輸呢?

這就用到了docker倉庫,我們要先把我們的鏡像傳到docker倉庫中,再由目的地把docker倉庫拉過去,這就完成了這樣的一次傳輸過程。

誰提供了這樣的倉庫呢?docker自己提供了hub.docker.com。但是非常慢為了解決這個問題,國內很多公司也在做自己的倉庫。

二、docker安裝

因為在虛擬機中安裝的是linux的redhat7.4,所以接下來將介紹如何在redhat中安裝docker。以下方法通用于linux內核,只是安裝包有可能不同。

安裝需滿足以下要求:

  • 64位操作系統
  • 3.1及以上的Linux內核
  • iptables版本在1.4及以上
  • git版本在1.7及以上
  • A ps executable, usually provided by procps or a similar package.
  • XZ Utils 4.9 or higher
  • A properly mounted cgroupfs hierarchy; a single, all-encompassing cgroup mount point is not sufficient.

通過?uname -r?命令查看你當前的內核版本。

1.在線安裝

1.1?如果安裝過請先卸載

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

1.2?安裝依賴設置yum倉庫

安裝依賴:

yum install -y yum-utils \device-mapper-persistent-data \lvm2

?設置倉庫:

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

1.3 安裝docker

yum install docker-ce docker-ce-cli containerd.io

1.4?啟動并加入開機啟動

systemctl start dockersystemctl enable docker

1.5?驗證是否安裝成功?

docker versiondocker run hello-world

能夠看到輸出 Hello from Docker! 就OK了!

2.離線安裝

在某些情況下,我們可能需要離線安裝docker,那么接下來將詳細介紹如何實現docker的離線安裝。

2.1?下載docker壓縮包

從download.docker.com下載對應的docker包,我這里下載的是docker-18.03.1-ce.tgz版本,如果有需要可以直接私信我。

2.2?解壓文件

[root@devops-102 ~]# tar -xvzf docker-18.03.1-ce.tgz 

2.3?將文件移動到系統目錄下 excutable path

ps:本步驟為可選步驟,也可以把解壓路徑放到PATH變量中。?

$ sudo cp docker/* /usr/bin/

執行后會看到 API listen on /var/run/docker.sock 的提示,表示docker已經在運行了。

2.4?啟動Dockerd

$ sudo dockerd &

2.5?驗證

$ sudo docker run hello-world

?能夠看到輸出 Hello from Docker! 就OK了!

2.6?設置開機自啟動

systemctl start docker       systemctl enable docker

三、docker基礎操作

當我們安裝好docker后,由于我做深度學習方面的研究,所以我們需要安裝相應的深度學習環境,以配置pytorch環境為例,接下來會一步步介紹如何構建一個屬于自己的鏡像。

1.鏡像基本操作

1.1 抓取鏡像

首先我們進入dockerhub網站選擇一個我們需要的鏡像。

?然后輸入:

docker pull pytorch/pytorch

通過此命令可以docker遠程倉庫拉取鏡像到本地。

docker pull [options] NAME[:TAG]

name是拉取鏡像的名稱;TAG表示是可選的,如果不選表明時latest,如果選擇表明是指定版本的。
options是拉去的一些參數,當不加請求地址的時候回去docker的官網拉取鏡像。

1.2 查看鏡像

docker images 

?通過此命令可以查看當前存在哪些鏡像。

docker images [options] [REPOSITORY[:TAG]]

options是選項,后面是指定鏡像的名稱。這個用的不多,可能當本地鏡像非常多的時候要指定查看某一個鏡像。
IMAGE ID 其實是一個64位的字符串,它可以唯一標識我們的鏡像,這里只顯示了16位,后面的被截掉了

1.3 啟動交互式容器

docker run -it -v /home/admin/workplace:/workspaces --name bert_pytorch pytorch/pytorch /bin/bash

docker run -t -i -v 本地目錄:虛擬目錄 --name 自定義名稱 IMAGE_NAME /bin/bash

-i –interactive=true | false,默認是false
-t –tty=true | false,默認是false
–name 給啟動的容器自定義名稱,方便后續的容器選擇操作
啟動交互式的容器,就是類似虛擬機、云主機的操作方式,操作完一個命令后仍然可以繼續

1.4 刪除鏡像

docker rmi d77dc4c8ebab

docker rmi 鏡像的標識

標識可以是id或者name。

2.容器的操作

2.1 運行容器

# 簡單操作
docker run 鏡像的標識|鏡像名稱[tag]
# 常用的參數
docker run -d -p ?宿主機端口:容器端口 --name 容器名稱 鏡像的標識|鏡像名稱[tag]
# -d: 代表后臺運行容器
# -p: 宿主機端口:容器端口: 為了映射當前Linux的端口和容器的端口
# --name 容器名稱: 指定容器的名稱

2.2?查看正在運行的容器

docker ps [OPTIONS]
# OPTIONS說明:
# -a: 代表查看全部的容器,包括沒有運行
# -q: 只查看容器的標識
# -f: 根據條件過濾顯示的內容
# --format: 指定返回值的模板文件
# -l: 顯示最近創建的容器
# -n: 列出最近創建的n個容器
# --no-trunc: 不截斷輸出
# -s: 顯示總的文件大小

2.3?查看容器的日志?

docker logs -f 容器id

# -f: 可以滾動查看日志的最后幾行

2.4?進入到容器內部

docker exec -it 容器id bash

2.5?刪除容器(刪除容器前,需要先停止容器)

docker stop 容器id
# 停止指定的容器
docker stop $(docker ps -qa)
# 停止全部容器
docker rm 鏡像id
# 刪除指定容器
docker rm $(docker ps -qa)
# 刪除全部容器

2.6 啟動容器

docker start 容器id

3.構建鏡像

?構建Docker鏡像,可以保存對容器的修改,并且再次使用。構建鏡像提供了自定義鏡像的能力,以軟件的形式打包并分發服務及其運行環境。Docker中提供了兩種方式來構建鏡像:

  • 通過容器構建:docker commit
  • 通過Dockerfile:docker build

3.1?使用commit命令構建鏡像

docker commit 7843e0556e67 bertpytorch

命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

參數:
-a,–author=“”,指定鏡像的作者信息
-m,–message=“”,提交信息
-p,–pause=true,commit時是否暫停容器

3.2?使用Dockerfile文件構建鏡像

Docker允許我們利用一個類似配置文件的形式來進行構建自定義鏡像,在文件中可以指定原始的鏡像,自定義鏡像的維護人信息,對原始鏡像采取的操作以及暴露的端口等信息。比如:

# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER wgp "Kingdompin@163.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

命令:docker build [OPTIONS] DockerFile_PATH | URL | -

參數:
?–force-rm=false
? –no-cache=false
? –pull=false
? -q,quite=false,構建時不輸出信息
? –rm=true
?-t,tag=“”,指定輸出的鏡像名稱信息

4.鏡像遷移

我們制作好的鏡像,一般會遷移到其他機器上。Docker提供了幾種鏡像遷移分享給其他人的方式。推薦鏡像遷移應該直接使用Docker Registry,無論是直接使用Docker Hub還是使用內網私有Registry都可以。使用鏡像頻率不高,鏡像數量不多的情況下,我們可以選擇以下兩種方式。

4.1?上傳Docker Hub

首先,需要在Docker Hub上申請注冊一個帳號(人機驗證時需要科學上網)。然后我們需要創建倉庫,指定倉庫名稱。

在終端中登錄你的Docker Hub賬戶,輸入docker login,輸入用戶名密碼即可登錄成功。

查看需要上傳的鏡像,并將選擇的鏡像打上標簽,標簽名需和Docker Hub上新建的倉庫名稱一致,否則上傳失敗。給鏡像打標簽的命令如下。

docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

其中existing-image代表本地待上傳的鏡像名加tag,后面<hub-user>/<repo-name>[:<tag>]則是為上傳更改的標簽名,tag不指定則為latest。

接下來,我們利用push命令直接上傳鏡像。

docker push <hub-user>/<repo-name>:<tag>

我們已經上傳成功。由于之前介紹的分層存儲系統,我們這里是直接對已有的ubuntu鏡像進行上傳,只是重新打了標簽,所以真正上傳的只是變化的部分。

4.2?導出文件互傳

Docker 還提供了 docker load 和 docker save 命令,用以將鏡像保存為一個tar文件。比如這次我們將bertpytorch:latest這個鏡像保存為tar文件。

docker save -o bertpytorch.tar bertpytorch

docker save -o <倉庫名稱>-<tag>.img <倉庫名稱>:<tag>

查看本地磁盤,即可看見名為bertpytorch的tar包。我們可以將其拷貝給其他機器,再利用load命令重新導入。

docker load --input bertpytorch.tar

docker save --input?<tar>

四、常用linux操作

1.文件和目錄

cd /home 進入 '/ home' 目錄'?
cd .. 返回上一級目錄?
cd ../.. 返回上兩級目錄?
cd 進入個人的主目錄?
cd ~user1 進入個人的主目錄?
cd - 返回上次所在的目錄?

pwd 顯示工作路徑?

mkdir dir1 創建一個叫做 'dir1' 的目錄'?
mkdir dir1 dir2 同時創建兩個目錄?
mkdir -p /tmp/dir1/dir2 創建一個目錄樹?

rm -f file1 刪除一個叫做 'file1' 的文件'?
rmdir dir1 刪除一個叫做 'dir1' 的目錄'?
rm -rf dir1 刪除一個叫做 'dir1' 的目錄并同時刪除其內容?
rm -rf dir1 dir2 同時刪除兩個目錄及它們的內容?

cp file1 file2 復制一個文件?
cp dir/* . 復制一個目錄下的所有文件到當前工作目錄?
cp -a /tmp/dir1 . 復制一個目錄到當前工作目錄?
cp -a dir1 dir2 復制一個目錄?
cp -r?dir1 dir2 復制一個目錄及子目錄

linux涉及到docker的基礎命令會不斷更新,建議收藏,不時查閱!!!

如果該文章對您有所幫助,麻煩點贊,關注,收藏三連支持下!

各位的支持和認可,是我創作的最大動力!


參考:

Docker超詳細基礎教程

docker入門(利用docker部署web應用)

Docker 入門到實戰教程(一)介紹Docker

Docker——入門實戰


---------------------
作者:Yunlord
來源:CSDN
原文:https://blog.csdn.net/kobepaul123/article/details/120072009
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Zookeeper】源碼分析之服務器(一)

一、前言 前面已經介紹了Zookeeper中Leader選舉的具體流程&#xff0c;接著來學習Zookeeper中的各種服務器。 二、總體框架圖 對于服務器&#xff0c;其框架圖如下圖所示 說明&#xff1a; ZooKeeperServer&#xff0c;為所有服務器的父類&#xff0c;其請求處理鏈為PrepReques…

linux下配置samba服務器(以CentOS6.7為例)

一、簡介&#xff08;百度百科&#xff09;Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件&#xff0c;由服務器及客戶端程序構成。SMB&#xff08;Server Messages Block&#xff0c;信息服務塊&#xff09;是一種在局域網上共享文件和打印機的一種通信協議&#xff0c…

【ArcGIS微課1000例】0037:上下標標注記案例教程

在利用ArcGIS進行制圖時&#xff0c;進行標注(Label) 或注記(Annolation) 是必不可少的。但是除了常規的標注和注記以外&#xff0c;還時常需要一些特殊的標注或注記&#xff0c;比如上標、下標等。 文章目錄一、上標標注方法二、下標標注方法一、上標標注方法 上下標代碼模板…

Redis——緩存擊穿、穿透、雪崩

1、緩存穿透&#xff1a; &#xff08;1&#xff09;問題描述&#xff1a;key對應的數據并不存在&#xff0c;每次請求訪問key時&#xff0c;緩存中查找不到&#xff0c;請求都會直接訪問到數據庫中去&#xff0c;請求量超出數據庫時&#xff0c;便會導致數據庫崩潰。如一個用…

數據庫性能系列之子查詢

前言說起數據庫&#xff0c;想必一些朋友會認為&#xff0c;數據庫不就是天天CRUD嗎&#xff1f;只要我掌握了這幾招&#xff0c;根本不在話下。是的&#xff0c;其實我也很贊同這個觀點&#xff0c;對于大多數應用程序來說&#xff0c;只掌握這些內容&#xff0c;是可以勝任日…

shell printf命令:格式化輸出語句

shell printf命令&#xff1a;格式化輸出語句注意&#xff1a;使用printf的腳本比使用echo移植性好。如同echo命令&#xff0c;printf命令可以輸出簡單的字符串&#xff1a;[rootmaster ~]#printf "Hello, Shell\n"Hello, Shellprintf不像echo那樣會自動提供一個換行…

UVa 10905 孩子們的游戲

https://vjudge.net/problem/UVA-10905 題意&#xff1a; 給定n個正整數&#xff0c;把它們連接成一個最大的整數。 思路&#xff1a; 實在是沒想到直接用string來排序了。 1 #include<iostream> 2 #include<algorithm>3 #include<string>4 using namespace …

laravel 內部驗證碼

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.找到此文件composer.json 如下圖添加 "gregwar/captcha": "1.*" 行代碼 2.在命令行中執行 composer update 安裝完成后 3.找到控制器添加如下代碼 public function captcha($tmp) {//生成驗證…

k8s docker集群搭建

一、Kubernetes系列之介紹篇 1.背景介紹 云計算飛速發展 - IaaS - PaaS - SaaS Docker技術突飛猛進 - 一次構建&#xff0c;到處運行 - 容器的快速輕量 - 完整的生態環境 2.什么是kubernetes 首先&#xff0c;他是一個全新的基于容器技術的分布式架構領先方案。Kubernetes(k8…

leetcode 66 Plus One

給定一個數組&#xff0c;表示整數的各個位數&#xff0c;現要將其加上1&#xff0c;考慮進位。 vector<int> plusOne(vector<int>& digits) {int size digits.size();bool carry true;for (int i size - 1; i > 0; --i) {if (digits[i] 9 && c…

如何讓最小 API 綁定查詢字符串中的數組

前言在上次的文章中&#xff0c;我們實現了《讓 ASP.NET Core 支持綁定查詢字符串中的數組》&#xff1a;[HttpGet] public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values) {return string.Join(" ", values.Select(p…

Kubernetes api-server源碼閱讀2(Debug Kubernetes篇)

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes api-server源碼閱讀 系列第二篇&#xff0c;主要講述如何實現 kubernetes api-server 的 debug 參考b站視頻地址&#xff1a;Kubernetes源碼開發之旅二 1.本篇章任務 Go-Delve&#xff1a;go語言的…

webrtc 視頻 demo

webrtc 視頻 demo webrtc網上封裝的很多&#xff0c;demo很多都是一個頁面里實現的&#xff0c;今天實現了個完整的 &#xff0c; A 發視頻給 BA webrtc.html作為offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

條件注釋判斷瀏覽器版本!--[if lt IE 9](轉載)

<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]--> <!--[if IE]> 所有的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以及IE6以下版本可識別 <![endif]--> <!--[if …

[轉]阿里開源低代碼引擎LowCodeEngine

一、什么是低代碼引擎 低代碼引擎是具備強大擴展能力的低代碼研發框架&#xff0c;使用者只需要基于低代碼引擎便可以快速定制符合自己業務需求的低代碼平臺。同時&#xff0c;低代碼引擎還在標準低代碼設計器的基礎上提供了簡單易用的定制擴展能力&#xff0c;能夠滿足業務獨特…

Beyond Istio OSS——Istio服務網格的現狀與未來

作者&#xff1a;宋凈超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根據筆者在 GIAC 深圳 2022 年大會上的的演講《Beyond Istio OSS —— Istio 的現狀及未來》[1] 整理而成&#xff0c;演講幻燈片見…

js多維數組扁平化

數組扁平化&#xff0c;就是將多維數組碾平為一維數組&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一個二維數組 var arr [a, [b, 2], [c, 3, x]]&#xff0c;將其扁平化&#xff1a; 1. 通過 apply 借用數組的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16講 用戶程序的結構與執行

轉載于:https://www.cnblogs.com/atuo/p/5609843.html

兩種方法清除Excel保護密碼

一、利用VBA腳本直接清除 打Excel&#xff0c;打開腳本編輯器&#xff08;AltF11&#xff09;或者如圖&#xff0c;右鍵sheet名稱 輸入代碼并運行&#xff0c;即可清除密碼保護&#xff1a; Sub DeletePW()ActiveSheet.Protect DrawingObjects:True, Contents:True, AllowFil…

jsonp-反向代理-CORS解決JS跨域問題的個人總結

jsonp-反向代理-CORS解決JS跨域問題的個人總結 網上說了很多很多&#xff0c;但是看完之后還是很混亂&#xff0c;所以我自己重新總結一下。解決 js 跨域問題一共有8種方法&#xff0c; jsonp&#xff08;只支持 get&#xff09;反向代理CORSdocument.domain iframe 跨域windo…