第一部分:docker簡介安裝
docker版本
- CE 社區版 不收費
- EE 企業版 收費
先決條件
OS需求:
- centos7
- centos-extras 存儲庫啓用。默認系統是開啓的。
卸載舊版本docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安裝需求包:
yum -y install epel-release
yum -y install libseccomp iptables iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
iptables -F # 清空iptables所有規則
iptables -X # 清空用戶配置
iptables -Z # 計數器清零
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 添加遠程端口
service iptables save
systemctl restart iptables
安裝docker CE
- 通過設置倉庫,yum安裝docker-ce
- 通過下載rpm包,手動安裝docker-ce
1、yum安裝docker
設置docker-ce倉庫
-
安裝需求數據包,
yum-utils
提供了yum-config-manager
實用工具,device-mapper-persistent-data
和lvm2
提供了devicemapper
存儲驅動器。yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
設置倉庫
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
激活edge和test 倉庫,默認是關閉的。
yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test
關閉
yum-config-manager --disable docker-ce-edge
安裝docker-ce
# 查看docker-ce列表
yum list docker-ce --showduplicates| sort -r
# 可以指定安裝docker-ce版本
yum install docker-ce-<VERSION STRING>
# 這裏使用以下,安裝最新版本
yum -y install docker-ce
docker安裝完以後並沒有啓動,並在系統中自動創建了docker group,但並沒有用戶在docker group裏邊。
# 查看已經創建的組
[root@localhost ~]# cat /etc/group | grep docker
docker:x:996:
啓動docker
systemctl start docker
systemctl enable docker
驗證docker是否安裝成功
docker run hello-world
運行這個命令,會從docker hub下載一個‘hello-word’鏡像,並且用‘hello-word’鏡像 創建一個新的容器運行。當運行容器的時候,會打印一些信息後並自動退出。
2、手動下載安裝docker-ce
rpm下載鏈接:<https://download.docker.com/linux/centos/7/x86_64/stable/Packages/>
安裝rpm包:
yum install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
接下來就是啓動,同上。
3、通過腳本安裝docker-ce
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
注意 :需要手動製作啓動腳本。
4、刪除、卸載docker-ce
$ sudo yum remove docker-ce
# 需要手動刪除images、container、valumes、自定義的配置文件。
$ sudo rm -rf /var/lib/docker
5、查看docker版本
docker version
6、用普通用戶運行docker
創建用戶,並將用戶添加到docker組
useradd docker -g docker
su - docker
docker run hello-world
第一部分-常用命令
1、查看本地鏡像
docker image ls
2、查看顯示消息後退出的容器
docker container ls --all
3、docker container 幫助命令
docker container --help
4、查看docker版本和詳細信息
docker version 查看docker版本
docker info 查看docker詳細信息
5、執行docker鏡像
docker run hello-world
6、列出docker containers(running,all,all in quiet mode)
[docker@localhost ~]$ docker container ls --help
Usage: docker container ls [OPTIONS]
Options:
-a, --all 顯示所有容器 (默認不加任何選項只顯示運行的容器)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
(docker container ls -af name=h #打印容器名字包含h的容器列表)
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest 顯示最新創建的容器
-q, --quiet 僅僅顯示容器ID
-s, --size 顯示容器信息再加上容器文件總大小
報錯信息及解決
1、 containerd: /usr/bin/containerd: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory
解決辦法:yum -y install libseccomp
2、Couldn't load target DOCKER-ISOLATION':No such file or directory#012#012Try
iptables -h' or 'iptables --help' for more information.
解決辦法:yum -y install iptables
第一部分結論:
Containers 的CI/CD 是天衣無縫。例如:
- 應用程序沒有系統依賴項
- 可以將更新推送到分佈式應用程序的任何部分。
- 資源密度可以優化。
使用docker,應用程序縮放是一個問題,就是編制新的可執行文件,而不是運行大量的vm主機。
第二部分 - 容器 container
用Docker方式構建一個應用程序,層次結構從底層開始,這個應用程序是一個container;高於此級別是一個service,它定義了容器在生產中的行爲方式;最後是stack(堆棧)。
用Dockerfile構建一個python web應用程序
-
創建一個空目錄,並cd 切換到新目錄中,
[docker@localhost ~]$ mkdir pythonweb [docker@localhost ~]$ cd pythonweb/
創建一個Dockerfile,添加以下內容:
# 使用正式的Python運行時作爲父映像 FROM python:2.7-slim # 設置工作目錄爲 /app WORKDIR /app # 複製當前目錄的內容到容器 /app目錄裏 ADD . /app # 安裝requirements.txt 需求的數據包 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 對外開放容器的80端口 EXPOSE 80 # 定義環境變量 ENV NAME World # 當容器啓動時,運行app.py CMD ["python","app.py"]
-
接下來創建requirements.txt文件
[docker@localhost pythonweb]$ vi requirements.txt Flash Redis
-
創建app.py文件
[docker@localhost pythonweb]$ vi app.py from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
-
用Build命令創建一個Docker image,使用-t 指定一個 鏡像名字
docker build -t python-web-test .
-
查看創建的“python-web-test”鏡像
[docker@localhost pythonweb]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE python-web-test latest 075bace69a76 About a minute ago 132MB
-
爲Docker守護進程設置DNS
這裏要切換到root,創建/etc/docker/daemon.json文件
[root@localhost ~]# vi /etc/docker/daemon.json { "dns": ["119.29.29.29", "202.106.0.20"] } # 設置完成後要重啓docker服務 [root@localhost ~]# systemctl restart docker # 也要重新運行以下剛纔的build su - docker cd pythonweb/ docker build -t python-web-test .
-
運行應用程序
docker run -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -p 4000:80 python-web-test * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) 172.16.100.1 - - [27/Aug/2018 08:13:26] "GET / HTTP/1.1" 200 -
-
web瀏覽器驗證
也可以命令行驗證:
[docker@localhost pythonweb]$ curl localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 017c03c8de0b<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
-
以分離模式運行該應用程序
可以先用ctrl+c 結束當前進程。
然後運行:
docker run -d -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -d -p 4000:80 python-web-test a255126065c1aa45ce4bff026ea9e7869efc527abfb9989fef63716428a7d7c6 # -d 以分離的模式運行容器,並返回容器ID
分享鏡像到hub.docker.com
-
登錄:docker login
[docker@localhost ~]$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: 506554897 Password: WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
給鏡像指定tag
docker tag python-web-test 506554897/python-web-test:part1 # python-web-test是上邊創建的container # 506554897: 是hub.docker.com註冊的用戶名 # python-web-test:是倉庫名(repository) # part1 :是tag # 查看標記完image的docker image ls [docker@localhost ~]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 506554897/python-web-test part1 075bace69a76 About an hour ago 132MB python-web-test latest 075bace69a76 About an hour ago 132MB
-
上傳鏡像到[hub.docker.com]
docker push 506554897/python-web-test:part1
[docker@localhost ~]$ docker push 506554897/python-web-test:part1 The push refers to repository [docker.io/506554897/python-web-test] 03db24dfec4f: Pushed 7b4c7a03b2a4: Pushed a0857e348458: Pushed 1ea4f6a807ba: Mounted from library/python fda4dc055a55: Mounted from library/python e8fc09a140cf: Mounted from library/python cdb3f9544e4c: Mounted from library/python part1: digest: sha256:8a5c72b23b7b581adf37f396a0cd27796c15c816d82ce813fab415c96b516191 size: 1788
到官網就可以看到已經上傳的鏡像了:
-
現在就可以在別的docker機器上下載運行這個鏡像了
docker run -p 4001:80 506554897/python-web-test:part1
第二部分--常用命令
1、利用目錄中的Dockerfile 創建一個image
docker build -t image-name .
# . 代表當前目錄
# image-name :創建鏡像的名字
2、運行一個鏡像並對外開放端口映射
docker run -p 4000:80 image-name
3、分離模式運行 一個鏡像
docker run -d -p 4001:80 image-name
4、查看所有運行的容器
docker container ls
5、查看所有運行、未運行的容器
docker container ls -a
6、優雅的停止容器
docker container stop container-id
7、強制停止容器
docker container kill container-id
8、從主機上刪除容器
ocker container rm container-id
9、刪除所有容器
docker container rm $(docker container ls -a -q)
# -a:顯示所有運行、未運行的容器
# -q:僅僅顯示容器ID
10、列出所有的鏡像
docker image ls -a
11、刪除指定鏡像
docker image rm image-id
12、刪除所有鏡像
docker image rm $(docker image ls -a -q)
13、CLI 登錄docker hub
docker login
14、給將要上傳到倉庫 的鏡像 指定tag
docker tag image-name username/repository-name:tag
15、上傳 tag image 到registry
docker push username/repository-name:tag
16、從倉庫下載鏡像 使用image運行一個容器
docker run username/repository-name:tag
第三部分-服務 services
services實際上就是“生產中的container”。services運行一個image,它編碼了image的運行方式、應該使用哪些端口,應該運行多少個容器副本,以便服務具有所需的容量。
擴展服務會改變運行該軟件的容器實例的數量,爲流程中的服務分配更多的計算資源。
在docker平臺定義、運行和擴展服務非常容易,只需編寫一個docker-compose.yml
文件。
創建第一個docker-compose.yml文件
[docker@localhost ~]$ vi docker-compose.yml
version: "3"
services:
web:
#replace username/repository:tag with your name and image details.
image: 506554897/python-web-test:part1
deploy:
#允許副本數爲 5
replicas: 2
resources:
limits:
#每個cpu最多使用10%(在所有核中)
cpus: "0.1"
memory: 50M
#如果容器失敗,立即重新啓動容器
restart_policy:
condition: on-failure
#將主機的4000端口映射到 容器的80端口
ports:
- "4000:80"
# web通過負載平衡webnet網絡共享端口80
networks:
- webnet
# 定義webnet具有默認設置的網絡(這是一個負載平衡的覆蓋網絡)
networks:
webnet:
運行新的負載平衡應用程序
啓動集羣模式
docker swarm init
啓動羣集模式,並使當前機器成爲羣集管理器。
[docker@localhost ~]$ docker swarm init
Swarm initialized: current node (htyhmotwa88rb2it9dkfh9c9o) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4dc36dlf6g6ykl8k1q6hhhegi4pjmv390qlpgyj1cydf7koo7u-8n54mzvaicqtrhafmc8od3h6b 172.16.100.20:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意: 使用集羣的時候,如果不運行該命令,會報錯“this node is not a swarm manager ”
運行集羣應用程序
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web
Creating network python-test-web_webnet
Creating service python-test-web_web
# pyton-test-web:應用程序的名字,自定義就行。
獲取應用程序ID
docker service ls
[docker@localhost ~]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zzevktay14av python-test-web_web replicated 5/5 506554897/python-web-test:part1 *:4000->80/tcp
查看應用程序裏邊的task
在服務中運行的單個容器成爲task。任務被賦予唯一的ID,該ID在數字上遞增,列出服務的task:
docker service ps python-test-web_web
[docker@localhost ~]$ docker service ps python-test-web_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
ar7tr2213d92 python-test-web_web.3 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
lolilmuenas4 python-test-web_web.4 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
h9a1wrhkee1w python-test-web_web.5 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
查看系統運行的container
查看系統運行的container也可以列出應用程序的所有task。
[docker@localhost ~]$ docker container ls -q
b8d43f336d17
a4734d25f376
7ac3d4ecd07e
7946461cd7c1
95a9f0c09dfc
web訪問4000端口
應用程序對於每個客戶端的每個請求,將以循環方式選擇5個任務中的一個來響應。容器ID與前面命令的輸出相匹配(docker container ls -q)
縮放應用程序的task
修改docker-compose.yml文件的replicas 保存
replicas: 2
重新運行應用程序
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web
Updating service python-test-web_web (id: zzevktay14avptf4e4dwxmv1r)
docker執行就地更新,不需要stop容器或kill容器。
#重新啓動應用程序後,查看應用程序的task
[docker@localhost ~]$ docker service ps python-test-web_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 25 minutes ago
vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running
停止應用程序
docker stack rm python-test-web
[docker@localhost ~]$ docker stack rm python-test-web
Removing service python-test-web_web
Removing network python-test-web_webnet
停止集羣
docker swarm leave --force
[docker@localhost ~]$ docker swarm leave --force
Node left the swarm.
第三部分--常用命令
1、查看應用程序
docker stack ls
2、運行應用程序
docker stack deploy -c docker-compose.yml appname
# docker-compose.yml :composefile
# appname: 應用程序名字
3、列出運行的應用程序
docker service ls
4、查看應用程序的task
docker service ps appname
# appname: 應用程序名字
5、檢查task或container
docker inspect <task-id or container-id or service-name>
6、查看運行的容器的容器ID
docker container ls -q
# -q:只顯示容器ID
7、停止應用程序
docker stack rm python-test-web
# python-test-web :應用程序名字
8、啓動/停止集羣
docker swarm init
docker swarm leave --force
第四部分-集羣 Swarm clusters
理解Swarm clusters
集羣就是講幾臺可以運行docker的主機加入到羣集中。集羣中的機器可以是物理的,也可以是虛擬的,加入swarm clusters之後,這些主機成爲節點。當加入羣集之後,運行docker命令要在羣管理器上運行。
羣管理器可以使用集中策略來運行容器,比如“最空的節點”-用容器填充利用率最低的機器。或者“全局”,它確保每臺機器都得到指定容器的一個實例。您指示羣管理器在撰寫文件中使用這些策略,就像您已經使用過的策略一樣。
羣管理器(Swarm managers ):集中管理執行命令或授權其他機器加入羣集的機器。
節點(workers):只提供資源和接受指令,沒有權利執行或授權命令。
集羣管理端口:2377
docker守護進程端口:2376
建立第一個swarm clusters
1、啓動羣集模式並確定羣集管理器
docker swarm init
[root@docker-1 ~]# docker swarm init
Swarm initialized: current node (hzo1e9ux1qounpcdujyz10pks) is now a manager.
To add a worker to this swarm, run the following command:
# 增加主機到集羣,請執行如下命令
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
To add a manager to this swarm,
# 增加一個羣集管理請運行如下:
run 'docker swarm join-token manager' and follow the instructions.
iptables開啓swarm management port:
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
service iptables save
systemctl restart iptables
###2、增加主機到集羣 swarm clusters
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
[docker@docker-2 ~]$ docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
This node joined a swarm as a worker.
3、在管理節點上查看集羣節點
docker node ls
[docker@docker-1 ~]$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hzo1e9ux1qounpcdujyz10pks * docker-1 Ready Active Leader 18.09.0-ce-tp3
jr99plvxg9o8as269vq5o3gql docker-2 Ready Active 18.06.1-ce
# 當然在非管理節點查看會提示:This node is not a swarm manager.
刪除節點命令
docker node rm 節點ID
節點主機刪除集羣
docker swarm leave
(此方法不推薦,這個方法只是在管理顯示節點是down的狀態,並不能直接刪除列表,還得采用上一個辦法徹底刪除。)
強制刪除集羣
docker swarm leave --force
4、在集羣上啓動應用程序
啓動之前要在每個節點開啓一下端口:
7946 tcp/udp 用於容器網絡的發現
4789 udp 用於容器入口發現
兩個節點都運行:
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
iptables -A INPUT -p udp --dport 4000 -j ACCEPT
service iptables save
systemctl restart iptables
# 4000 是步驟三裏邊指定的映射80端口
部署應用程序
[docker@docker-1 ~]$ docker stack deploy -c docker-compose.yml python-test-web
Creating network python-test-web_webnet
Creating service python-test-web_web
5、查看集羣運行的程序
[docker@docker-1 ~]$ docker stack ps python-test-web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
49fw7nvy2qgp python-test-web_web.1 506554897/python-web-test:part1 docker-2 Running Preparing 22 seconds ago
xie9q8h36bbo python-test-web_web.2 506554897/python-web-test:part1 docker-1 Running
注意:這時候運行的服務已經 負載均衡分佈在了兩個節點上。這時候可以隨便訪問兩個節點的ip 的4000 端口了。
6、迭代和縮放應用程序
只需要參考第三部分 修改docker-compose.yml文件,然後重新運行docker stack deploy ...
命令再次部署更新更改的內容。
7、刪除集羣中的應用
[docker@docker-1 ~]$ docker stack rm python-web
Removing service python-web_web
Removing network python-web_webnet
8、刪除swarm clusters
普通節點刪除方式:docker swarm leave
管理節點刪除方式:docker swarm leave --force
第四部分--常用命令
1. 啓動集羣模式:
docker swarm init
2. 主機加入集羣:
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
3. 查看集羣節點列表:
docker node ls
4. 查看集羣節點詳細信息:
docker node inspect 節點id
5. 集羣部署應用程序:
docker stack deploy -c docker-compose.yml 應用程序名
6. 查看集羣應用程序:
docker stack ps 應用程序名
7. 刪除集羣中的應用:
docker stack rm 應用程序名
8. 刪除swarm clusters:
普通節點刪除方式:docker swarm leave
管理節點刪除方式:docker swarm leave --force
第五部分-堆棧 stack
這部分將學習應用程序層次結構的頂部:堆棧。堆棧是一組相互關聯的服務,它們共享依賴關係,可以在一起進行編排和縮放。單個堆棧能夠定義和協調整個應用程序的功能(儘管非常複雜的應用程序可能需要使用多個堆棧)。
從技術上講,從第三部分開始,就一直在使用堆棧,我們創建了一個docker-compose.yml文件並使用docker stack deploy
部署了應用程序。但是這是在當個主機上運行的當個服務堆棧,這通常不是生產環境中發生的情況。接下來我們學習使多個服務相互關聯,並在多臺機器上運行它們。
添加可視化服務並重新部署
可視化工具是一個獨立的服務。可以在堆棧中的任意應用程序中運行。用可視化服務來查看應用程序部署情況。
1、新建docker-compose-visualizer.yml,
替換以下內容,但是一定要更換username/repo:tag
,還有image細節。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: 506554897/python-web-test:part1
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
2、重新運行docker stack deploy
命令
[docker@docker-1 ~]$ docker stack deploy -c docker-compose-visualizer.yml python-test-visualizer
Creating network python-test-visualizer_webnet
Creating service python-test-visualizer_web
Creating service python-test-visualizer_visualizer
3、web驗證
查看應用程序的端口:集羣任意一個節點的ip即可訪問
查看visualizer 映射的8080端口:訪問管理節點ip 8080即可訪問
constraints: [node.role == manager] 代表只部署到管理節點上。
同時也可以用命令查看應用程序在集羣中的部署:
docker stack ps python-test-visualizer
停止刪除應用:
docker stack rm python-test-visualizer
持久化數據
現在讓我們創建一個:提供訪問者計數器的redis服務。
1、保存一個新的docker-compose-redis.yml
替換以下內容,但是一定要更換username/repo:tag
,還有image細節。最後添加了redis服務。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: 506554897/python-web-test:part1
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
注意:
以上配置文件中redis 只有名字,是因爲redis在官網有一個官方形象,並獲得了簡單授權。
6379 :是redis預先配置端口
volumes:定義redis存放數據的地方
constraints:該部分限制redis服務部署在管理節點
redis使數據在此堆棧的部署之間持久化的規範:
redis總是在管理節點上運行,所以它總是使用相同的文件系統。
redis可以訪問的主機文件系統的任意目錄,此處是/home/docker/data目錄。
這樣規範部署可以確保兩個部分:
redis服務設置了空間約束,能確保它始終使用相同的主機。
redis數據都保存在data目錄下,從而保持數據連續性。
2、在管理節點上創建一個./data
目錄
mkdir ./data
3、運行 docker stack deploy
命令
[docker@docker-1 ~]$ docker stack deploy -c docker-compose-redis.yml python-test-redis
Creating network python-test-redis_webnet
Creating service python-test-redis_visualizer
Creating service python-test-redis_redis
Creating service python-test-redis_webdocker stack deploy -c docker-compose-redis.yml python-test-redis
4、驗證三個服務
docker service ls #查看是否運行有三個服務python-test-redis_redis visualizer web
docker stack ps python-test-redis #查看應用程序部署的情況
當然web界面的 可視化也可以驗證:
當不斷訪問管理節點主頁,計數器也在不斷變化:
注意:
這裏的可視化服務和redis都只部署在了管理節點,當然也可以部署在其他節點,可以將deploy修改成和web類似的配置:
deploy:
replicas: 2
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
docker 後續參考文檔
本文pdf版本鏈接:http://down.51cto.com/data/2451861
官網應用案例:https://docs.docker.com/samples/
docker 概況:https://docs.docker.com/engine/docker-overview/
開發docker:https://docs.docker.com/develop/
配置docker網絡:https://docs.docker.com/network/
管理docker應用數據:https://docs.docker.com/storage/
在生產中運行app:https://docs.docker.com/config/labels-custom-metadata/
標準和遵從性:https://docs.docker.com/compliance/
開源docker貢獻:https://docs.docker.com/opensource/
docker檔案文件:https://docs.docker.com/docsarchive/