zoukankan      html  css  js  c++  java
  • Docker部署测试

    安装虚拟机

    准备一台Centos7的VM,名为Centos7-1

    具体过程可以参考:

    KVM安装

    KVM——以桥接的方式搭建虚拟机网络配置

    安装Docker

    下载rpm包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

    执行命令:

    yum install docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

    在安装过程中会安装“container-selinux-2.281.git8ce147.el7.noarch”

    具体过程参考:

    Docker CE install CentOS

    启动Docker:

    systemctl start docker

    验证是否安装正确:

    docker run hello-world

    定义一个容器并部署一个应用

    创建 Dockerfile 文件用于定义容器:

    # Use an official Python runtime as a parent image
    FROM python:2.7-slim
    
    # Set the working directory to /app
    WORKDIR /app
    
    # Copy the current directory contents into the container at /app
    ADD . /app
    
    # Install any needed packages specified in requirements.txt
    RUN pip install -r requirements.txt
    
    # Make port 80 available to the world outside this container
    EXPOSE 80
    
    # Define environment variable
    ENV NAME World
    
    # Run app.py when the container launches
    CMD ["python", "app.py"]

    创建 requirements.txt文件罗列依赖:

    Flask
    Redis

    创建应用 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)

    将这三个文件随意存储在一个目录中,此处我存储在/home/luwei/dockerfile目录下,然后在该目录下执行命令:

    docker build -t friendlyhello .

    注意后面的点不要漏掉,表示当前目录,执行完成之后使用如下命令可以查看创建的app:

    docker images

    结果:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    friendlyhello       latest              a0a4a49f2713        9 minutes ago       150MB

    执行一下命令可以运行该应用:

    docker run -p 4000:80 friendlyhello

    其中4000表示将容器中的80端口映射到主机上的4000端口,因此可以在外部使用如下地址访问:

    http://192.168.0.100:4000

    返回结果为:

    此外,还可以以后台的形式运行:

    docker run -d -p 4000:80 friendlyhello

    可以使用如下命令查看:

    docker container ls

    结果如下:

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
    0316cf74320f        friendlyhello       "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:4000->80/tcp   sad_swartz

    使用一下命令可以终止:

    docker container stop 0316cf74320f

    其中末尾的一串字符就是上面的CONTAINER ID

    将应用上传到远程仓库

    登录dockerID:

    docker login

    输入用户名密码即可(在Docker官网上注册)

    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: weilu2
    Password: 
    Login Succeeded

    标记镜像:

    语法:
    docker tag image username/repository:tag
    
    例子:
    docker tag friendlyhello weilu2/myrep:demo1

    使用docker images查看:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    friendlyhello       latest              a0a4a49f2713        28 minutes ago      150MB
    weilu2/myrep        demo1               a0a4a49f2713        28 minutes ago      150MB

    上传镜像到仓库:

    语法:
    docker push username/repository:tag
    
    例子:
    docker push weilu2/myrep:demo1

    从远程仓库中拉取并运行:

    语法:
    docker run -p 4000:80 username/repository:tag
    
    例子:
    docker run -p 4000:80 weilu2/myrep:demo1

    安装docker-compose

    从官网上下载该文件,并将其放置在/usr/local/bin下:

    sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

    修改该文件的权限,增加执行权限:

    chmod +x /usr/local/bin/docker-compose

    部署单节点swarm和service

    编写 docker-compose.yml文件:

    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: weilu2/myrep:demo1
        deploy:
          replicas: 5
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
          restart_policy:
            condition: on-failure
        ports:
          - "80:80"
        networks:
          - webnet
    networks:
      webnet:

    这个文件可以放在任意位置。

    初始化swarm:

    docker swarm init

    部署应用:

    docker stack deploy -c docker-compose.yml getstartedlab

    这样,我们的服务就运行在五个容器实例中,可以使用如下命令查看:

    docker service ls

    结果:

    ID                  NAME                MODE                REPLICAS            IMAGE                PORTS
    hh1j4kg92pd2        getstartedlab_web   replicated          5/5                 weilu2/myrep:demo1   *:80->80/tcp

     一个容器中运行的一个服务称为一个任务,查看这些任务可以使用命令:

    docker service ps getstartedlab_web

    结果:

    ID                  NAME                  IMAGE                NODE                    DESIRED STATE       CURRENT STATE           ERROR               PORTS
    mrd5ptud2ojy        getstartedlab_web.1   weilu2/myrep:demo1   localhost.localdomain   Running             Running 5 minutes ago                       
    17mr5bja58k1        getstartedlab_web.2   weilu2/myrep:demo1   localhost.localdomain   Running             Running 5 minutes ago                       
    8oitjksmqtsc        getstartedlab_web.3   weilu2/myrep:demo1   localhost.localdomain   Running             Running 5 minutes ago                       
    xylsrsu2yjid        getstartedlab_web.4   weilu2/myrep:demo1   localhost.localdomain   Running             Running 5 minutes ago                       
    nx8r17ow9hb8        getstartedlab_web.5   weilu2/myrep:demo1   localhost.localdomain   Running             Running 5 minutes ago                       

    扩展应用规模

    可以通过修改docker-compose.yml文件中的replicas值来修改应用的规模,然后使用如下命令进行部署:

    docker stack deploy -c docker-compose.yml getstartedlab

    停止应用:

    docker stack rm getstartedlab

    离开swarm:

    docker swarm leave --force

    部署swarm集群

    初始化swarm(注意,如果是承接上面的操作,那么在初始化之前要用docker swarm leave --force命令使当前节点离开现有的一个swarm)

    docker swarm init --advertise-addr 192.168.0.100

    通过这个命令初始化时,会得到两个命令提示:

    Swarm initialized: current node (joly7cvvnunrhoh961bqg2tur) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-0xrs078ymj1evlv57ue86xo06idn9c3qfaomyjo89p1r59zquk-d4ln63p34msselmzasv1qsv0g 192.168.0.100:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

     表示当前节点是一个manager,如果要在这个swarm中增加worker,可以通过在对应节点上执行 docker swarm join的命令来实现。

    现在我另外部署了一台CentOS7的虚拟机,称为CentOS7-2,IP为192.168.0.101,这台虚拟机的环境配置与CentOS7-1完全一致,然后在其中执行命令:

    docker swarm join --token SWMTKN-1-0xrs078ymj1evlv57ue86xo06idn9c3qfaomyjo89p1r59zquk-d4ln63p34msselmzasv1qsv0g 192.168.0.100:2377

    就可以将CentOS7-2作为worker加入到这个swarm中。在首次执行该命令时,可能会碰到一个错误,请参考附录一。

    添加成功之后会有相应的这个worker节点成功添加到swarm中的提示信息。

    在manager节点上运行命令:

    docker node ls

    可以查看节点信息:

    ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS
    joly7cvvnunrhoh961bqg2tur *   localhost.localdomain   Ready               Active              Leader
    yjkfjamz95ic5azroxrox2i58     localhost.localdomain   Ready               Active              

    在swarm集群上部署应用

    还使用与之前在单节点上部署应用相同的方法在manager节点上部署,进入docker-compose.yml文件所在目录,执行命令:

    docker stack deploy -c docker-compose.yml getstartedlab

    可以看到输出结果:

    Creating network getstartedlab_webnet
    Creating service getstartedlab_web

    使用如下命令查看部署的服务:

    docker stack ps getstartedlab

    根据结果中的Node一列,可以很直观的发现应用被部署在集群上了:

    ID                  NAME                  IMAGE                NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    nui1gvfjd8i8        getstartedlab_web.1   weilu2/myrep:demo1   centos7-2           Running             Running 5 minutes ago                       
    i75oapmobxp3        getstartedlab_web.2   weilu2/myrep:demo1   centos7-1           Running             Running 5 minutes ago                       
    jit8geun7h15        getstartedlab_web.3   weilu2/myrep:demo1   centos7-2           Running             Running 5 minutes ago                       
    zga7xgf6tjup        getstartedlab_web.4   weilu2/myrep:demo1   centos7-1           Running             Running 5 minutes ago                       
    lidvf7jsucif        getstartedlab_web.5   weilu2/myrep:demo1   centos7-2           Running             Running 5 minutes ago                       
    vpqkyxv4ebn9        getstartedlab_web.6   weilu2/myrep:demo1   centos7-1           Running             Running 5 minutes ago                       
    3jlyg6edjz5s        getstartedlab_web.7   weilu2/myrep:demo1   centos7-2           Running             Running 5 minutes ago                       
    fh2p24jrqhvv        getstartedlab_web.8   weilu2/myrep:demo1   centos7-1           Running             Running 5 minutes ago                       

    附录一:worker加入swarm出现rpc错误

    错误信息:

    Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable

    这个是由于HOST的端口没有打开的问题,导致被防火墙拦截了,使用如下命令打开相关端口即可:

    firewall-cmd --add-port=2376/tcp --permanent
    firewall-cmd --add-port=2377/tcp --permanent
    firewall-cmd --add-port=7946/tcp --permanent
    firewall-cmd --add-port=7946/udp --permanent
    firewall-cmd --add-port=4789/udp --permanent

    添加端口之后要重启防火墙才生效:

    systemctl restart firewalld.service

    可以使用命令查看端口开放情况:

    firewall-cmd --list-ports

    结果如下:

    2376/tcp 2377/tcp 7946/tcp 7946/udp 4789/udp

    参考内容:

    Open protocols and ports between the hosts

  • 相关阅读:
    poj 3096 Surprising Strings (set)
    hdu 4038 stone
    STL set 使用总结
    poj 3185 The Water Bowls (bfs 加未压缩)
    QPixmap显示图片
    addStretch的作用 .
    Qt SizeHint()
    StyleSheet
    linux编程守护进程编写
    Qt样式表的使用
  • 原文地址:https://www.cnblogs.com/weilu2/p/docker_cluster_deploy.html
Copyright © 2011-2022 走看看