{"id":38673,"date":"2023-02-19T14:23:49","date_gmt":"2022-11-15T03:57:52","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/"},"modified":"2024-04-29T15:18:50","modified_gmt":"2024-04-29T07:18:50","slug":"%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/","title":{"rendered":"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d"},"content":{"rendered":"<p>\u6210\u7acb\u65e5\u671f\uff1a2023\u5e743\u670827\u65e5<\/p>\n<p>\u5728\u4e4b\u524d\u7684\u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u539f\u578b\u5b9e\u73b0\u4e86\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\uff08\u5305\u62ecGET\u3001POST\u3001PATCH\u548cDELETE\u65b9\u6cd5\uff09\u4ee5\u53ca\u4e00\u4e2aReact\u7684API\u5ba2\u6237\u7aef\uff08\u53ea\u5305\u542bGET\u65b9\u6cd5\uff09\u3002\u8fd9\u6b21\uff0c\u6211\u4eec\u60f3\u628a\u5b83\u4eec\u653e\u5728Docker\u4e2d\u5c1d\u8bd5\u4e00\u4e0b\u3002<\/p>\n<h1>\u8bd5\u7740\u5c06\u65b0\u7684React\u5e94\u7528\u7a0b\u5e8f\u653e\u5165Docker\u8fdb\u884c\u7ec3\u4e60\u3002<\/h1>\n<h2>\u672c\u5730\u521b\u5efaReact\u5e94\u7528\u3002<\/h2>\n<pre class=\"post-pre\"><code>% npx create-react-app docker-react20230325\r\n<\/code><\/pre>\n<p>\u7528\u6837\u4f8b\u4ee3\u7801\u66f4\u65b0App.js\u3002<\/p>\n<pre class=\"post-pre\"><code>import React, { useState, useEffect } from \"react\";\r\n\r\nconst INITIAL_COUNT = 0;\r\nconst SampleComponent = () =&gt; {\r\n  const [count, setCount] = useState(INITIAL_COUNT);\r\n  const callbackFunction = () =&gt; {\r\n    document.title = `${count} \u56de\u30af\u30ea\u30c3\u30af\u3055\u308c\u307e\u3057\u305f`;\r\n  }\r\n  useEffect(callbackFunction, [count]);\r\n  const countIncrement = () =&gt; {\r\n    setCount((prevCount) =&gt; prevCount + 1);\r\n  };\r\n  const countReset = () =&gt; {\r\n    setCount(INITIAL_COUNT);\r\n  };\r\n\r\n  return (\r\n    &lt;div className=\"App\"&gt;\r\n      &lt;p&gt;\u73fe\u5728\u306e\u30ab\u30a6\u30f3\u30c8\u6570\uff1a{count}&lt;\/p&gt;\r\n      &lt;button onClick={countIncrement}&gt;+1 \u30dc\u30bf\u30f3&lt;\/button&gt;\r\n      &lt;button onClick={countReset}&gt;\u30ea\u30bb\u30c3\u30c8&lt;\/button&gt;\r\n    &lt;\/div&gt;\r\n  );\r\n};\r\n\r\nexport default function App() {\r\n  return &lt;SampleComponent \/&gt;;\r\n}\r\n<\/code><\/pre>\n<p>\u6211\u5011\u8a66\u8a66\u5728\u672c\u5730\u904b\u884c\u4e00\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code>% yarn install\r\n% yarn start\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/9-0.png\" alt=\"undefined\" \/><\/div>\n<h2>\u521b\u5efaDockerfile<\/h2>\n<p>\u5728 docker-react20230325 \u6587\u4ef6\u5939\u7684\u76f4\u63a5\u4e0b\u65b9\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a Dockerfile \u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u4f5c\u6210\r\nFROM node:latest\r\n# \u30b3\u30f3\u30c6\u30ca\u5185\u3067\u4f5c\u696d\u3059\u308b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u6307\u5b9a\r\nWORKDIR \/usr\/src\/app\r\n# package.json\u3068yarn.lock\u3092\/usr\/src\/app\u306b\u30b3\u30d4\u30fc\r\nCOPY [\"package.json\", \"yarn.lock\", \".\/\"]\r\n# \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\nRUN yarn install\r\n# \u30d5\u30a1\u30a4\u30eb\u3092\u5168\u90e8\u4f5c\u696d\u7528\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30b3\u30d4\u30fc\r\nCOPY . .\r\n# \u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3059\u308b\u969b\u306b\u5b9f\u884c\u3055\u308c\u308b\u30b3\u30de\u30f3\u30c9\r\nENTRYPOINT [ \"yarn\", \"start\" ]\r\n<\/code><\/pre>\n<h2>\u6784\u5efa\u56fe\u50cf<\/h2>\n<pre class=\"post-pre\"><code>% docker build -t test20230325:1.0 .\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u4f1a\u786e\u8ba4\u6240\u521b\u5efa\u7684\u56fe\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker image ls\r\nREPOSITORY                         TAG                    IMAGE ID       CREATED          SIZE\r\ntest20230325                       1.0                    4c6f98c9577a   35 seconds ago   1.46GB\r\n<\/code><\/pre>\n<h2>\u542f\u52a8\u5bb9\u5668<\/h2>\n<pre class=\"post-pre\"><code>% docker run -dit --name sample20230325 -p 3000:3000 test20230325:1.0\r\n% docker ps\r\nCONTAINER ID   IMAGE                        COMMAND                   CREATED         STATUS              PORTS                                       NAMES\r\n991a053dc232   test20230325:1.0             \"yarn start\"              8 seconds ago   Up 6 seconds        0.0.0.0:3000-&gt;3000\/tcp, :::3000-&gt;3000\/tcp   sample20230325\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/19-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u6211\u4f1a\u5728AWS\u4e0a\u5c1d\u8bd5\u4f7f\u7528Docker\u8fdb\u884c\u542f\u52a8\u3002<\/h1>\n<p>\u5c06\u56fe\u50cf\u8f6c\u5316\u4e3a\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker save -o test20230325.tar test20230325:1.0\r\n<\/code><\/pre>\n<p>\u5c06\u5df2\u5c06\u6587\u4ef6\u7f16\u7801\u4e3a\u56fe\u50cf\u7684\u6587\u4ef6\u4f20\u8f93\u5230 EC2 \u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code>% scp -i ~\/.aws\/docker20230223.pem .\/test20230325.tar ubuntu@54.168.241.85:\/home\/ubuntu\r\n<\/code><\/pre>\n<p>\u5728EC2\u4e0a\u6267\u884cdocker load\u64cd\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker load -i test20230325.tar\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/27-0.png\" alt=\"undefined\" \/><\/div>\n<p>\u786e\u8ba4\u56fe\u50cf\u53ef\u7528\u540e\uff0c\u6267\u884c\u64cd\u4f5c\u3002\u5c1d\u8bd5\u4f7f\u7528\u7aef\u53e38082\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker image ls\r\n% docker run -dit --name sample20230325 -p 8082:3000 test20230325:1.0\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/30-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u7528 Docker \u5728 Go \u7684 API \u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u3002<\/h1>\n<h2>\u5728\u672c\u5730\u7684 Docker \u4e2d\u6267\u884c<\/h2>\n<h3>\u4ee3\u7801\u4fee\u6539<\/h3>\n<p>\u7531\u4e8e\u5728Docker\u4e0a\u65e0\u6cd5\u6b63\u5e38\u8fd0\u884c\uff0c\u56e0\u6b64\u6211\u5df2\u66f4\u65b0\u4e86\u7b2c103\u81f3104\u884c\u7684\u4ee3\u7801\uff08Github\u4e0a\u7684\u4ee3\u7801\uff09\u3002<\/p>\n<h3>\u521b\u5efaDockerfile<\/h3>\n<p>\u5728 go-api \u4e2d\u521b\u5efa\u4e00\u4e2a Dockerfile\u3002<\/p>\n<pre class=\"post-pre\"><code># https:\/\/hub.docker.com\/_\/golang\r\nFROM golang:1.18.1-alpine\r\nWORKDIR \/app\r\n# main.go \u3068 go.mod \u3068 go.sum \u3092 \/app \u306b\u30b3\u30d4\u30fc\r\nCOPY [\"main.go\", \"go.mod\", \"go.sum\", \".\/\"]\r\n# \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\nRUN go build\r\n# \u30b3\u30f3\u30c6\u30ca\u3092\u8d77\u52d5\u3059\u308b\u969b\u306b\u5b9f\u884c\u3055\u308c\u308b\u30b3\u30de\u30f3\u30c9\r\nCMD [\"go\", \"run\", \"main.go\"]\r\n<\/code><\/pre>\n<h3>\u6784\u5efa\u56fe\u50cf<\/h3>\n<pre class=\"post-pre\"><code>% docker build -t go_test20230326:1.0 .\r\n<\/code><\/pre>\n<p>\u6211\u8981\u786e\u8ba4\u4e00\u4e0b\u5236\u4f5c\u597d\u7684\u5f62\u8c61\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker image ls\r\nREPOSITORY                         TAG                    IMAGE ID       CREATED          SIZE\r\ngo_test20230326                    1.0                    3d7a9e08b500   17 seconds ago   329MB\r\n<\/code><\/pre>\n<h3>\u542f\u52a8\u5bb9\u5668<\/h3>\n<pre class=\"post-pre\"><code>% docker run -it --name go_api -p 8080:8080 go_test20230326:1.0\r\n% docker ps\r\nCONTAINER ID   IMAGE                        COMMAND                   CREATED         STATUS         PORTS                                       NAMES\r\n3eaec32c28f0   go_test20230326:1.0          \"go run main.go\"          5 seconds ago   Up 3 seconds   0.0.0.0:8080-&gt;8080\/tcp, :::8080-&gt;8080\/tcp   go_api\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/44-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u4f7f\u7528Docker\u5728EC2\u4e0a\u8fd0\u884cGo\u7684API\u670d\u52a1\u5668<\/h1>\n<p>\u5c06\u56fe\u50cf\u8f6c\u5316\u4e3a\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker image list\r\nREPOSITORY                         TAG                    IMAGE ID       CREATED          SIZE\r\ngo_test20230326                    1.0                    f4b523363243   15 minutes ago   501MB\r\n% docker save -o go_test20230326.tar go_test20230326:1.0\r\n<\/code><\/pre>\n<p>\u5c06\u6587\u4ef6\u5316\u7684\u955c\u50cf\u4f20\u8f93\u5230 EC2\u3002<\/p>\n<pre class=\"post-pre\"><code>% scp -i ~\/.aws\/docker20230223.pem .\/go_test20230326.tar ubuntu@13.115.30.209:\/home\/ubuntu\r\n<\/code><\/pre>\n<p>\u5728 EC2 \u4e0a\u52a0\u8f7d docker\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker load -i go_test20230326.tar\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u56fe\u50cf\u53ef\u7528\u540e\uff0c\u6267\u884c\u3002\u5c1d\u8bd5\u4f7f\u7528\u7aef\u53e38080\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker image ls\r\n$ docker run -it --name go-api -p 8080:8080 go_test20230326:1.0\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/54-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u5728Docker\u7f51\u7edc\u4e2d\u8fdb\u884c\u901a\u4fe1\u3002<\/h1>\n<h2>\u5728\u672c\u5730\u7684 Docker \u4e2d\u521b\u5efa\u4e00\u4e2a Go API \u670d\u52a1\u5668\u7684\u5bb9\u5668\uff0c\u5e76\u4ece\u53e6\u4e00\u4e2a\u5bb9\u5668\u53d1\u51fa\u8bf7\u6c42\u3002<\/h2>\n<p>\u5728\u7f51\u7edcapinet\u4e0a\u642d\u5efa\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\u5bb9\u5668<\/p>\n<pre class=\"post-pre\"><code>% docker network create apinet\r\n% docker run -it --name go-api --net apinet go-api20230326:1.0\r\n<\/code><\/pre>\n<p>\u6211\u4f1a\u5efa\u7acb\u4e00\u4e2a\u5bb9\u5668\u6765\u8fdb\u884cAPI\u8bf7\u6c42\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker run -rm -it --net apinet ubuntu \/bin\/bash\r\n<\/code><\/pre>\n<p>\u5728\u5bb9\u5668\u4e2d\u5b89\u88c5\u5404\u79cd\u8f6f\u4ef6\u5e76\u53d1\u9001API\u8bf7\u6c42\u4ee5\u8fdb\u884c\u786e\u8ba4\u3002<\/p>\n<pre class=\"post-pre\"><code># apt update\r\n# apt -y upgrade\r\n# apt install -y iproute2 iputils-ping curl\r\n# ping -c 4 go-api\r\n# curl http:\/\/go-api:8080\/health_data\r\n[\r\n    {\r\n        \"id\": 1,\r\n        \"month\": 1,\r\n        \"day\": 1,\r\n        \"weight\": 55.5\r\n    },\r\n    {\r\n        \"id\": 2,\r\n        \"month\": 1,\r\n        \"day\": 2,\r\n        \"weight\": 66.6\r\n    },\r\n    {\r\n        \"id\": 3,\r\n        \"month\": 1,\r\n        \"day\": 3,\r\n        \"weight\": 77.7\r\n    }\r\n<\/code><\/pre>\n<h1>\u5728\u672c\u5730\u7684Docker\u4e0a\uff0c\u521b\u5efa\u4e00\u4e2a\u5305\u542bGo\u7684API\u670d\u52a1\u5668\u548cReact\u7684API\u5ba2\u6237\u7aef\u7684\u5bb9\u5668\u3002<\/h1>\n<p>React\u7a0b\u5e8f\u4f1a\u88ab\u52a0\u8f7d\u5230\u672c\u5730\u6d4f\u89c8\u5668\u5e76\u6267\u884c\uff0c\u7136\u540e\u4ece\u201c\u672c\u5730\u6d4f\u89c8\u5668\u201d\u5411\u201c\u672c\u5730Docker\u4e0a\u7684Go API\u670d\u52a1\u5668\u201d\u53d1\u9001\u8bf7\u6c42\u3002<br \/>\n\u8fd9\u662fGithub\u4e0a\u7684\u4ee3\u7801\u5b58\u50a8\u5e93\u94fe\u63a5\u3002<\/p>\n<p>\u6211\u4f1a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aapinet\u7684\u7f51\u7edc\u3002\u867d\u7136\u73b0\u5728\u4e0d\u4f1a\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u4f46\u5c06\u6765\u8ba1\u5212\u7528\u4e8e\u6570\u636e\u5e93\u8fde\u63a5\u3002<\/p>\n<pre class=\"post-pre\"><code>% docker network create apinet\r\n<\/code><\/pre>\n<h2>\u6211\u5c06\u542f\u52a8Go\u7684API\u670d\u52a1\u5668\u5bb9\u5668\u3002<\/h2>\n<pre class=\"post-pre\"><code>% pwd\r\n\/***\/go-api\r\n% docker build -t go-api20230327:1.0 .\r\n% docker run -it --name go-api --net apinet -p 8080:8080 go-api20230327:1.0\r\n<\/code><\/pre>\n<h1>\u6211\u4f1a\u542f\u52a8React\u7684API\u5ba2\u6237\u7aef\u5bb9\u5668\u3002<\/h1>\n<pre class=\"post-pre\"><code>% pwd\r\n\/***\/react\r\n% docker build -t react-api20230327:1.0 .\r\n% docker run -it --name react-api --net apinet -p 3000:3000 react-api20230327:1.0\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/71-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u6211\u4f1a\u5728AWS EC2\u4e0a\u4f7f\u7528Docker\u642d\u5efa\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\u548c\u4e00\u4e2aReact\u7684API\u5ba2\u6237\u7aef\u3002<\/h1>\n<h2>\u5c06EC2\u7684IP\u5730\u5740\u53cd\u6620\u5230React\u4ee3\u7801\u4e2d\u3002<\/h2>\n<pre class=\"post-pre\"><code>const response = await axios.get(\"http:\/\/54.199.172.102:8080\/health_data\");\r\n<\/code><\/pre>\n<h2>\u5c06EC2\u7684IP\u5730\u5740\u53cd\u6620\u5230Go\u7684\u4ee3\u7801\u4e2d\u3002<\/h2>\n<pre class=\"post-pre\"><code>config.AllowOrigins = []string{\"http:\/\/54.199.172.102:3000\"}\r\n<\/code><\/pre>\n<h2>\u5c06\u56fe\u50cf\u6587\u4ef6\u5316\u5e76\u590d\u5236\u5230EC2\u4e0a\u3002<\/h2>\n<pre class=\"post-pre\"><code>% docker build -t react-api20230327a:1.0 .\r\n% docker build -t go-api20230327a:1.0 .\r\n% docker image ls\r\nREPOSITORY                         TAG                    IMAGE ID       CREATED         SIZE\r\nreact-api20230327a                 1.0                    873f12e8926c   2 hours ago     1.52GB\r\ngo-api20230327a                    1.0                    086fb0816a7c   17 hours ago    501MB\r\n% docker save -o react-api20230327a.tar react-api20230327a:1.0\r\n% docker save -o go-api20230327a.tar go-api20230327a:1.0\r\n% scp -i ~\/.aws\/docker20230223.pem .\/react-api20230327a.tar ubuntu@54.199.172.102:\/home\/ubuntu\r\n% scp -i ~\/.aws\/docker20230223.pem .\/go-api20230327a.tar ubuntu@54.199.172.102:\/home\/ubuntu\r\n<\/code><\/pre>\n<h2>\u5728 EC2 \u4e0a\u4f7f\u7528 docker load<\/h2>\n<pre class=\"post-pre\"><code>$ docker load -i react-api20230327a.tar\r\n$ docker load -i go-api20270327a.tar\r\n<\/code><\/pre>\n<h2>\u6211\u4f1a\u5728EC2\u4e0a\u6253\u5f00\u7aef\u53e33000\u3002<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/82-0.png\" alt=\"undefined\" \/><\/div>\n<h2>\u4f7f\u7528EC2\u6765\u90e8\u7f72\u5bb9\u5668\uff08Go\u7684API\u670d\u52a1\u5668\u548cReact\u7684API\u5ba2\u6237\u7aef\uff09\u3002<\/h2>\n<p>React\u7684API\u5ba2\u6237\u7aef\u5c06\u4f7f\u7528\u7aef\u53e33000\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker network create apinet\r\n$ docker run -it --name go-api --net apinet -p 8080:8080 go-api20230327:1.0\r\n$ docker run -it --name react-api --net apinet -p 3000:3000 react-api20230327a:1.0\r\n<\/code><\/pre>\n<h2>\u6211\u80fd\u591f\u4ece\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d\u8bbf\u95eeReact\uff0c\u5e76\u4e14\u80fd\u591f\u901a\u8fc7\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u7684Go API\u670d\u52a1\u5668\u8fdb\u884cGET\u8bf7\u6c42\u3002<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/87-0.png\" alt=\"undefined\" \/><\/div>\n<h1>\u8bf7\u53c2\u8003\u3002<\/h1>\n<p>\u30fb\u4f7f\u7528Docker\u642d\u5efaReact\u5f00\u53d1\u73af\u5883<br \/>\n\u30fb\u4f7f\u7528SCP\u5c06\u6587\u4ef6\u4f20\u8f93\u5230AWS\u7684EC2<br \/>\n\u30fb\u5728Ubuntu\u670d\u52a1\u5668\u4e0a\u5b89\u88c5Nginx<br \/>\n\u30fb\u5728EC2\u4e0a\u4f7f\u7528https\u4ee5\u5916\u90e8\u65b9\u5f0f\u8bbf\u95ee\u8fd0\u884cReact\u7684npm\u670d\u52a1<br \/>\n\u30fbDocker\u5165\u95e8 | \u6784\u5efagolang\u548cgin\u7684\u73af\u5883<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6210\u7acb\u65e5\u671f\uff1a2023\u5e743\u670827\u65e5 \u5728\u4e4b\u524d\u7684\u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u539f\u578b\u5b9e\u73b0\u4e86\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\uff08\u5305\u62ecGET\u3001POST [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-38673","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06react\u7684api\u5ba2\u6237\u7aef\u548cgo\u7684api\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eec2\u4e0a\u7684docker\u4e2d\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d\" \/>\n<meta property=\"og:description\" content=\"\u6210\u7acb\u65e5\u671f\uff1a2023\u5e743\u670827\u65e5 \u5728\u4e4b\u524d\u7684\u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u539f\u578b\u5b9e\u73b0\u4e86\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\uff08\u5305\u62ecGET\u3001POST [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06react\u7684api\u5ba2\u6237\u7aef\u548cgo\u7684api\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eec2\u4e0a\u7684docker\u4e2d\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-15T03:57:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T07:18:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/9-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/\",\"name\":\"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-11-15T03:57:52+00:00\",\"dateModified\":\"2024-04-29T07:18:50+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06react\u7684api\u5ba2\u6237\u7aef\u548cgo\u7684api\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eec2\u4e0a\u7684docker\u4e2d\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d","og_description":"\u6210\u7acb\u65e5\u671f\uff1a2023\u5e743\u670827\u65e5 \u5728\u4e4b\u524d\u7684\u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u539f\u578b\u5b9e\u73b0\u4e86\u4e00\u4e2aGo\u7684API\u670d\u52a1\u5668\uff08\u5305\u62ecGET\u3001POST [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06react\u7684api\u5ba2\u6237\u7aef\u548cgo\u7684api\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eec2\u4e0a\u7684docker\u4e2d\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-11-15T03:57:52+00:00","article_modified_time":"2024-04-29T07:18:50+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d35cc37434c4406c6daa6\/9-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/","name":"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-11-15T03:57:52+00:00","dateModified":"2024-04-29T07:18:50+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5c06React\u7684API\u5ba2\u6237\u7aef\u548cGo\u7684API\u670d\u52a1\u5668\u90e8\u7f72\u5230\u4f4d\u4e8eEC2\u4e0a\u7684Docker\u4e2d"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86react%e7%9a%84api%e5%ae%a2%e6%88%b7%e7%ab%af%e5%92%8cgo%e7%9a%84api%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%83%a8%e7%bd%b2%e5%88%b0%e4%bd%8d%e4%ba%8eec2%e4%b8%8a%e7%9a%84docker%e4%b8%ad%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=38673"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38673\/revisions"}],"predecessor-version":[{"id":86055,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/38673\/revisions\/86055"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=38673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=38673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=38673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}