目錄html
friendlyhello
鏡像發佈到一個 registry。咱們在這裏使用該鏡像。http://localhost:4000/
。docker run -p 4000:80 username/repo:tag
在分佈式應用中,應用的不一樣部分被成爲「服務」。例如,一個視頻分享網站,它可能包含在數據庫中存儲應用數據的服務,用戶上傳視頻後在後臺作視頻轉碼的服務,前端服務,等等。
實際上,服務只是「生產環境中的容器」。一個服務只運行在一個鏡像中,可是它編排了鏡像的運行方式——應該使用那些端口,應該運行多少個容器副原本讓服務有它須要的能力,等等。擴展服務會改變該運行中的軟件部分的容器實例的數量,從而在流程中爲服務分配更多的計算資源。前端
幸運的是,使用Docker 平臺定義、運行和擴展服務都很是容易——只須要編寫一個docker-compose.yml
文件便可。node
docker-compose.yml
文件docker-compose.yml
是一個YAML文件,定了一Docker容器在生產環境中應該如何工做。python
將這個文件另存爲 docker-compose.yml
,保存到你想保存的位置,確保你在第二部分中建立的鏡像已經發布到registry,經過把username/repo:tag
替換爲你的鏡像的信息來更新這個.yml
文件。git
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
這個 docker-compose.yml
文件告訴Docker去作如下事情:github
在咱們使用docker stackdeploy
命令以前,先執行:web
docker swarm init
注意:咱們會在第四部門介紹該命令的含義。若是你不運行
docker swarm init
,你會獲得一個「this node is not a swarm manager」的錯誤消息。redis
如今咱們運行它,你須要給你的應用起一個名字,在這裏,名字是getstartedlab
:docker
docker stack deploy -c docker-compose.yml getstartedlab
如今咱們的單服務堆棧在一臺主機上運行了已部署鏡像的5個容器實例。咱們能夠查看一下。
獲取咱們應用程序中的一個服務的服務ID:shell
docker service ls
在輸出中找到以你的應用名字爲前綴的輸出。若是你命名的可本例中的同樣。那它的名字就是getstartedlab_web
。還列出了服務ID,以及副本數量、鏡像名稱和暴露的端口。
在服務中運行的單個容器叫作task(任務)。任務被賦予遞增的數字做爲ID,副本運行的最大數量爲你在docker-compose.yml
中定義的數量。列出你的服務中的任務:
docker service ps getstartedlab_web
若是你只列出你的系統上的容器,則任務也會被列出,雖然任務不會被服務過濾:
docker container ls -q
你能夠運行幾回 curl -4 http://localhost:4000
或者在你的瀏覽器中訪問這個URL並刷新幾回。
不管哪一種方式,容器ID都會改變,這說明負載均衡在起做用;對於每個請求,都會從5個任務中選一個,以輪詢的方式來響應。容器ID和上一個命令的輸出相匹配(docker container ls -q)。
在Win10中運行?
Win10的 powershell中默認應該可使用curl,若是沒有,你能夠安裝一個相似 GIT BASH 的終端模擬器或者 下載與之相似的wget for Windows
響應時間慢?
依賴於你的環境的網絡配置,容器響應HTTP請求最多可能須要30秒。這並不能代表Docker 或swarm的性能很差,而是一個未知足的redis依賴問題,稍後咱們會在本章討論。如今,由於相同的緣由,訪客計數也不能正常工做,咱們還沒添加保存數據的服務。
你能夠經過修改docker-compose.yml
中的副本值來擴展應用,保存配置並從新運行docker stack deploy
命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker執行原地更新,不須要提早關閉服務棧或殺死任何容器。
如今從新運行docker container ls -q
,查看部署的從新配置的實例,若是你擴展了副本數量,那麼會啓動更多的任務,也會所以啓動更多的容器。
使用 docker stack rm
來卸載應用
docker stack rm getstartedlab
卸載swarm
docker swarm leave --force
使用Docker 會很是容器啓動和擴展你的應用,你已經向着如何在生產環境運行容器邁出了一大步。接下來,你會學會如何在docker集羣上以集羣的方式運行這個應用。
注意:Compose文件用於定義Docker 的應用程序,而且可使用 Docker Cloud上傳到雲服務商,或任何硬件,或你選擇的Docker Enterprise Edition 的雲服務商。
下面會有一個本頁終端操做視頻
bash-3.2$ ls docker-compose.yml bash-3.2$ cat docker-compose.yml version: "3" services: web: image: johndmulhausen/get-started:part1 deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet networks: webnet: bash-3.2$ docker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web bash-3.2$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b429f44ecb54 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 2 seconds 80/tcp getstartedlab_web.1.bwvqyil6v2friys3stu1c2rdy 2c4cec03073c johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.2.wefoq9ql6p81kf14fpdixalc6 6fb8a01ff40f johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.4.xn5kvu19hvrri8zuvshwwed8v 206a434234ed johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 2 seconds 80/tcp getstartedlab_web.3.rhg9v9mn05otfwh3zx6lp9gww 3ec2903b7cf7 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a 3ec2903b7cf7 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 6fb8a01ff40f<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 3ec2903b7cf7<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$
回顧一下,輸入docker run
很簡單,在生產環境中容器的真正實現是將其做爲一個服務運行,服務在Compose文件中指定容器的行爲,而且這個文件能夠被用於擴展、限制、重部署咱們的app。使用和啓動服務相同的命令,能夠在服務運行時,對其進行適當的更改。
在這裏須要瞭解的一些命令以下:
docker stack ls # List stacks or apps docker stack deploy -c <composefile> <appname> # Run the specified Compose file docker service ls # List running services associated with an app docker service ps <service> # List tasks associated with an app docker inspect <task or container> # Inspect task or container docker container ls -q # List container IDs docker stack rm <appname> # Tear down an application docker swarm leave --force # Take down a single node swarm from the manager