docker 入門教程

第一部分: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

  1. 通過設置倉庫,yum安裝docker-ce
  2. 通過下載rpm包,手動安裝docker-ce

1、yum安裝docker

設置docker-ce倉庫

  1. 安裝需求數據包,yum-utils提供了yum-config-manager實用工具,device-mapper-persistent-datalvm2 提供了devicemapper存儲驅動器。

    yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2
  2. 設置倉庫

    yum-config-manager \
       --add-repo \
       https://download.docker.com/linux/centos/docker-ce.repo
  3. 激活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’鏡像 創建一個新的容器運行。當運行容器的時候,會打印一些信息後並自動退出。
docker 入門教程

2、手動下載安裝docker-ce

rpm下載鏈接:<https://download.docker.com/linux/centos/7/x86_64/stable/Packages/&gt;

安裝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
docker 入門教程

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#012Tryiptables -h' or 'iptables --help' for more information.

解決辦法:yum -y install iptables

第一部分結論:

Containers 的CI/CD 是天衣無縫。例如:

  • 應用程序沒有系統依賴項
  • 可以將更新推送到分佈式應用程序的任何部分。
  • 資源密度可以優化。

使用docker,應用程序縮放是一個問題,就是編制新的可執行文件,而不是運行大量的vm主機。

第二部分 - 容器 container

用Docker方式構建一個應用程序,層次結構從底層開始,這個應用程序是一個container;高於此級別是一個service,它定義了容器在生產中的行爲方式;最後是stack(堆棧)。

用Dockerfile構建一個python web應用程序

  1. 創建一個空目錄,並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"]
  2. 接下來創建requirements.txt文件

    [docker@localhost pythonweb]$  vi requirements.txt 
    Flash
    Redis
  3. 創建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)
  4. 用Build命令創建一個Docker image,使用-t 指定一個 鏡像名字

    docker build -t python-web-test .
  5. 查看創建的“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
  6. 爲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 .
  7. 運行應用程序

    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 -
  8. web瀏覽器驗證
    docker 入門教程

    也可以命令行驗證:

    [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>
  9. 以分離模式運行該應用程序

    可以先用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

    docker 入門教程

分享鏡像到hub.docker.com

  1. 註冊用戶:https://hub.docker.com/

  2. 登錄: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
  3. 給鏡像指定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
  4. 上傳鏡像到[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 入門教程

  5. 現在就可以在別的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)

docker 入門教程

縮放應用程序的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 端口了。

docker 入門教程

docker 入門教程

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即可訪問

docker 入門教程

查看visualizer 映射的8080端口:訪問管理節點ip 8080即可訪問

constraints: [node.role == manager] 代表只部署到管理節點上。

docker 入門教程

同時也可以用命令查看應用程序在集羣中的部署:

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界面的 可視化也可以驗證:
docker 入門教程

當不斷訪問管理節點主頁,計數器也在不斷變化:

docker 入門教程

注意:

這裏的可視化服務和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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章