老司机实战Windows Server Docker:3 单节点Windows Docker服务器简单运维(上)

经过上两篇实战Windows Server Docker系列文章,大家对安装Windows Docker服务以及如何打包现有IIS应用为docker镜像已经有了基本认识。接下来我们来简单讲讲一些最基本的运维问题。鉴于到目前为止我们只谈到单服务器部署。这里暂时不涉及集群模式下的复杂生产环境运维。

本主题将涵盖下面这些主要内容,由于这个主题包含的内容较多,将分成上下两篇发布:

上篇

  • 远程操作Windows Docker服务器

  • 自动化Docker编译和部署

  • Windows Docker网络配置和端口映射

下篇

  • 负载均衡和反向代理

  • 日志解析和监控

远程操作Windows Docker服务器

和Linux下的Docker服务默认通过TCP 2375/2376端口执行docker命令不同,Windows Docker服务默认只支持本机基于命名管道来执行docker命令。如果安装完Windows Docker服务后,在命令窗口执行netstat -an,可以看到,服务器并不监听2375或者2376这样的端口。当然,我们可以通过修改daemon.json这个配置文件(关于如何修改daemon.json文件,请参考本系列的第一篇),来开启2375/2376端口。2375端口和linux下的2375端口一样,用于非TLS的远程连接;而2376则支持基于证书的安全连接。对于,开发测试环境,一般开启2375端口就行,而对于生产环境,则应该使用2376端口,基于TLS安全连接来远程管理Docker服务器。

要开启2375端口,只需要如下在daemon.json添加hosts配置项,然后重启Docker服务:

{"hosts": ["tcp://0.0.0.0:2375"]
}

要开启2376端口也类似,就是稍微复杂一点,需要生成和配置证书,具体的可以参考微软的这篇官方文档这里就不详述了。

开启2375端口之后,可以通过在命令窗口执行如下的netstat命令,确保2375端口已经正确监听:

netstat -an | findstr 2375

如果返回类似下面,就说明已经在监听了:

  TCP    0.0.0.0:2375           0.0.0.0:0              LISTENINGTCP    [::]:2375              [::]:0                 LISTENING

只是开始监听还不够,要允许外部机器能够远程访问本机的2375端口,我们还要添加防火墙的Inbound规则,可以通过下面的powershell命令开启:

New-NetFirewallRule -DisplayName 'Docker TCP Inbound' -Profile @('Domain', 'Public', 'Private') -Direction Inbound -Action Allow -Protocol TCP -LocalPort 2375

接下来,我们就可以尝试从安装了Docker client的远程机器,访问这台Windows Docker服务器了。Docker client有各种跨平台版本,所以只要是相兼容的版本,我既可以从Windows的docker client,也可以从linux的docker client通过2375端口远程访问docker服务器。

当我们从当前机器,比如你的开发机访问一台远程docker服务器时,我们需要为docker client指定目标HOST。一般有两种方式:一种是可以通过在每个docker命令执行时,添加-H server_name_or_ip参数,另一种是设置DOCKER_HOST环境变量,这样,就不需要每个docker命令都带-H参数了。例如,下面的命令会列出远程服务器1.2.3.4的所有docker images:

docker -H 1.2.3.4 images
docker -H tcp://1.2.3.4 imagesdocker -H tcp://1.2.3.4:2375 images

上面的几种指定host的语法都是可以的,如果使用默认的2375端口,最简单的就可以用第一种,少打不少字符。如果要指定DOCKER_HOST环境变量,那么必须使用完整的格式,比如:

SET DOCKER_HOST=tcp://1.2.3.4:2375

开启远程访问之后,当需要从开发或者编译环境编译和发布docker镜像时,我们就不需要像上一篇中那么蛋疼的先copy发布出来的应用网站文件到docker服务器,然后在服务器上执行docker build了,只需要直接从开发环境执行docker build,就能直接在远程docker服务器上生成和运行docker镜像了。

自动化Docker编译和部署

docker的命令行工具,有许多子命令和参数。如果要经常编译和运行docker镜像,我们当然不希望每次都手打所有参数,例如,下面的命令编译一个docker镜像,并运行一个docker容器,每次手打一边实在没啥乐趣:

docker build -t iis-demo:1.0 .
docker run --ip 172.24.128.2 -p 80 -v "c:/temp:c:/inetpub/logs/LogFiles" -e "env1=LIVE1" -e "env2=LIVE2" -e "HOSTS=1.2.3.4:TEST.COM" iis-demo:1.0

为了简化这个过程,通常我们会写一些带参数的powershell脚本;或者,我们可以使用另一个docker的必备命令行工具:docker-compose。

docker-compose是一个docker官方发布的docker容器编排工具,用于通过yml格式的配置文件来简化docker命令的执行。例如,上面这两个编译并运行docker容器的脚本,如果我们定义如下这个docker-compose.yml配置文件:

version: "2.1"services:iis-demo:    build: .    image: "iis-demo:1.0"    ports:- "80"    networks:      nat:        ipv4_address: 172.24.128.2    volumes:- "c:/temp:c:/inetpub/logs/LogFiles"    environment:- "env1=LIVE1"- "env2=LIVE2"- "HOSTS=1.2.3.4:TEST.COM"networks:  nat:    external: true

那么,我们就可以在docker-compose.yml所在的目录,通过下面这一条命令,就能自动编译docker镜像,并且运行一个docker容器了:

docker-compose up

是不是超级简单?事实上,docker-compose几乎包装了所有通过docker命令行可以执行的参数,而且,一个docker-compose.yml文件,可以包含多个相关的docker镜像的配置,比如,你的这个应用可能依赖于某一个DB,或者另一个应用的,那么,写在一个yml文件里,就能很方便的一键编译,一键发布,一键关闭这些相关容器。限于篇幅,本文就不细说docker-compose各种功能了,大家可以参看官方文档和示例自行摸索。

这里简单讲一下,在windows下,如何安装docker-compose。

  • 首先,docker-compose是一个客户端工具,也就是,它应该安装于安装了docker client的机器,并不需要安装于docker服务器;

  • 对Windows版本的docker-compose来说,它就是一个单个文件的.exe文件,你只需要从官网下载Windows版本的.exe文件,将文件名改成docker-compose.exe,然后随便放到任何方便访问的目录就可以了。我比较懒,一般直接丢到c:\windows\system32目录,那样就不需要设置额外的PATH路径,就能在任何当前目录下,在命令窗口直接执行了。

有了,docker-compose,我们也可以很简单的设置我们的docker服务器每次机器启动之后,自动运行指定的docker容器,只需要配置一个机器的启动脚本,每次机器启动后自动运行docker-compose up,就可以了。

有人可能想问,如何为windows设置自动启动脚本?一个简单的方法是,使用NSSM这个小工具。例如,下载nssm的exe到本地后,只需要在命令行执行:

nssm install "Docker Startup" command param1 param2 ...

就能将指定的命令变成自动开机执行的windows service了。是不是很方便?网上介绍NSSM也文章也很多的,大家可以搜索一些,这里我就给几个link,不过多介绍了:

  • https://help.aliyun.com/document_detail/49021.html

  • https://github.com/verbosemode/public-notes/blob/master/logstash-windows.md

Windows Docker网络配置和端口映射

微软官方,主要就这一篇文档介绍了windows容器的网络设置。介绍得其实并不是很深入。主要来说,它介绍了Windows Docker支持的几种网络模式,例如:nat、transparent、overlay、l2bridge。其中,最常用的,大家最容易理解的,也是Windows Docker服务安装后的默认模式是nat模式。简单的说,就是:

  • 宿主机上运行的所有的容器,都属于一个子网段,每个容器运行时,可以静态指定网段内可用的ip,或者自动分配一个网段内的ip;

  • 子网段内的ip,在宿主机外部无法直接访问,只能从宿主机上直接访问;

  • 可以通过docker命令的-p参数,设置静态或者动态的宿主机ip到容器ip的端口映射,这样宿主机的外部网络,就可以通过宿主机的ip和端口,间接访问到容器内的网站了;

例如,在上面的示例中的docker run --ip 172.24.128.2 -p 80 ...里,-p 80这个参数就会导致docker命令执行时,动态分配一个宿主机上的端口,映射到容器ip的80端口上。如果我们执行上面的docker run命令,或者docker-compose up命令后,在命令窗口执行docker ps,可以看到下面的正在运行的容器:

0f0e07424d80        iis-demo:latest     "C:\\SetHostsAndSta..."   5 minutes ago       Up 4 minutes        0.0.0.0:39924->80/tcp        windowsdockeriisdemo_iis-demo_1

其中,0.0.0.0:39924就是指的,对宿主机上任意ip的39924端口的访问,已经被映射到这个容器的子网ip的80端口了。

但是,这里有个坑,很深的坑,让我一度差点怀疑人生,甚至重装了机器的坑!!!——如果你在宿主机上的浏览器里,访问比如http://localhost:39924/iis-demo,按这个端口映射,你天真的以为就能访问到容器内的网站,尤其示玩过linux下容器的小伙伴,更绝对会认为它能访问。但是,它其实不能!!什么原因呢?我为此一度差点崩溃,最后,在某个windows docker的github issuer中,有开发人员解释说,这个是因为windows版本的实现问题,在宿主机本机,这个映射的端口无法访问,但是,在宿主机外部,访问宿主机上的ip加这个端口是可以访问的!!只允许从外部访问!!WTF?这是什么鬼的道理?不过,反正,现状就是如此,也只能忍了。

除了使用动态分配的端口,如果我们把参数改成例如-p 80:80,那么就能通过宿主机的ip:80端口,访问到容器内的网站了。再提醒一遍,记住,只能从宿主机外部访问!!

微软的官方文档,除了介绍了几种常见的网络模式如何配置,还提到了一些Windows版本的Docker相对于linux版本的docker没有实现的功能,下面的这些docker命令的参数,对Windows Docker无效:

  • --add-host

  • --dns-opt

  • --dns-search

  • --aux-address

  • --internal

  • --ip-range

其中,最遗憾的就是--add-host参数没有实现。--add-host参数原本是用于为容器内的系统的hosts文件添加静态dns解析的,这是一个非常常用的功能,没有它,部署到容器内的应用可能无法解析某些服务器名称或者域名。当然,我们可以自己实现类似功能,例如,在上一篇 docker化现有iis应用中,我们就实现了一个通过环境变量,传入,并设置hosts的简单功能,从而避免了这个参数没实现带来的痛点。

上篇完

下篇正在赶制中,敬请期待...

相关文章:

  • 老司机实战Windows Server Docker:1 初体验之各种填坑

  • 老司机实战Windows Server Docker:2 docker化现有iis应用的正确姿势

  • .Net大户的选择:Windows Container在携程的应用

  • Docker4Dev #6 使用 Windows Container 运行.net应用

  • Docker基础入门及示例

  • Linux+Nginx+Asp.net Core部署

原文地址:http://www.cnblogs.com/teddyma/p/Windows-Server-Docker-3.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法

在PS中,我们有时候会遇到扩展画布的场景,但是扩展完画布之后我们发现不能改变颜色,这可怎么办。 首先来看一下是什么样的问题: 这个背景是不能选择的。 问题分析:这是因为你创建的画布的时候颜色是透明色的&#xff0…

oracle 删除时间段的,oracle SQL如何从日期中删除时间

我有一个名为StartDate的列,其中包含以下格式的日期:03-03-2012 15:22我需要的是将其转换为日期。应该是这样的:DD / MM / YYYY我没有成功尝试过的是:selectp1.PA_VALUE as StartDate,p2.PA_VALUE as EndDatefrom WP_Work pLEFT J…

MySQL str_to_date()函数

转载自 MySQL str_to_date()函数 MySQL STR_TO_DATE函数简介 下面说明了STR_TO_DATE()函数的语法: STR_TO_DATE(str,fmt);STR_TO_DATE()根据fmt格式字符串将str字符串转换为日期值。 STR_TO_DATE()函数可能会根据输入和格式字符串返回DATE,TIME或DAT…

异或运算(^)

针对二进制,相同的为0,不同的为1 注意事项 前提i位置的数不等于j位置的数 public static void swap(int[] arr,int i,int j){arr[i]arr[i]^arr[j];arr[j]arr[i]^arr[j];arr[i]arr[i]^arr[j];}

jQuery遍历div,判断是否为空,为空时执行某个操作

以下运行结果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><link rel"stylesheet" type"text/css" href"css/css.css"/>&l…

Dapper源码学习和源码修改

之前ORM比较火热&#xff0c;自己也搞了个WangSql&#xff0c;但是感觉比较low&#xff0c;大家都说Dapper性能好&#xff0c;所以现在学习学习Dapper&#xff0c;下面简单从宏观层面讲讲我学习的Dapper。 再了解一个东西前&#xff0c;先得学会使用&#xff0c;我也不再赘述怎…

php批量评价,彻底杜绝 WordPress 批量垃圾评论留言的三步曲

本文将详细介绍如何采取三步曲彻底告别烦人的 WordPress 批量垃圾评论问题&#xff0c;还你一个干净清爽的后台评论区。刚开始使用 WordPress 程序建站的朋友们肯定或多或少都被其批量垃圾评论困扰过。然后大家就开始寻思解决的办法&#xff0c;找到的网上说法大都是 Akismet A…

MySQL sysdate()函数

转载自 MySQL sysdate()函数 MySQL SYSDATE函数介绍 下面说明了SYSDATE()函数的语法&#xff1a; SYSDATE(fsp);如果函数用于字符串上下文或YYYYMMDDHHMMSS格式&#xff0c;则SYSDATE()函数将返回当前日期时间&#xff0c;格式为“YYYY-MM-DD HH:MM:SS”的值&#xff0c;以…

2018蓝桥杯省赛---java---C---2(猴子分香蕉)

题目描述 思路分析 直接采用暴力破解&#xff0c;先限定范围&#xff0c;然后依次筛选出满足条件的情况。 代码实现 package TEST;public class Main {public static void main(String[] args) {for (int i 5; i < 10000; i) {int temp i;if (temp % 5 1) {temp temp…

纯前端JS实现人脸识别眨眨眼张张嘴案例

在不久之前我发布了一个案例&#xff0c;是java通过百度云人脸识别接口实现活体检测&#xff08;张张嘴和眨眨眼&#xff09;的案例&#xff0c;大家可以去看看&#xff1a;人脸识别活体检测之眨眨眼和张张嘴&#xff0c;今天我就抽空更新一下纯JS的活体检测吧。 首先给大家看一…

年度大片:StackOverflow 2017开发者调查报告

Stack Overflow 发布了 2017 开发者调查报告&#xff0c;此次有超过 64,000 名开发人员参与调查&#xff0c;分别对其技能、工具、学习趋势等数据进行了统计&#xff0c;现将其中一些有趣的数据和趋势撷取出来分享给大家。 一、开发角色 开发类型 大约有四分之三的受访者是 we…

oracle导库需要删除原始库,导入dmp文件时,需要删除原有ORACLE数据库实例

导入dmp文件时&#xff0c;对于已存在的数据库实例及表处理方式&#xff1a;删除实例。1.以管理员身份登录sqlplus / as sysdba2.停止实例shutdown abort;执行结果&#xff1a;ORACLE instance shut down.3.启动实例独占启动的选项是exclusive&#xff0c;表示只允许一个例程使…

MySQL timediff()函数

转载自 MySQL timediff()函数 MySQL TIMEDIFF函数介绍 TIMEDIFF返回两个TIME或DATETIME值之间的差值。 请参阅TIMEDIFF函数的以下语法。 TIMEDIFF(dt1, dt2);TIMEDIFF函数接受两个必须为相同类型的参数&#xff0c;即TIME或DATETIME。 TIMEDIFF函数返回表示为时间值的dt1 -…

纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js

$(function(){//执行开始的方法//showpos true;startTrack();})var showpos false;// Put event listeners into place//window.addEventListener("DOMContentLoaded", function() {// Grab elements, create settings, etc.var canvas document.getElementById(&…

oracle10g ty_str_split,Oracle split(分隔字符串函数)

一 Oracle版本: 10g PLSQL: 8.0二 具体代码如下:1 类型CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000)2 函数CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_splitISj INT : 0;i INT : 1;len INT : 0;len…

数组中一种数出现奇数次和两种数出现奇数次

题目描述 思路分析 代码实现 package class01;/*** 创建人 wdl* 创建时间 2021/4/10* 描述*/ public class num1ornum2 {public static void main(String[] args) {int arr1[]{1,2,2,2,1,3,3};printOddTimesNum1(arr1);int arr2[]{1,2,2,2,1,3,3,5};printOddTimesNum2(arr2);}…

基于微软开发平台构建和使用私有NuGet托管库

本篇blog包含使用TFS2017&#xff0c;VS2017等平台和工具搭建和使用NuGet库等基本过程&#xff0c;为团体提供更加自动化和高效的研发活动支持。 作为以产品线或者以专属业务为扩展的项目类型的软件研发团体&#xff0c;都会有自己的基础软件框架和功能模块的软件产品智力资产库…

MySQL timestampdiff()函数

转载自 MySQL timestampdiff()函数 MySQL TIMESTAMPDIFF函数简介 下面说明了TIMESTAMPDIFF函数的语法。 TIMESTAMPDIFF(unit,begin,end);TIMESTAMPDIFF函数返回begin-end的结果&#xff0c;其中begin和end是DATE或DATETIME表达式。 TIMESTAMPDIFF函数允许其参数具有混合类…

linux挂载多个目录下,linux – 如何在centos上使用nfs4挂载多个文件夹?

我想让nfs4在这里工作.机器1(服务器)我有一个文件夹,其中2个其他文件夹我试图独立分享. / shared / folder1 / shared / folder2问题是,我似乎无法弄清楚如何在客户端上独立挂载文件夹.(机器1 – 服务器)/ etc / exports中&#xff1a;/var/shared/folder1 192.168.200.101(rw,…

你真的理解CAP理论吗?

最近在学习消息中间件的时候&#xff0c;接触到了分布式系统&#xff0c;进而接触到CAP理论&#xff0c;上一次接触还是在年初的时候公司的技术分享会上&#xff0c;有人在介绍项目的时候简单介绍了这个CAP理论&#xff0c;但并没有深入研究。这次&#xff0c;该是时候研究一下…