安装虚拟机

准备一台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..ce-.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 available to the world outside this container
EXPOSE # 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 minutes ago 150MB

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

docker run -p : friendlyhello

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

http://192.168.0.100:4000

返回结果为:

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

docker run -d -p : friendlyhello

可以使用如下命令查看:

docker container ls

结果如下:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
0316cf74320f friendlyhello "python app.py" minutes ago Up minutes 0.0.0.0:->/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 minutes ago 150MB
weilu2/myrep demo1 a0a4a49f2713 minutes ago 150MB

上传镜像到仓库:

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

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

语法:
docker run -p : username/repository:tag 例子:
docker run -p : 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: ""
services:
web:
# replace username/repo:tag with your name and image details
image: weilu2/myrep:demo1
deploy:
replicas:
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 / weilu2/myrep:demo1 *:->/tcp

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

docker service ps getstartedlab_web

结果:

ID                  NAME                  IMAGE                NODE                    DESIRED STATE       CURRENT STATE           ERROR               PORTS
mrd5ptud2ojy getstartedlab_web. weilu2/myrep:demo1 localhost.localdomain Running Running minutes ago
17mr5bja58k1 getstartedlab_web. weilu2/myrep:demo1 localhost.localdomain Running Running minutes ago
8oitjksmqtsc getstartedlab_web. weilu2/myrep:demo1 localhost.localdomain Running Running minutes ago
xylsrsu2yjid getstartedlab_web. weilu2/myrep:demo1 localhost.localdomain Running Running minutes ago
nx8r17ow9hb8 getstartedlab_web. weilu2/myrep:demo1 localhost.localdomain Running Running 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--0xrs078ymj1evlv57ue86xo06idn9c3qfaomyjo89p1r59zquk-d4ln63p34msselmzasv1qsv0g 192.168.0.100:

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. weilu2/myrep:demo1 centos7- Running Running minutes ago
i75oapmobxp3 getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
jit8geun7h15 getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
zga7xgf6tjup getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
lidvf7jsucif getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
vpqkyxv4ebn9 getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
3jlyg6edjz5s getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago
fh2p24jrqhvv getstartedlab_web. weilu2/myrep:demo1 centos7- Running Running minutes ago

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

错误信息:

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

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

firewall-cmd --add-port=/tcp --permanent
firewall-cmd --add-port=/tcp --permanent
firewall-cmd --add-port=/tcp --permanent
firewall-cmd --add-port=/udp --permanent
firewall-cmd --add-port=/udp --permanent

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

systemctl restart firewalld.service

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

firewall-cmd --list-ports

结果如下:

/tcp /tcp /tcp /udp /udp

参考内容:

Open protocols and ports between the hosts

Docker部署测试的更多相关文章

  1. docker 部署 flask(一)配置环境及测试

    简介: flask也是要部署的.不能老在我们的pycharm里面跑测试服务器. 各种配置linux,我看就算了吧.我们用docker部署. 也就两三行命令. 一:选择基础镜像 GitHub repo: ...

  2. 我使用celery以及docker部署遇到的问题

    首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...

  3. Docker部署SDN环境

    2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...

  4. 记录使用gogs,drone搭建自动部署测试环境

    使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台 Docker是使用go开发的开源容器引擎 Drone是一个基于容器技术的持续集 ...

  5. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  6. Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...

  7. NET Core Docker部署

    NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...

  8. 我使用 Docker 部署 Celery 遇到的问题

    问题1 - Sending due task 本机测试时没有问题的,但是在线上 docker 中,任务一直显示 "Sending due task".超时的任务是 Django O ...

  9. Docker部署Elasticsearch集群

    http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...

随机推荐

  1. 一个简单的创建xml方式

    , matnr LIKE mara-matnr , maktx LIKE makt-maktx , END OF itab_matnr . , class LIKE m_wwgha-class,&qu ...

  2. 【4】Zookeeper数据模型

    一.Znode节点是什么 1.1.概念   Znode节点是Zookeeper中数据模型中最小的数据单元.Zookeeper的数据模型是一颗树,由"/"进行分割路径.每个znode ...

  3. beego注解路由不刷新(不生效)

    本文主要说明本人在使用beego的注解路由时不生效问题 背景: 1.按照官网进行注解路由配置,第一次设置路由,完全正确,注解路由可用. 2.修改路由注释后,发现swagger页面并未有对应的更新 3. ...

  4. yolo模型的特点与各版本性能对比

    目录 一.YOLOV1 二.YOLOV2 二.YOLOV3 正文 目前,基于深度学习的目标检测算法大致可以分为两大流派: 1.两阶段(two-stage)算法:先产生候选区域然后再进行CNN分类(RC ...

  5. C库函数——字符串转数字整理

    atof(将字符串转换成浮点型数)atoi(将字符串转换成整型数)atol(将字符串转换成长整型数)strtod(将字符串转换成浮点数)strtol(将字符串转换成长整型数)strtoul(将字符串转 ...

  6. Linux中退出编辑模式的命令

    vim 有三种模式,注意:这三种模式有很多不同的叫法,我这里是按照鸟哥的linux书中的叫法. 一般指令模式.编辑模式.指令列命令模式 1.vim 文件名      进入一般模式: 2.按 i 进行编 ...

  7. 执行sudo pip3 ...报错 Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'

    对于普通pip,把pip3改成pip即可,其他的修改一样 1.执行命令 sudo gedit /usr/bin/pip3 2.改成下面的形式 from pip import __main__ # 需要 ...

  8. PAT Basic 1030 完美数列 (25 分)

    给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...

  9. phpstorm激活码

    激活码1 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2ln ...

  10. hashmap C++实现分析及std::unordered_map拓展

    今天想到哈希函数,好像解决冲突的只了解了一种链地址法而且也很模糊,就查了些资料复习一下 1.哈希Hash 就是把任意长度的输入,通过哈希算法,变换成固定长度的输出(通常是整型),该输出就是哈希值. 这 ...