一、什么是Docker Compose
Compose 項目是Docker官方的開源項目,負責實現Docker容器集群的快速編排,開源代碼在https://github.com/docker/compose 上
我們知道使用Dockerfile模板文件可以讓用戶很方便的定義一個單獨的應用容器,其實在工作中,經常會碰到需要多個容器相互配合來完成的某項任務情況,例如工作中的web服務容器本身,往往會在后端加上數據庫容器,甚至會有負責均衡器,比如LNMP服務
Compose 就是來做這個事情的,它允許用戶通過一個單獨的docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器為一個項目(project)
Compose 中有兩個重要的概念:
二、基本原理
三、安裝
[root@operation ~]# curl -L https://github.com/docker/compose/releases/download/1.23.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 373 0 --:--:-- 0:00:01 --:--:-- 373 100 11.1M 100 11.1M 0 0 368k 0 0:00:31 0:00:31 --:--:-- 444k [root@operation ~]# chmod +x /usr/local/bin/docker-compose [root@operation ~]# docker-compose version docker-compose version 1.23.0-rc2, build 350a555e docker-py version: 3.5.0 CPython version: 3.6.6 OpenSSL version: OpenSSL 1.1.0f 25 May 2017
3.2. pip 安裝(安裝的是最新穩定版本)
Compose 既然是用python編寫的那么肯定是可以用pip install 進行安裝的 [root@operation ~]# pip install docker-compose # 安裝完需要做個軟鏈接 [root@operation ~]# ln -s /usr/bin/docker-compose /usr/local/bin/ [root@operation ~]# docker-compose version docker-compose version 1.22.0, build f46880f docker-py version: 3.5.0 CPython version: 2.7.5 OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
3.3. 容器安裝
[root@operation ~]# curl -L https://github.com/docker/compose/releases/download/1.23.0-rc2/run.sh > /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 596 0 596 0 0 158 0 --:--:-- 0:00:03 --:--:-- 158 100 1670 100 1670 0 0 343 0 0:00:04 0:00:04 --:--:-- 1630k [root@operation ~]# chmod +x /usr/local/bin/docker-compose [root@operation ~]# docker-compose Unable to find image 'docker/compose:1.23.0-rc2' locally 1.23.0-rc2: Pulling from docker/compose 3489d1c4660e: Pull complete 2e51ed086e7d: Pull complete 07d7b41c67a1: Pull complete Digest: sha256:14f5ad3c2162b26b3eaafe870822598f80b03ec36fd45126952c891fd5e5a59a # 實際上就是下的鏡像(可以看下下載的run.sh腳本) [root@operation ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker/compose 1.23.0-rc2 dc59a0b5e981 5 days ago 45.6MB alpine latest 196d12cf6ab1 4 weeks ago 4.41MB [root@operation ~]# docker-compose version docker-compose version 1.23.0-rc2, build 350a555e docker-py version: 3.5.0 CPython version: 3.6.6 OpenSSL version: OpenSSL 1.1.0f 25 May 2017
四、命令
Compose 大部分命令的對象即可以是項目的本身,也可以是指定為項目中的服務或者容器 執行docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]可以查看命令的幫助信息 具體的使用格式 docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS] 參數選項 -f,--file file指定模板文件,默認是docker-compose.yml模板文件,可以多次指定 -p,--project-name name指定項目名稱,默認使用所在目錄名稱作為項目名稱 --x-networking 使用Docker的后端可插拔網絡特性 --x-networking-driver driver指定網絡的后端驅動,默認使用bridge --verbose 輸入更多的調試信息 -v,--version 輸出版本信息
Compose所支持的命令 build Build or rebuild services (構建項目中的服務容器) bundle Generate a Docker bundle from the Compose file (從Compose文件生成分布式應用程序包) config Validate and view the Compose file (驗證並查看Compose文件) create Create services (為服務創建容器) down Stop and remove containers, networks, images, and volumes (停止容器並刪除由其創建的容器,網絡,卷和圖像up) events Receive real time events from containers (為項目中的每個容器流式傳輸容器事件) exec Execute a command in a running container (這相當於docker exec。使用此子命令,您可以在服務中運行任意命令。默認情況下,命令分配TTY,因此您可以使用命令docker-compose exec web sh來獲取交互式提示。) help Get help on a command (獲得一個命令的幫助) images List images () kill Kill containers (通過發送SIGKILL信號來強制停止服務容器) logs View output from containers (查看服務容器的輸出) pause Pause services (暫停一個容器) port Print the public port for a port binding (打印某個容器端口所映射的公共端口) ps List containers (列出項目中目前所有的容器) pull Pull service images (拉取服務依賴鏡像) push Push service images (推送服務鏡像) restart Restart services (重啟項目中的服務) rm Remove stopped containers (刪除所有停止狀態的服務容器) run Run a one-off command (在指定服務上執行一個命令) scale Set number of containers for a service (設置指定服務執行的容器個數) start Start services (啟動已存在的服務容器) stop Stop services (停止已存在的服務容器) top Display the running processes (顯示容器正在運行的進程) unpause Unpause services (恢復處於暫停狀態的容器) up Create and start containers (自動完成包括構建鏡像、創建服務、啟動服務並關聯服務相關容器的一系列操作) version Show the Docker-Compose version information (輸出版本)
這些命令的使用方法可以使用執行docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]可以查看命令的幫助信息
因為太多的原因我這里就不寫了,有時間我在把每個命令的使用方法補上吧
針對模板文件的使用才是重中之重,我在后面會對模板文件詳細講解
五、環境變量
環境變量可以用來配置 Compose 的行為,以DOCKER_開頭的變量和用來配置 Docker 命令行客戶端的使用一樣。如果使用 boot2docker , $(boot2docker shellinit) 將會設置它們為正確的值 COMPOSE_PROJECT_NAME 設置通過 Compose 啟動的每一個容器前添加的項目名稱,默認是當前工作目錄的名字。 COMPOSE_FILE 設置要使用的 docker-compose.yml 的路徑。默認路徑是當前工作目錄。 DOCKER_HOST 設置 Docker daemon 的地址。默認使用 unix:///var/run/docker.sock,與 Docker 客戶端采用的默認值一致。 DOCKER_TLS_VERIFY 如果設置不為空,則與 Docker daemon 交互通過 TLS 進行。 DOCKER_CERT_PATH 配置 TLS 通信所需要的驗證(ca.pem、cert.pem 和 key.pem)文件的路徑,默認是 ~/.docker
在使用的時候在做解釋和操作吧,因為一般不會改環境變量的東西,默認的就OK,做個簡單的了解
官方鏈接:https://docs.docker.com/compose/reference/envvars/#compose_project_name
六、模板文件
模板文件時Compose的核心,涉及的指令關鍵字比較多,但是大部分的指令與docker run相關的參數的含義是類似的
默認的模板名是docker-compose.yml
官網鏈接:https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples
Compose和Docker兼容性: Compose 文件格式有3個版本,分別為1, 2.x 和 3.x 目前主流的為 3.x 其支持 docker 1.13.0 及其以上的版本 常用參數: version # 指定 compose 文件的版本 services # 定義所有的 service 信息, services 下面的第一級別的 key 既是一個 service 的名稱 build # 指定包含構建上下文的路徑, 或作為一個對象,該對象具有 context 和指定的 dockerfile 文件以及 args 參數值 context # context: 指定 Dockerfile 文件所在的路徑 dockerfile # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(默認為 Dockerfile) args # args: Dockerfile 在 build 過程中需要的參數 (等同於 docker container build --build-arg 的作用) cache_from # v3.2中新增的參數, 指定緩存的鏡像列表 (等同於 docker container build --cache_from 的作用) labels # v3.3中新增的參數, 設置鏡像的元數據 (等同於 docker container build --labels 的作用) shm_size # v3.5中新增的參數, 設置容器 /dev/shm 分區的大小 (等同於 docker container build --shm-size 的作用) command # 覆蓋容器啟動后默認執行的命令, 支持 shell 格式和 [] 格式 configs # 不知道怎么用 cgroup_parent # 不知道怎么用 container_name # 指定容器的名稱 (等同於 docker run --name 的作用) credential_spec # 不知道怎么用 deploy # v3 版本以上, 指定與部署和運行服務相關的配置, deploy 部分是 docker stack 使用的, docker stack 依賴 docker swarm endpoint_mode # v3.3 版本中新增的功能, 指定服務暴露的方式 vip # Docker 為該服務分配了一個虛擬 IP(VIP), 作為客戶端的訪問服務的地址 dnsrr # DNS輪詢, Docker 為該服務設置 DNS 條目, 使得服務名稱的 DNS 查詢返回一個 IP 地址列表, 客戶端直接訪問其中的一個地址 labels # 指定服務的標簽,這些標簽僅在服務上設置 mode # 指定 deploy 的模式 global # 每個集群節點都只有一個容器 replicated # 用戶可以指定集群中容器的數量(默認) placement # 不知道怎么用 replicas # deploy 的 mode 為 replicated 時, 指定容器副本的數量 resources # 資源限制 limits # 設置容器的資源限制 cpus: "0.5" # 設置該容器最多只能使用 50% 的 CPU memory: 50M # 設置該容器最多只能使用 50M 的內存空間 reservations # 設置為容器預留的系統資源(隨時可用) cpus: "0.2" # 為該容器保留 20% 的 CPU memory: 20M # 為該容器保留 20M 的內存空間 restart_policy # 定義容器重啟策略, 用於代替 restart 參數 condition # 定義容器重啟策略(接受三個參數) none # 不嘗試重啟 on-failure # 只有當容器內部應用程序出現問題才會重啟 any # 無論如何都會嘗試重啟(默認) delay # 嘗試重啟的間隔時間(默認為 0s) max_attempts # 嘗試重啟次數(默認一直嘗試重啟) window # 檢查重啟是否成功之前的等待時間(即如果容器啟動了, 隔多少秒之后去檢測容器是否正常, 默認 0s) update_config # 用於配置滾動更新配置 parallelism # 一次性更新的容器數量 delay # 更新一組容器之間的間隔時間 failure_action # 定義更新失敗的策略 continue # 繼續更新 rollback # 回滾更新 pause # 暫停更新(默認) monitor # 每次更新后的持續時間以監視更新是否失敗(單位: ns|us|ms|s|m|h) (默認為0) max_failure_ratio # 回滾期間容忍的失敗率(默認值為0) order # v3.4 版本中新增的參數, 回滾期間的操作順序 stop-first #舊任務在啟動新任務之前停止(默認) start-first #首先啟動新任務, 並且正在運行的任務暫時重疊 rollback_config # v3.7 版本中新增的參數, 用於定義在 update_config 更新失敗的回滾策略 parallelism # 一次回滾的容器數, 如果設置為0, 則所有容器同時回滾 delay # 每個組回滾之間的時間間隔(默認為0) failure_action # 定義回滾失敗的策略 continue # 繼續回滾 pause # 暫停回滾 monitor # 每次回滾任務后的持續時間以監視失敗(單位: ns|us|ms|s|m|h) (默認為0) max_failure_ratio # 回滾期間容忍的失敗率(默認值0) order # 回滾期間的操作順序 stop-first # 舊任務在啟動新任務之前停止(默認) start-first # 首先啟動新任務, 並且正在運行的任務暫時重疊 注意: 支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子選項 security_opt container_name devices tmpfs stop_signal links cgroup_parent network_mode external_links restart build userns_mode sysctls devices # 指定設備映射列表 (等同於 docker run --device 的作用) depends_on # 定義容器啟動順序 (此選項解決了容器之間的依賴關系, 此選項在 v3 版本中 使用 swarm 部署時將忽略該選項) 示例: docker-compose up 以依賴順序啟動服務,下面例子中 redis 和 db 服務在 web 啟動前啟動 默認情況下使用 docker-compose up web 這樣的方式啟動 web 服務時,也會啟動 redis 和 db 兩個服務,因為在配置文件中定義了依賴關系 version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres dns # 設置 DNS 地址(等同於 docker run --dns 的作用) dns_search # 設置 DNS 搜索域(等同於 docker run --dns-search 的作用) tmpfs # v2 版本以上, 掛載目錄到容器中, 作為容器的臨時文件系統(等同於 docker run --tmpfs 的作用, 在使用 swarm 部署時將忽略該選項) entrypoint # 覆蓋容器的默認 entrypoint 指令 (等同於 docker run --entrypoint 的作用) env_file # 從指定文件中讀取變量設置為容器中的環境變量, 可以是單個值或者一個文件列表, 如果多個文件中的變量重名則后面的變量覆蓋前面的變量, environment 的值覆蓋 env_file 的值 文件格式: RACK_ENV=development environment # 設置環境變量, environment 的值可以覆蓋 env_file 的值 (等同於 docker run --env 的作用) expose # 暴露端口, 但是不能和宿主機建立映射關系, 類似於 Dockerfile 的 EXPOSE 指令 external_links # 連接不在 docker-compose.yml 中定義的容器或者不在 compose 管理的容器(docker run 啟動的容器, 在 v3 版本中使用 swarm 部署時將忽略該選項) extra_hosts # 添加 host 記錄到容器中的 /etc/hosts 中 (等同於 docker run --add-host 的作用) healthcheck # v2.1 以上版本, 定義容器健康狀態檢查, 類似於 Dockerfile 的 HEALTHCHECK 指令 test # 檢查容器檢查狀態的命令, 該選項必須是一個字符串或者列表, 第一項必須是 NONE, CMD 或 CMD-SHELL, 如果其是一個字符串則相當於 CMD-SHELL 加該字符串 NONE # 禁用容器的健康狀態檢測 CMD # test: ["CMD", "curl", "-f", "http://localhost"] CMD-SHELL # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1 interval: 1m30s # 每次檢查之間的間隔時間 timeout: 10s # 運行命令的超時時間 retries: 3 # 重試次數 start_period: 40s # v3.4 以上新增的選項, 定義容器啟動時間間隔 disable: true # true 或 false, 表示是否禁用健康狀態檢測和 test: NONE 相同 image # 指定 docker 鏡像, 可以是遠程倉庫鏡像、本地鏡像 init # v3.7 中新增的參數, true 或 false 表示是否在容器中運行一個 init, 它接收信號並傳遞給進程 isolation # 隔離容器技術, 在 Linux 中僅支持 default 值 labels # 使用 Docker 標簽將元數據添加到容器, 與 Dockerfile 中的 LABELS 類似 links # 鏈接到其它服務中的容器, 該選項是 docker 歷史遺留的選項, 目前已被用戶自定義網絡名稱空間取代, 最終有可能被廢棄 (在使用 swarm 部署時將忽略該選項) logging # 設置容器日志服務 driver # 指定日志記錄驅動程序, 默認 json-file (等同於 docker run --log-driver 的作用) options # 指定日志的相關參數 (等同於 docker run --log-opt 的作用) max-size # 設置單個日志文件的大小, 當到達這個值后會進行日志滾動操作 max-file # 日志文件保留的數量 network_mode # 指定網絡模式 (等同於 docker run --net 的作用, 在使用 swarm 部署時將忽略該選項) networks # 將容器加入指定網絡 (等同於 docker network connect 的作用), networks 可以位於 compose 文件頂級鍵和 services 鍵的二級鍵 aliases # 同一網絡上的容器可以使用服務名稱或別名連接到其中一個服務的容器 ipv4_address # IP V4 格式 ipv6_address # IP V6 格式 示例: version: '3.7' services: test: image: nginx:1.14-alpine container_name: mynginx command: ifconfig networks: app_net: # 調用下面 networks 定義的 app_net 網絡 ipv4_address: 172.16.238.10 networks: app_net: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24 pid: 'host' # 共享宿主機的 進程空間(PID) ports # 建立宿主機和容器之間的端口映射關系, ports 支持兩種語法格式 SHORT 語法格式示例: - "3000" # 暴露容器的 3000 端口, 宿主機的端口由 docker 隨機映射一個沒有被占用的端口 - "3000-3005" # 暴露容器的 3000 到 3005 端口, 宿主機的端口由 docker 隨機映射沒有被占用的端口 - "8000:8000" # 容器的 8000 端口和宿主機的 8000 端口建立映射關系 - "9090-9091:8080-8081" - "127.0.0.1:8001:8001" # 指定映射宿主機的指定地址的 - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" # 指定協議 LONG 語法格式示例:(v3.2 新增的語法格式) ports: - target: 80 # 容器端口 published: 8080 # 宿主機端口 protocol: tcp # 協議類型 mode: host # host 在每個節點上發布主機端口, ingress 對於群模式端口進行負載均衡 secrets # 不知道怎么用 security_opt # 為每個容器覆蓋默認的標簽 (在使用 swarm 部署時將忽略該選項) stop_grace_period # 指定在發送了 SIGTERM 信號之后, 容器等待多少秒之后退出(默認 10s) stop_signal # 指定停止容器發送的信號 (默認為 SIGTERM 相當於 kill PID; SIGKILL 相當於 kill -9 PID; 在使用 swarm 部署時將忽略該選項) sysctls # 設置容器中的內核參數 (在使用 swarm 部署時將忽略該選項) ulimits # 設置容器的 limit userns_mode # 如果Docker守護程序配置了用戶名稱空間, 則禁用此服務的用戶名稱空間 (在使用 swarm 部署時將忽略該選項) volumes # 定義容器和宿主機的卷映射關系, 其和 networks 一樣可以位於 services 鍵的二級鍵和 compose 頂級鍵, 如果需要跨服務間使用則在頂級鍵定義, 在 services 中引用 SHORT 語法格式示例: volumes: - /var/lib/mysql # 映射容器內的 /var/lib/mysql 到宿主機的一個隨機目錄中 - /opt/data:/var/lib/mysql # 映射容器內的 /var/lib/mysql 到宿主機的 /opt/data - ./cache:/tmp/cache # 映射容器內的 /var/lib/mysql 到宿主機 compose 文件所在的位置 - ~/configs:/etc/configs/:ro # 映射容器宿主機的目錄到容器中去, 權限只讀 - datavolume:/var/lib/mysql # datavolume 為 volumes 頂級鍵定義的目錄, 在此處直接調用 LONG 語法格式示例:(v3.2 新增的語法格式) version: "3.2" services: web: image: nginx:alpine ports: - "80:80" volumes: - type: volume # mount 的類型, 必須是 bind、volume 或 tmpfs source: mydata # 宿主機目錄 target: /data # 容器目錄 volume: # 配置額外的選項, 其 key 必須和 type 的值相同 nocopy: true # volume 額外的選項, 在創建卷時禁用從容器復制數據 - type: bind # volume 模式只指定容器路徑即可, 宿主機路徑隨機生成; bind 需要指定容器和數據機的映射路徑 source: ./static target: /opt/app/static read_only: true # 設置文件系統為只讀文件系統 volumes: mydata: # 定義在 volume, 可在所有服務中調用 restart # 定義容器重啟策略(在使用 swarm 部署時將忽略該選項, 在 swarm 使用 restart_policy 代替 restart) no # 禁止自動重啟容器(默認) always # 無論如何容器都會重啟 on-failure # 當出現 on-failure 報錯時, 容器重新啟動 其他選項: domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir 上面這些選項都只接受單個值和 docker run 的對應參數類似 對於值為時間的可接受的值: 2.5s 10s 1m30s 2h32m 5h34m56s 時間單位: us, ms, s, m, h 對於值為大小的可接受的值: 2b 1024kb 2048k 300m 1gb 單位: b, k, m, g 或者 kb, mb, gb networks # 定義 networks 信息 driver # 指定網絡模式, 大多數情況下, 它 bridge 於單個主機和 overlay Swarm 上 bridge # Docker 默認使用 bridge 連接單個主機上的網絡 overlay # overlay 驅動程序創建一個跨多個節點命名的網絡 host # 共享主機網絡名稱空間(等同於 docker run --net=host) none # 等同於 docker run --net=none driver_opts # v3.2以上版本, 傳遞給驅動程序的參數, 這些參數取決於驅動程序 attachable # driver 為 overlay 時使用, 如果設置為 true 則除了服務之外,獨立容器也可以附加到該網絡; 如果獨立容器連接到該網絡,則它可以與其他 Docker 守護進程連接到的該網絡的服務和獨立容器進行通信 ipam # 自定義 IPAM 配置. 這是一個具有多個屬性的對象, 每個屬性都是可選的 driver # IPAM 驅動程序, bridge 或者 default config # 配置項 subnet # CIDR格式的子網,表示該網絡的網段 external # 外部網絡, 如果設置為 true 則 docker-compose up 不會嘗試創建它, 如果它不存在則引發錯誤 name # v3.5 以上版本, 為此網絡設置名稱 文件格式示例: version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager]
七、Compose使用
舉個簡單的例子來具有的說明一下Compose的使用(也是官網的一個入門小例子)
先決條件:確保您已經安裝了Docker Engine和Docker Compose。您不需要安裝Python或Redis,因為兩者都是由Docker鏡像提供的。
7.1.創建一個目錄(里面包含需要的文件)
# 創建目錄 [root@operation ~]# mkdir composetest [root@operation ~]# cd composetest/ # 創建一個Python應用, 使用Flask,將數值記入Redis [root@operation composetest]# cat app.py import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True) # 創建requirements.txt文件,里面是需要安裝的Python包 [root@operation composetest]# cat requirements.txt flask redis # 創建Dockerfile文件 # 在此步驟中,您將編寫一個構建Docker鏡像的Dockerfile。該圖像包含Python應用程序所需的所有依賴項,包括Python本身。 [root@operation composetest]# cat Dockerfile FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] # 這告訴Docker: 從Python 3.6映像開始構建映像。 將當前目錄添加.到/code映像中的路徑中。 將工作目錄設置為/code。 安裝Python依賴項。 將容器的默認命令設置為python app.py。 # 創建docker-compose.yml文件 [root@operation composetest]# cat docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine" 此Compose文件定義了兩個服務,web和redis。該web服務: 使用從Dockerfile當前目錄中構建的圖像。 將容器上的公開端口5000轉發到主機上的端口5000。我們使用Flask Web服務器的默認端口5000。 該redis服務使用從Docker Hub注冊表中提取的公共 Redis映像。
7.2.使用Compose構建並運行您的應用程序
[root@operation composetest]# docker-compose up # 出現下面說明成功了 redis_1_bfd9eb391c58 | 1:M 14 Oct 08:29:53.581 * Ready to accept connections web_1_6f42e21c34dd | * Serving Flask app "app" (lazy loading) web_1_6f42e21c34dd | * Environment: production web_1_6f42e21c34dd | WARNING: Do not use the development server in a production environment. web_1_6f42e21c34dd | Use a production WSGI server instead. web_1_6f42e21c34dd | * Debug mode: on web_1_6f42e21c34dd | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) web_1_6f42e21c34dd | * Restarting with stat web_1_6f42e21c34dd | * Debugger is active! web_1_6f42e21c34dd | * Debugger PIN: 160-344-502
7.3.測試訪問
在瀏覽器訪問IP:5000 我這里是192.168.31.43:5000
每刷新一次就會加一