安装虚拟机

准备一台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. box-sizeing

    在大多数情况下我们在设置元素的 border 和 padding 并不希望改变元素的 width,height值,这个时候我们就可以为该元素设置 box-sizing:border-box;. 我不希 ...

  2. DevOps与Kubernetes 、容器的关系

    近两年,随着容器.Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用. 本文将会从以下几个方面着手,结合实验展现的方式,让读者真正理解 DevOps 的含义. DevOp ...

  3. Caused by: java.lang.UnsatisfiedLinkError: Couldn't load 。。。。

    最近需要做个有地图搜索功能的模块,用到百度地图SDK,但是从官网上下载SDK后导入工程,修改apiKey后,还是无法运行,总是抱这个错误:Caused by: java.lang.Unsatisfie ...

  4. mybatis报错,There is no getter for property named 'templateName' in 'class

    There is no getter for property named 'templateName' in 'class 主要原因是因为mapper.xml 的语句有错误,导致在bean里找不到相 ...

  5. Struts简介

    一.简介 Apache Struts 2最初被称为WebWork 2,它是一个简洁的.可扩展的框架,可用于创建企业级Java web应用程序.设计这个框架是为了从构建.部署.到应用程序维护方面来简化整 ...

  6. Qt设置按钮为圆形

    通过Qt 的样式表实现圆形按钮,其也可以实现圆角按钮,当然也可以使用其他的方式,比如说,通过派生按钮类使用绘图事件,进行一个图形的绘制,或者是通过自定义一个类,通过信号与槽的机制与绘图事件的配合也能实 ...

  7. php判断

    <?php $str = '我是张三?'; preg_match("/张三/", $str, $match); if($match) { echo ' 张三在文本中'; } ...

  8. PHP删除字符串中的空格和换行符 将字符串中的连续多个空格转换为一个空格

    //删除空格和回车 function trimall($str){ $qian=array(" "," ","\t","\n&qu ...

  9. odoo 关系字段(关联关系)

    Many-to-one关联 publisher_id = fields.Many2one(comodel_name= 'res.partner', domain='',context={},ondel ...

  10. 第九章· MySQL的备份和恢复

    一.备份的原因 运维工作的核心简单概括就两件事: 1)第一个是保护公司的数据. 2)第二个是让网站能7*24小时提供服务(用户体验).  备份的原因 1)备份就是为了恢复. 2)尽量减少数据的丢失( ...