{"id":19896,"date":"2025-04-25T09:26:53","date_gmt":"2025-04-25T01:26:53","guid":{"rendered":"https:\/\/mnya.tw\/cc\/?p=19896"},"modified":"2025-04-25T09:36:09","modified_gmt":"2025-04-25T01:36:09","slug":"2459","status":"publish","type":"post","link":"https:\/\/mnya.tw\/cc\/word\/2459.html","title":{"rendered":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED"},"content":{"rendered":"<p>\u5728\u7269\u806f\u7db2\uff08IoT\uff09\u8207\u8cc7\u6599\u6d41\u81ea\u52d5\u5316\u65e5\u76ca\u666e\u53ca\u7684\u4eca\u5929\uff0c<strong>Node-RED<\/strong> \u6210\u70ba\u773e\u591a\u958b\u767c\u8005\u8207\u5de5\u7a0b\u5e2b\u7684\u9996\u9078\u5229\u5668\u3002\u5b83\u662f\u4e00\u6b3e\u57fa\u65bc Node.js \u7684\u958b\u6e90\u6d41\u7a0b\u5f0f\u958b\u767c\u5de5\u5177\uff0c\u900f\u904e\u5716\u5f62\u5316\u4ecb\u9762\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u8f15\u9b06\u62d6\u62c9\u7bc0\u9ede\uff08nodes\uff09\u4f86\u4e32\u63a5\u8cc7\u6599\u4f86\u6e90\u3001\u8655\u7406\u908f\u8f2f\u8207\u8f38\u51fa\u7d50\u679c\u3002\u7121\u8ad6\u662f\u611f\u6e2c\u5668\u6578\u64da\u7684\u6536\u96c6\u3001\u7cfb\u7d71\u4e4b\u9593\u7684\u6574\u5408\uff0c\u9084\u662f\u8907\u96dc\u6d41\u7a0b\u7684\u81ea\u52d5\u5316\uff0cNode-RED \u90fd\u80fd\u5feb\u901f\u90e8\u7f72\u4e14\u9ad8\u5ea6\u64f4\u5145\u3002\u9019\u7a2e\u4f4e\u7a0b\u5f0f\u78bc\uff08low-code\uff09\u958b\u767c\u6a21\u5f0f\u5927\u5e45\u964d\u4f4e\u9580\u6abb\uff0c\u4f7f\u5f97\u975e\u5c08\u696d\u958b\u767c\u8005\u4e5f\u80fd\u9748\u6d3b\u5efa\u69cb\u51fa\u7a69\u5065\u7684\u81ea\u52d5\u5316\u89e3\u6c7a\u65b9\u6848\u3002<\/p>\n<p>\u70ba\u4e86\u8b93\u4f7f\u7528\u8005\u80fd\u66f4\u5feb\u901f\u3001\u7a69\u5b9a\u5730\u90e8\u7f72 Node-RED\uff0c\u672c\u6587\u63d0\u4f9b\u4e00\u5957\u57fa\u65bc Docker Compose \u7684\u5b89\u88dd\u6d41\u7a0b\uff0c\u9069\u7528\u65bc\u5e0c\u671b\u5feb\u901f\u5efa\u7acb\u6e2c\u8a66\u74b0\u5883\u6216\u6b63\u5f0f\u5c08\u6848\u7684\u958b\u767c\u8005\u3002\u6574\u500b\u5c08\u6848\u74b0\u5883\u5305\u542b\u81ea\u52d5\u5316\u751f\u6210 <code>.env<\/code> \u6a94\u6848\u3001\u521d\u59cb\u5316\u8207\u7de8\u8f2f\u8173\u672c\u3001\u6301\u4e45\u5316\u5132\u5b58\u8a2d\u5b9a\uff0c\u4ee5\u53ca\u5bb9\u5668\u5316\u914d\u7f6e\u3002\u53ea\u9700\u900f\u904e\u5e7e\u500b\u6307\u4ee4\uff0c\u5373\u53ef\u5efa\u7acb\u4e00\u500b\u53ef\u91cd\u8907\u90e8\u7f72\u4e14\u6613\u65bc\u7dad\u8b77\u7684 Node-RED \u5bb9\u5668\u74b0\u5883\uff0c\u514d\u9664\u7e41\u7463\u7684\u624b\u52d5\u5b89\u88dd\u8207\u6b0a\u9650\u8abf\u6574\u904e\u7a0b\u3002\u9019\u6a23\u7684\u8a2d\u8a08\u4e0d\u50c5\u5f37\u5316\u90e8\u7f72\u6548\u7387\uff0c\u66f4\u7b26\u5408\u73fe\u4ee3 DevOps \u81ea\u52d5\u5316\u7684\u5be6\u52d9\u9700\u6c42\u3002<\/p>\n<blockquote><p>\ud83d\udd17 GitHub \u5132\u5b58\u5eab\uff1a<a href=\"https:\/\/github.com\/qwe987299\/nodered-docker\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/qwe987299\/nodered-docker<\/a><\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg\" width=\"1024\" height=\"768\" \/><\/p>\n<h1><span style=\"color: #000080;\">\ud83d\udcdd docker-compose.yml<\/span><\/h1>\n<pre class=\"line-numbers\"><code class=\"language-yaml\">services:\r\n    node-red:\r\n        image: nodered\/node-red:latest\r\n        container_name: ${NODE_RED_CONTAINER_NAME}\r\n        restart: always\r\n        network_mode: bridge\r\n        extra_hosts:\r\n        - \"host.docker.internal:host-gateway\"\r\n        environment:\r\n            - TZ=Asia\/Taipei\r\n        ports:\r\n            - \"${NODE_RED_PORT}:1880\"\r\n        volumes:\r\n            - .\/node_red_data:\/data<\/code><\/pre>\n<p>\u9019\u4efd <code>docker-compose.yml<\/code> \u6a94\u6848\u5b9a\u7fa9\u4e86\u4e00\u500b\u540d\u70ba <code>node-red<\/code> \u7684\u670d\u52d9\uff0c\u4f7f\u7528\u6700\u65b0\u7248\u7684 Node-RED \u6620\u50cf\u6a94\uff0c\u5bb9\u5668\u540d\u7a31\u8207\u5c0d\u5916\u57e0\u865f\u7531 <code>.env<\/code> \u6a94\u6848\u4e2d\u7684\u8b8a\u6578\u6307\u5b9a\u3002\u8a72\u5bb9\u5668\u63a1\u7528 bridge \u7db2\u8def\u6a21\u5f0f\uff0c\u4e26\u900f\u904e <code>extra_hosts<\/code> \u5c07\u4e3b\u6a5f\u540d\u7a31 <code>host.docker.internal<\/code> \u6620\u5c04\u81f3 gateway\uff0c\u6642\u5340\u8a2d\u5b9a\u70ba\u53f0\u5317\u6642\u9593\uff0c\u639b\u8f09\u672c\u5730\u7684 <code>node_red_data<\/code> \u8cc7\u6599\u593e\u4f5c\u70ba\u5bb9\u5668\u5167\u7684 <code>\/data<\/code> \u76ee\u9304\uff0c\u4ee5\u78ba\u4fdd\u8cc7\u6599\u6301\u4e45\u5316\uff0c\u4e26\u8a2d\u5b9a\u7576\u5bb9\u5668\u7570\u5e38\u505c\u6b62\u6642\u81ea\u52d5\u91cd\u555f\u3002<\/p>\n<h1><span style=\"color: #000080;\">\ud83d\udcdd .env.sample<\/span><\/h1>\n<pre class=\"line-numbers\"><code class=\"language-markup\"># .env.sample\r\nNODE_RED_CONTAINER_NAME=nodered\r\nNODE_RED_PORT=1880<\/code><\/pre>\n<p>\u9019\u4efd .env.sample \u6a94\u6848\u63d0\u4f9b\u4e86 Node-RED \u5bb9\u5668\u7684\u9810\u8a2d\u74b0\u5883\u8b8a\u6578\uff0c\u8a2d\u5b9a\u5bb9\u5668\u540d\u7a31\u70ba nodered\uff0c\u5c0d\u5916\u6620\u5c04\u7684\u670d\u52d9\u57e0\u70ba 1880\uff0c\u53ef\u4f9b\u4f7f\u7528\u8005\u53c3\u8003\u6216\u8907\u88fd\u7de8\u8f2f\u6210\u6b63\u5f0f\u7684 .env \u6a94\u6848\u4f7f\u7528\u3002<\/p>\n<h1><span style=\"color: #000080;\">\ud83d\udcdd chown.sh<\/span><\/h1>\n<pre class=\"line-numbers\"><code class=\"language-bash\">sudo chown -R 1000:1000 node_red_data<\/code><\/pre>\n<p>\u9019\u652f <code>chown.sh<\/code> \u8173\u672c\u7684\u5167\u5bb9\u975e\u5e38\u7c21\u6f54\uff0c\u4e3b\u8981\u662f\u900f\u904e <code>sudo chown -R 1000:1000 node_red_data<\/code> \u6307\u4ee4\uff0c\u5c07 <code>node_red_data<\/code> \u8cc7\u6599\u593e\u53ca\u5176\u5e95\u4e0b\u6240\u6709\u6a94\u6848\u7684\u64c1\u6709\u8005\u8207\u7fa4\u7d44\u6b0a\u9650\u905e\u8ff4\u8a2d\u5b9a\u70ba UID \u53ca GID \u70ba 1000 \u7684\u4f7f\u7528\u8005\uff0c\u4ee5\u78ba\u4fdd Node-RED \u5bb9\u5668\u5728\u904b\u884c\u6642\u80fd\u6b63\u78ba\u8b80\u5beb\u8a72\u8cc7\u6599\u593e\u3002<\/p><div class=\"3a456c955cc9861673f62d33beb7714e\" data-index=\"2\" style=\"float: none; margin:0px;\">\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2683739050533486\"\r\n     crossorigin=\"anonymous\"><\/script>\r\n<ins class=\"adsbygoogle\"\r\n     style=\"display:block; text-align:center;\"\r\n     data-ad-layout=\"in-article\"\r\n     data-ad-format=\"fluid\"\r\n     data-ad-client=\"ca-pub-2683739050533486\"\r\n     data-ad-slot=\"3270345536\"><\/ins>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script>\n<\/div>\n\n<h1><span style=\"color: #000080;\">\ud83d\udcdd init-env.sh<\/span><\/h1>\n<pre class=\"line-numbers\"><code class=\"language-bash\">#!\/bin\/bash\r\n\r\n# Function for countdown timer\r\ncountdown() {\r\n  local seconds=$1\r\n  local message=$2\r\n  echo \"$message\"\r\n  while [ $seconds -gt 0 ]; do\r\n    echo -ne \"\u23f3 Waiting for $seconds seconds...\\r\"\r\n    sleep 1\r\n    ((seconds--))\r\n  done\r\n  echo -e \"\\n\u2705 Done!\"\r\n}\r\n\r\n# Check if .env file already exists\r\nif [ -f .env ]; then\r\n  echo \".env file already exists.\"\r\n  read -p \"Do you want to overwrite it? (y\/N): \" confirm\r\n  if [[ ! \"$confirm\" =~ ^[Yy]$ ]]; then\r\n    echo \"Operation canceled.\"\r\n    exit 0\r\n  fi\r\nfi\r\n\r\n# Interactive input for environment variables\r\nread -p \"Enter the container name (default: nodered): \" container_name\r\nread -p \"Enter the Node-RED external port (default: 1880): \" node_red_port\r\n\r\n# Set default values if no input provided\r\ncontainer_name=${container_name:-nodered}\r\nnode_red_port=${node_red_port:-1880}\r\n\r\n# Generate the .env file\r\ncat &lt;&lt;EOF &gt; .env\r\nNODE_RED_CONTAINER_NAME=$container_name\r\nNODE_RED_PORT=$node_red_port\r\nEOF\r\n\r\necho \".env file has been created successfully!\"\r\n\r\n# Ask if the user wants to start the environment\r\nread -p \"Do you want to start the environment now? (y\/N): \" start_env\r\nif [[ \"$start_env\" =~ ^[Yy]$ ]]; then\r\n  docker compose up -d\r\n\r\n  # Check if docker compose executed successfully\r\n  if [ $? -eq 0 ]; then\r\n    echo \"\u2705 Environment started successfully!\"\r\n    \r\n    # Countdown for 3 seconds before running chown.sh\r\n    countdown 3 \"Preparing to run chown.sh...\"\r\n\r\n    if [ -f chown.sh ]; then\r\n      echo \"\u25b6\ufe0f Running chown.sh...\"\r\n      bash chown.sh\r\n      \r\n      # Check if chown.sh executed successfully\r\n      if [ $? -eq 0 ]; then\r\n        echo \"\u2705 chown.sh executed successfully!\"\r\n      else\r\n        echo \"\u274c Failed to execute chown.sh.\"\r\n        exit 1\r\n      fi\r\n    else\r\n      echo \"\u274c chown.sh not found. Please ensure the file exists.\"\r\n      exit 1\r\n    fi\r\n  else\r\n    echo \"\u274c Failed to start the environment. Please check the Docker Compose configuration.\"\r\n    exit 1\r\n  fi\r\nelse\r\n  echo \"\u2139\ufe0f You can start the environment later using 'docker compose up -d'.\"\r\nfi<\/code><\/pre>\n<p>\u9019\u652f <code>init-env.sh<\/code> \u662f\u4e00\u500b\u4e92\u52d5\u5f0f\u521d\u59cb\u5316\u8173\u672c\uff0c\u7528\u4f86\u5efa\u7acb <code>.env<\/code> \u74b0\u5883\u8b8a\u6578\u6a94\u3002\u4f7f\u7528\u8005\u53ef\u900f\u904e\u7d42\u7aef\u6a5f\u8f38\u5165\u5bb9\u5668\u540d\u7a31\u8207\u5c0d\u5916\u57e0\u865f\uff0c\u82e5\u672a\u8f38\u5165\u5247\u4f7f\u7528\u9810\u8a2d\u503c\uff0c\u63a5\u8457\u81ea\u52d5\u7522\u751f <code>.env<\/code> \u6a94\u6848\u3002\u8173\u672c\u6703\u8a62\u554f\u662f\u5426\u7acb\u5373\u555f\u52d5 Docker \u74b0\u5883\uff0c\u82e5\u9078\u64c7\u555f\u52d5\uff0c\u6703\u57f7\u884c <code>docker compose up -d<\/code> \u4e26\u5728\u77ed\u66ab\u5012\u6578\u5f8c\u57f7\u884c <code>chown.sh<\/code>\uff0c\u4ee5\u8a2d\u5b9a\u8cc7\u6599\u593e\u6b0a\u9650\uff0c\u78ba\u4fdd Node-RED \u5bb9\u5668\u80fd\u9806\u5229\u904b\u4f5c\u3002<\/p>\n<h1><span style=\"color: #000080;\">\ud83d\udcdd edit-env.sh<\/span><\/h1>\n<pre class=\"line-numbers\"><code class=\"language-bash\">#!\/bin\/bash\r\n\r\n# Check if .env file exists\r\nif [ ! -f .env ]; then\r\n  echo \"\u26a0\ufe0f .env file not found. Creating a new one.\"\r\n  touch .env\r\nfi\r\n\r\n# Load current .env values if available\r\nif [ -f .env ]; then\r\n  source .env\r\nfi\r\n\r\n# Function to update or add environment variable\r\nupdate_env_var() {\r\n  local var_name=$1\r\n  local new_value=$2\r\n  if grep -q \"^$var_name=\" .env; then\r\n    sed -i \"s\/^$var_name=.*\/$var_name=$new_value\/\" .env\r\n  else\r\n    echo \"$var_name=$new_value\" &gt;&gt; .env\r\n  fi\r\n}\r\n\r\n# Prompt user for new values (default to current values if available)\r\nread -p \"Enter the container name (current: ${NODE_RED_CONTAINER_NAME:-nodered}): \" container_name\r\nread -p \"Enter the Node-RED external port (current: ${NODE_RED_PORT:-1880}): \" node_red_port\r\n\r\n# Set default values if no input is provided\r\ncontainer_name=${container_name:-${NODE_RED_CONTAINER_NAME:-nodered}}\r\nnode_red_port=${node_red_port:-${NODE_RED_PORT:-1880}}\r\n\r\n# Update .env file\r\nupdate_env_var \"NODE_RED_CONTAINER_NAME\" \"$container_name\"\r\nupdate_env_var \"NODE_RED_PORT\" \"$node_red_port\"\r\n\r\necho \"\u2705 .env file has been updated successfully!\"\r\n\r\necho \"\ud83d\udd04 Restarting Docker Compose to apply changes...\"\r\ndocker compose down &amp;&amp; docker compose up -d\r\necho \"\u2705 Docker Compose restarted successfully!\"<\/code><\/pre>\n<p>\u9019\u652f <code>edit-env.sh<\/code> \u8173\u672c\u63d0\u4f9b\u4e92\u52d5\u5f0f\u65b9\u5f0f\u4fee\u6539 <code>.env<\/code> \u6a94\u6848\u4e2d\u7684\u74b0\u5883\u8b8a\u6578\uff0c\u4f7f\u7528\u8005\u53ef\u4f9d\u63d0\u793a\u66f4\u65b0\u5bb9\u5668\u540d\u7a31\u8207\u5c0d\u5916\u57e0\u865f\uff0c\u82e5\u672a\u8f38\u5165\u5247\u4fdd\u7559\u539f\u503c\u6216\u4f7f\u7528\u9810\u8a2d\u503c\u3002\u4fee\u6539\u5b8c\u6210\u5f8c\uff0c\u8173\u672c\u6703\u81ea\u52d5\u91cd\u65b0\u555f\u52d5 Docker Compose \u74b0\u5883\uff0c\u4ee5\u5957\u7528\u65b0\u7684\u8a2d\u5b9a\uff0c\u78ba\u4fdd Node-RED \u5bb9\u5668\u5373\u6642\u53cd\u6620\u8b8a\u66f4\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459-1.jpg\" width=\"1024\" height=\"768\" \/><br \/>\n\u25b2 \u5f9e GitHub \u4e0b\u8f09\u7bc4\u4f8b\u5c08\u6848\u5f8c <code>cd nodered-docker\/<\/code> \u9032\u5165\u5c08\u6848\u76ee\u9304\uff0c\u63a5\u8457\u4e0b\u6307\u4ee4 <code>bash init-env.sh<\/code>\uff0c\u4f9d\u63d0\u793a\u8f38\u5165\u5bb9\u5668\u540d\u7a31\u8207\u57e0\u865f\uff08\u53ef\u7559\u7a7a\u4ee3\u8868\u4f7f\u7528\u9810\u8a2d\u503c\uff09\uff0c\u4e26\u9078\u64c7\u662f\u5426\u7acb\u5373\u555f\u52d5\u74b0\u5883\uff0c\u7cfb\u7d71\u6703\u81ea\u52d5\u62c9\u53d6\u6620\u50cf\u3001\u555f\u52d5\u670d\u52d9\u4e26\u57f7\u884c\u6b0a\u9650\u8a2d\u5b9a\u3002<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459-2.jpg\" width=\"1024\" height=\"768\" \/><br \/>\n\u25b2 \u6253\u958b\u700f\u89bd\u5668\u9032\u5165 Node-RED \u9810\u8a2d\u4ecb\u9762\uff08\u9810\u8a2d\u9023\u7dda\u7db2\u5740\u70ba <code>localhost:1880<\/code>\uff09\uff0c\u5373\u53ef\u770b\u5230\u6b61\u8fce\u756b\u9762\uff0c\u4ee3\u8868\u670d\u52d9\u5df2\u6210\u529f\u555f\u52d5\u4e26\u53ef\u958b\u59cb\u6d41\u7a0b\u8a2d\u8a08\u3002<\/p>\n<p>\u900f\u904e\u672c\u5c08\u6848\u63d0\u4f9b\u7684 Docker Compose \u74b0\u5883\uff0c\u4f7f\u7528\u8005\u80fd\u5920\u5728\u6578\u5206\u9418\u5167\u5feb\u901f\u90e8\u7f72 Node-RED\uff0c\u514d\u53bb\u7e41\u7463\u7684\u624b\u52d5\u5b89\u88dd\u8207\u8a2d\u5b9a\u904e\u7a0b\u3002\u4e0d\u8ad6\u662f IoT \u958b\u767c\u8005\u3001\u8cc7\u6599\u6d41\u7a0b\u8a2d\u8a08\u8005\uff0c\u6216\u521d\u5b78\u8005\uff0c\u53ea\u9700\u57f7\u884c\u7c21\u55ae\u7684\u521d\u59cb\u5316\u8173\u672c\uff0c\u5373\u53ef\u81ea\u52d5\u5efa\u7acb\u74b0\u5883\u8b8a\u6578\u3001\u555f\u52d5\u5bb9\u5668\uff0c\u4e26\u5b8c\u6210\u8cc7\u6599\u593e\u6b0a\u9650\u8a2d\u5b9a\u3002\u6574\u9ad4\u67b6\u69cb\u6a21\u7d44\u5316\u3001\u53ef\u7dad\u8b77\u6027\u9ad8\u3002\u642d\u914d Node-RED \u76f4\u89ba\u7684\u5716\u5f62\u5316\u4ecb\u9762\uff0c\u80fd\u8fc5\u901f\u9032\u5165\u958b\u767c\u968e\u6bb5\uff0c\u662f\u4e00\u5957\u5be6\u7528\u53c8\u6613\u65bc\u4e0a\u624b\u7684\u89e3\u6c7a\u65b9\u6848\u3002<\/p>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>\u5728\u7269\u806f\u7db2\uff08IoT\uff09\u8207\u8cc7\u6599\u6d41\u81ea\u52d5\u5316\u65e5\u76ca\u666e\u53ca\u7684\u4eca\u5929\uff0cNode-RED \u6210\u70ba\u773e\u591a\u958b\u767c\u8005\u8207\u5de5\u7a0b\u5e2b\u7684\u9996\u9078\u5229\u5668\u3002\u5b83\u662f\u4e00\u6b3e\u57fa\u65bc Node.js \u7684\u958b\u6e90\u6d41\u7a0b\u5f0f\u958b\u767c\u5de5\u5177\uff0c\u900f\u904e\u5716\u5f62\u5316\u4ecb\u9762\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u8f15\u9b06\u62d6\u62c9\u7bc0\u9ede\uff08node [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":19897,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,20,566,502,548],"tags":[546],"class_list":["post-19896","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-website-tech","category-server","category-iot","category-node-js","category-node-red","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801<\/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:\/\/mnya.tw\/cc\/word\/2459.html\" \/>\n<meta property=\"og:locale\" content=\"zh_TW\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801\" \/>\n<meta property=\"og:description\" content=\"\u5728\u7269\u806f\u7db2\uff08IoT\uff09\u8207\u8cc7\u6599\u6d41\u81ea\u52d5\u5316\u65e5\u76ca\u666e\u53ca\u7684\u4eca\u5929\uff0cNode-RED \u6210\u70ba\u773e\u591a\u958b\u767c\u8005\u8207\u5de5\u7a0b\u5e2b\u7684\u9996\u9078\u5229\u5668\u3002\u5b83\u662f\u4e00\u6b3e\u57fa\u65bc Node.js \u7684\u958b\u6e90\u6d41\u7a0b\u5f0f\u958b\u767c\u5de5\u5177\uff0c\u900f\u904e\u5716\u5f62\u5316\u4ecb\u9762\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u8f15\u9b06\u62d6\u62c9 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mnya.tw\/cc\/word\/2459.html\" \/>\n<meta property=\"og:site_name\" content=\"\u840c\u82bd\u7d9c\u5408\u5929\u5730\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-25T01:26:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-25T01:36:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u840c\u82bd\u7ad9\u9577\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/x.com\/qwe987299\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005:\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u840c\u82bd\u7ad9\u9577\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9810\u4f30\u95b1\u8b80\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\u9418\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html\"},\"author\":{\"name\":\"\u840c\u82bd\u7ad9\u9577\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/#\\\/schema\\\/person\\\/28e9ae25bc418b8ec216b7aa2c848faa\"},\"headline\":\"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED\",\"datePublished\":\"2025-04-25T01:26:53+00:00\",\"dateModified\":\"2025-04-25T01:36:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html\"},\"wordCount\":54,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/wp-content\\\/uploads\\\/2025\\\/2459.jpg\",\"keywords\":[\"Docker\"],\"articleSection\":[\"\u7db2\u7ad9\u6280\u8853\",\"\u4f3a\u670d\u5668\",\"\u7269\u806f\u7db2\",\"Node.js\",\"Node-RED\"],\"inLanguage\":\"zh-TW\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html\",\"url\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html\",\"name\":\"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/wp-content\\\/uploads\\\/2025\\\/2459.jpg\",\"datePublished\":\"2025-04-25T01:26:53+00:00\",\"dateModified\":\"2025-04-25T01:36:09+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/#\\\/schema\\\/person\\\/28e9ae25bc418b8ec216b7aa2c848faa\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#breadcrumb\"},\"inLanguage\":\"zh-TW\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-TW\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#primaryimage\",\"url\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/wp-content\\\/uploads\\\/2025\\\/2459.jpg\",\"contentUrl\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/wp-content\\\/uploads\\\/2025\\\/2459.jpg\",\"width\":1024,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/2459.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/mnya.tw\\\/cc\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/#website\",\"url\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/\",\"name\":\"\u840c\u82bd\u7d9c\u5408\u5929\u5730\",\"description\":\"\u751f\u6d3b\u4f11\u9592\u2502\u96fb\u5b50\u8cc7\u8a0a\u2502\u5b78\u8853\u77e5\u8b58\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-TW\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/#\\\/schema\\\/person\\\/28e9ae25bc418b8ec216b7aa2c848faa\",\"name\":\"\u840c\u82bd\u7ad9\u9577\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-TW\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g\",\"caption\":\"\u840c\u82bd\u7ad9\u9577\"},\"description\":\"\u60a8\u597d\uff0c\u6211\u662f\u840c\u82bd\u7cfb\u5217\u7db2\u7ad9\uff08Mnya Series Website\uff09\u7684\u7ad9\u9577&amp;\u5275\u59cb\u4eba\uff0c\u53ef\u4ee5\u7a31\u547c\u6211\u300c\u840c\u82bd\u7ad9\u9577\u300d\u3002\u6211\u7684\u8208\u8da3\u8207\u5c08\u9577\u6709\u767b\u5c71\u3001\u89c0\u5bdf\u5730\u5f62\u3001\u651d\u5f71\u3001\u65c5\u904a\u3001\u7db2\u9801\u8a2d\u8a08\uff06\u67b6\u8a2d\uff06\u7d93\u71df\u3001\u52d5\u756b\u88fd\u4f5c\u3001\u5716\u7247\u8655\u7406\u3001\u8cc7\u6599\u5f59\u6574\u7b49\u3002\u6709\u4efb\u4f55\u554f\u984c\u6216\u5efa\u8b70\u8acb\u81f3\u840c\u82bd\u8ad6\u58c7\u767c\u8868\u3002\u7db2\u7ad9\u696d\u52d9\u3001\u5546\u696d\u5408\u4f5c\u7684\u806f\u7d61\u65b9\u5f0f\u5728\u300c\u95dc\u65bc\u672c\u7ad9 \u2192 \u5718\u968a\u4ecb\u7d39 \u2192 \u7ad9\u9577\u4ecb\u7d39\u300d\uff0c\u5f88\u9ad8\u8208\u8a8d\u8b58\u60a8\uff01\u8acb\u591a\u6307\u6559\uff01\",\"sameAs\":[\"https:\\\/\\\/mnya.tw\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/x.com\\\/qwe987299\"],\"url\":\"https:\\\/\\\/mnya.tw\\\/cc\\\/word\\\/author\\\/qwe987299\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801","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:\/\/mnya.tw\/cc\/word\/2459.html","og_locale":"zh_TW","og_type":"article","og_title":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801","og_description":"\u5728\u7269\u806f\u7db2\uff08IoT\uff09\u8207\u8cc7\u6599\u6d41\u81ea\u52d5\u5316\u65e5\u76ca\u666e\u53ca\u7684\u4eca\u5929\uff0cNode-RED \u6210\u70ba\u773e\u591a\u958b\u767c\u8005\u8207\u5de5\u7a0b\u5e2b\u7684\u9996\u9078\u5229\u5668\u3002\u5b83\u662f\u4e00\u6b3e\u57fa\u65bc Node.js \u7684\u958b\u6e90\u6d41\u7a0b\u5f0f\u958b\u767c\u5de5\u5177\uff0c\u900f\u904e\u5716\u5f62\u5316\u4ecb\u9762\uff0c\u4f7f\u7528\u8005\u53ef\u4ee5\u8f15\u9b06\u62d6\u62c9 [&hellip;]","og_url":"https:\/\/mnya.tw\/cc\/word\/2459.html","og_site_name":"\u840c\u82bd\u7d9c\u5408\u5929\u5730","article_published_time":"2025-04-25T01:26:53+00:00","article_modified_time":"2025-04-25T01:36:09+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg","type":"image\/jpeg"}],"author":"\u840c\u82bd\u7ad9\u9577","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/x.com\/qwe987299","twitter_misc":{"\u4f5c\u8005:":"\u840c\u82bd\u7ad9\u9577","\u9810\u4f30\u95b1\u8b80\u6642\u9593":"2 \u5206\u9418"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#article","isPartOf":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html"},"author":{"name":"\u840c\u82bd\u7ad9\u9577","@id":"https:\/\/mnya.tw\/cc\/#\/schema\/person\/28e9ae25bc418b8ec216b7aa2c848faa"},"headline":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED","datePublished":"2025-04-25T01:26:53+00:00","dateModified":"2025-04-25T01:36:09+00:00","mainEntityOfPage":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html"},"wordCount":54,"commentCount":0,"image":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#primaryimage"},"thumbnailUrl":"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg","keywords":["Docker"],"articleSection":["\u7db2\u7ad9\u6280\u8853","\u4f3a\u670d\u5668","\u7269\u806f\u7db2","Node.js","Node-RED"],"inLanguage":"zh-TW","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/mnya.tw\/cc\/word\/2459.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/mnya.tw\/cc\/word\/2459.html","url":"https:\/\/mnya.tw\/cc\/word\/2459.html","name":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED - \u840c\u82bd\u7d9c\u5408\u5929\u5730 - \u840c\u82bd\u7db2\u9801","isPartOf":{"@id":"https:\/\/mnya.tw\/cc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#primaryimage"},"image":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#primaryimage"},"thumbnailUrl":"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg","datePublished":"2025-04-25T01:26:53+00:00","dateModified":"2025-04-25T01:36:09+00:00","author":{"@id":"https:\/\/mnya.tw\/cc\/#\/schema\/person\/28e9ae25bc418b8ec216b7aa2c848faa"},"breadcrumb":{"@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#breadcrumb"},"inLanguage":"zh-TW","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mnya.tw\/cc\/word\/2459.html"]}]},{"@type":"ImageObject","inLanguage":"zh-TW","@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#primaryimage","url":"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg","contentUrl":"https:\/\/mnya.tw\/cc\/wp-content\/uploads\/2025\/2459.jpg","width":1024,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/mnya.tw\/cc\/word\/2459.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/mnya.tw\/cc"},{"@type":"ListItem","position":2,"name":"Docker Compose \u5feb\u901f\u5b89\u88dd Node-RED"}]},{"@type":"WebSite","@id":"https:\/\/mnya.tw\/cc\/#website","url":"https:\/\/mnya.tw\/cc\/","name":"\u840c\u82bd\u7d9c\u5408\u5929\u5730","description":"\u751f\u6d3b\u4f11\u9592\u2502\u96fb\u5b50\u8cc7\u8a0a\u2502\u5b78\u8853\u77e5\u8b58","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mnya.tw\/cc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-TW"},{"@type":"Person","@id":"https:\/\/mnya.tw\/cc\/#\/schema\/person\/28e9ae25bc418b8ec216b7aa2c848faa","name":"\u840c\u82bd\u7ad9\u9577","image":{"@type":"ImageObject","inLanguage":"zh-TW","@id":"https:\/\/secure.gravatar.com\/avatar\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c63875472a671bb4fd1e3a1012e8ef8bb9672b41d7810b61f508a42ad15ef16a?s=96&d=mm&r=g","caption":"\u840c\u82bd\u7ad9\u9577"},"description":"\u60a8\u597d\uff0c\u6211\u662f\u840c\u82bd\u7cfb\u5217\u7db2\u7ad9\uff08Mnya Series Website\uff09\u7684\u7ad9\u9577&amp;\u5275\u59cb\u4eba\uff0c\u53ef\u4ee5\u7a31\u547c\u6211\u300c\u840c\u82bd\u7ad9\u9577\u300d\u3002\u6211\u7684\u8208\u8da3\u8207\u5c08\u9577\u6709\u767b\u5c71\u3001\u89c0\u5bdf\u5730\u5f62\u3001\u651d\u5f71\u3001\u65c5\u904a\u3001\u7db2\u9801\u8a2d\u8a08\uff06\u67b6\u8a2d\uff06\u7d93\u71df\u3001\u52d5\u756b\u88fd\u4f5c\u3001\u5716\u7247\u8655\u7406\u3001\u8cc7\u6599\u5f59\u6574\u7b49\u3002\u6709\u4efb\u4f55\u554f\u984c\u6216\u5efa\u8b70\u8acb\u81f3\u840c\u82bd\u8ad6\u58c7\u767c\u8868\u3002\u7db2\u7ad9\u696d\u52d9\u3001\u5546\u696d\u5408\u4f5c\u7684\u806f\u7d61\u65b9\u5f0f\u5728\u300c\u95dc\u65bc\u672c\u7ad9 \u2192 \u5718\u968a\u4ecb\u7d39 \u2192 \u7ad9\u9577\u4ecb\u7d39\u300d\uff0c\u5f88\u9ad8\u8208\u8a8d\u8b58\u60a8\uff01\u8acb\u591a\u6307\u6559\uff01","sameAs":["https:\/\/mnya.tw\/","https:\/\/x.com\/https:\/\/x.com\/qwe987299"],"url":"https:\/\/mnya.tw\/cc\/word\/author\/qwe987299"}]}},"_links":{"self":[{"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/posts\/19896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/comments?post=19896"}],"version-history":[{"count":0,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/posts\/19896\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/media\/19897"}],"wp:attachment":[{"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/media?parent=19896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/categories?post=19896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mnya.tw\/cc\/wp-json\/wp\/v2\/tags?post=19896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}