首页 文章 精选 留言 我的

精选列表

搜索[技术极客],共10008篇文章
优秀的个人博客,低调大师

C语言之const和volatile"究极"学习

关于const的用法,现在大概前前后后应该写了有两篇文章,以前学习的时候,用法体会不是那么深刻,为啥这么说呢,因为在学习c++的时候,会发现const关键字有新的玩法,关于这个新的玩法,大家可以去看最近学习总结写的c++文章专辑。 一、const的用法: 1、const只读变量: const修饰的变量是只读的,本质上还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期没有用 注:const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边 2、const全局变量的分歧: 在现代c语言编译器中,修改const全局变量将导致程序崩溃 标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变 3、代码示例: (1)只读变量代码示例: #include<stdio.h>intmain(){constinta=10;printf("a=%d\n",a);a=20;printf("a=%d\n",a);return0;} 运行结果: test.c:Infunction‘main’:test.c:8:4:error:assignmentofread-onlyvariable‘a’a=20;^ 注解:显示这个结果很正常,变量a被const修饰了,它就成了只读的。 (2)如果对变量a的值进行修改: #include<stdio.h>intmain(){constinta=10;int*p=(int*)&a;printf("a=%d\n",a);*p=20;printf("a=%d\n",a);return0;} 运行结果: root@txp-virtual-machine:/home/txp#./a.outa=10a=20 注解:通过指针的方式,就能够把a的值进行修改,这也论证了“const修饰的变量是只读的,本质上还是变量”这句话 (3)const修饰全局变量: 代码版本一 #include<stdio.h>constintb=40;intmain(){printf("b=%d\n",b);b=20;printf("b=%d\n",b);return0;} 输出结果: root@txp-virtual-machine:/home/txp#gcctest.ctest.c:Infunction‘main’:test.c:10:4:error:assignmentofread-onlyvariable‘b’b=20;^ 注解:跟const修饰栈上的变量用法一样 代码版本二 #include<stdio.h>constintb=40;intmain(){int*p=(int*)&b;printf("b=%d\n",b);*p=20;printf("b=%d\n",b);return0;} 运行结果: root@txp-virtual-machine:/home/txp#./a.outb=40Segmentationfault(coredumped) 注解:这里出现了段错误,这也验证了我们上面所说的“修改const全局变量将导致程序崩溃”。 同时为了验证“标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变”这句话,我把这段代码放到dev c++上进行试验: 说明:我这个版本的编译器支持标准c语言,所以没导致程序崩溃,能够正常运行 4、const的本质 c语言中的const使得变量具有只读属性 现代c编译器中的const将具有全局生命周期的变量存储于只读存储区,不是放在全局数据区 注:const不能定义真正意义上的常量;同时这里注意static关键字修饰的变量,它的生命周期和全局变量一样。 代码示例: #include<stdio.h>constintArray[5]={0};voidfun(int*p,intv){*p=v;}intmain(){intconsti=1;conststaticintj=2;intconstarray[5]={0};fun((int*)&i,1);fun((int*)&j,2);fun((int*)&array[2],3);fun((int*)&Array[1],4);return0;} 输出结果: root@txp-virtual-machine:/home/txp#./a.outSegmentationfault(coredumped) 注解:这里会有段错误,错误出现在const+static修饰的j变量对其进行修改,还有const修饰的全局数组。 5、const修饰函数参数和返回值 const修饰函数参数表示在函数体内不希望改变参数的值 const修饰函数返回值表示返回值不可改变,多用于返回指针的情形 在c语言中的字符串字面量存储于只读存储区中,在程序中需要使用const char* 指针,例如: constchar*s="TXP嵌入式";//字符串字面量 代码示例: #include<stdio.h>constchar*fun(constinti){i=8;return"TXP";}intmain(){constchar*p=fun(0);printf("%s\n",p);p[1]='_';printf("%s\n",p);return0;} 输出结果: root@txp-virtual-machine:/home/txp#gcctest.ctest.c:Infunction‘fun’:test.c:5:4:error:assignmentofread-onlyparameter‘i’i=8;^test.c:Infunction‘main’:test.c:12:5:error:assignmentofread-onlylocation‘*(p+1u)’p[1]='_';^ 注解:上面这样写,肯定有问题。 代码进化: #include<stdio.h>constchar*fun(constinti){//i=8;return"TXP";}intmain(){constchar*p=fun(0);printf("%s\n",p);//p[1]='_';//printf("%s\n",p);return0;} 输出结果: root@txp-virtual-machine:/home/txp#./a.outTXP 二、volatile的用法 老实说,这个关键字在面试题目里面经常会出现,但是平时学习的时候,如果你没有真正理解这其中的含义,在笔试的时候,脑袋里面可能依稀是记得有那么几个结论,但是有时候吧,一紧张就把结论给忘了,也不是不可能,所以说,咋们还是老实一点,得真正把它原理搞明白才行,这样上来战场就不怕了,以后写代码也就少一点bug。 1、volatile的常用结论(volatile英文本意就是易变的意思) 这里我先给结论,然后再给一个例子,把这个例子的讲明白,所有结论就都明白了。 volatile可理解为“编译器警告指示字” volatile告诉编译器必须每次去内存中取变量值 volatile主要修饰可能被多个线程访问的变量 volatile也可以修饰可能被未知因素更改的变量 volatile可以修饰一个中断子程序中会访问到的非自动变量 2、分析原理 大家可能平时在博客学习,都会发现讲解编译器优化的,然后加了volatile关键来修饰变量,就告诉编译器不要去优化这个变量了,那么这里的优化到底是什么意思呢? 从字面上来理解优化两个字,意思就是最优值(变量的值不会改变),这里我用一个简单代码来说明一下: #include<stdio.h>intmain(){inta=1;//volatileinta=0;while(a){}} 说明:上面的代码,如果变量a没有加volatile修饰的话,编译器就会优化它(也就是a的值一直不变),所以while就一直死循环;然后我如果加了volatile来修饰的话,编译器就不会去优化变量a,不优化的意思就是说,变量a的值可能就会改变,while就不会一直死循环。 当然这里为了好理解,我说的不是很专业,没有从寄存器和内存的角度去说。(我也不想那么去讲解,简单理解了就行) 总之一句话:上面的结论中,volatile修饰的都是变量,变量就可能改变,不会被编译器优化;只是说我们上面的结论应用场景不同而已。 三、总结 const使得变量具有只读属性 const不能定义真正意义上的常量 const将具有全局生命周期的变量存储于只读存储区 volatile强制编译器减少优化,必须每次从内存中取值 好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见! 本文分享自微信公众号 - TXP嵌入式(txp1121518wo-)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

CodeMirror 代码渲染神器的极简入门实例

效果: image.png HTML: <script src="https://codemirror.net/lib/codemirror.js"></script> <script src="https://codemirror.net/mode/javascript/javascript.js"></script> <link rel="stylesheet" href="https://codemirror.net/lib/codemirror.css"> <div id="fn"></div> <button class="btn btn-sm btn-success offset2" id="fn-save-btn">保存</button> <button class="btn btn-sm btn-success" id="fn-eval-btn">运行</button> <div id="eval-result" class="eval-result"></div> JS 代码示例: // 渲染代码: var editor = CodeMirror.fromTextArea(document.getElementById("fnBody"), { lineNumbers: true, mode: "javascript", matchBrackets: true }); // 获取代码的文本值 var fnBody = editor.doc.getValue(); // 运行脚本,预览结果 $('#fn-eval-btn').unbind().bind('click', () => { console.dir(editor); var fnBody = editor.doc.getValue(); var postData = { js: fnBody }; $.ajax({ url: '/datafactory/evalJs.json' , data: postData , type: 'POST' , success: (result) => { if (result.success == true) { $('#eval-result').html(`<div>运行结果:</div><code>${result.data}</code>`) } else { alert(result.errorMessage) } } , error: (err) => { alert(JSON.stringify(err)) } }); });// fn-eval-btn 后端代码 Kotlin: @PostMapping("/evalJs.json") @ResponseBody fun evalJs(js: String): ResultVo<String> { println("js=${js}") val result = ResultVo( data = "", isSuccess = false, errorCode = "1", errorMessage = "", state = "1" ) try { val data = NashornUtil.evalJs(js) result.data = data result.isSuccess = true result.errorCode = "0" result.errorMessage = "" result.state = "" } catch (e: Exception) { result.errorMessage = e.message ?: "" } return result } 其中,evalJs() 的函数实现如下: package com.alibaba.xxpt.qa.adt.util import javax.script.ScriptEngineManager object NashornUtil { private val scriptEngineManager = ScriptEngineManager() private val nashorn = scriptEngineManager.getEngineByName("nashorn") fun evalJs(js: String): String { try { return nashorn.eval(js).toString() } catch (e: Exception) { e.printStackTrace() return "" } } } 使用的是 Java 8 中的nashorn 引擎(支持 ES5 的语法)。 参考文档:https://codemirror.net/

优秀的个人博客,低调大师

牛客网输入规范总结(c++部分)

注意:输入的多组输入,不是一组,已经猜了很多次坑了哦! 输入 预先不输入数据的组数 while(cin>>a>>b){ cout<<a+b<<endl; } 预先知道数据组数 cin>>n; for(int i=0; i<n; i++){ int a,b; cin>>a>>b; cout<<a+b<<endl; } 只有一组数据 cin>>a>>b; cout<<a+b<<endl; 输出 不需要输出case数 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<a+b<<endl; } 需要输出case数 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<"Case"<<i+1<<a+b<<endl; } 每个case之后有空行 for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<"Case"<<i+1<<a+b<<endl<<endl; } 两个Case之间有空行 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; if(i>0){ cout<<endl; } cout<<"Case"<<i+1<<a+b<<endl; } 处理细节和技巧 输入 不用保存所有组的输入,读一组算一组 “可恶”的字符串——带空白 scanf, cin之类都读到空白结束 gets, cin.getline。再自己parse 用scanf, gets代替cin。 输出 注意格式 字母大小写 什么时候换行 输出“case”后面有没有“#”或者“:”之类。 每行末尾有\n,但一般没有空白 用printf代替cout。 OJ常见状态 内存超限——使用内存过多 返回非零——main函数返回了非零值 浮点错误——除以零 运行错误——指针乱指 段错误——指针越界

优秀的个人博客,低调大师

Docker 三剑客之 Docker Compose

Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,开源地址:https://github.com/docker/compose Docker Compose 中的两个重要概念: 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。 项目 (project):由一组关联的应用容器组成的一个完整业务单元。 一个项目可以由多个服务关联(容器)而成,并使用docker-compose.yml进行管理。 安装命令: $ curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose 这种方式安装巨慢无比,我们可以使用 PIP 安装,如果没有 PIP 环境,需要手动安装下: $ apt-get update $ apt-get -y install python-pip 或 $ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" $ python get-pip.py $ pip --help $ pip -V PIP 安装命令: $ sudo pip install -U docker-compose PIP 安装之后,执行 Docker Compose 命令的时候,会出现下面错误: $ docker-compose up Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg 解决方式,从官方源中手动下载安装包,然后移动到制定目录赋予权限,命令如下: $ cp -i docker-compose-Linux-x86_64 /usr/local/bin $ mv docker-compose-Linux-x86_64 docker-compose $ chmod +x /usr/local/bin/docker-compose 安装好之后,我们就可以使用 Docker Compose 进行容器编排了,我们就拿之前做的HelloDocker.Sample项目做为示例。 我们在HelloDocker.Sample.Web项目目录下,创建docker-compose.yml配置文件,示例: consul: command: agent -bind=10.9.10.89 -client=0.0.0.0 -node=vagrant-ubuntu-xishuai -retry-join=10.9.2.236 image: consul:latest ports: - 8300:8300 - 8400:8400 - 8500:8500 - 8600:53/udp net: host fabio: image: magiconair/fabio:latest ports: - 9999:9999 - 9998:9998 net: host volumes: - /etc/fabio/fabio.properties:/etc/fabio/fabio.properties environment: - SERVICE_9998_TAGS=urlprefix-/fabio hello-docker: ports: - 54917:54917 build: . net: host 其实看配置就明了了,一个项目中包含三个服务(consul,fabio和hell-docker容器),Docker Compose 对这三个服务进行编排部署,我们执行docker-compose up命令,启动项目: $ docker-compose up -d Creating hellodockerweb_fabio_1 ... Creating hellodockerweb_hello-docker_1 ... Creating hellodockerweb_consul_1 ... Creating hellodockerweb_fabio_1 Creating hellodockerweb_hello-docker_1 Creating hellodockerweb_consul_1 ... done 我们可以执行docker-compose ps, 查看运行的服务(容器): $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------ hellodockerweb_consul_1 docker-entrypoint.sh agent ... Up hellodockerweb_fabio_1 /fabio -cfg /etc/fabio/fab ... Up hellodockerweb_hello-docker_1 dotnet HelloDocker.Web.dll Up 或者执行docker-compose logs,查看日志: docker-compose logs Attaching to hellodockerweb_consul_1, hellodockerweb_hello-docker_1, hellodockerweb_fabio_1 consul_1 | ==> Starting Consul agent... consul_1 | ==> Consul agent running! consul_1 | Version: 'v1.0.0' consul_1 | Node ID: '521358bc-efc0-1a69-4a58-a9bfc8a9b09c' consul_1 | Node name: 'vagrant-ubuntu-xishuai' consul_1 | Datacenter: 'dc1' (Segment: '') consul_1 | Server: false (Bootstrap: false) consul_1 | Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, DNS: 8600) consul_1 | Cluster Addr: 10.9.10.89 (LAN: 8301, WAN: 8302) consul_1 | Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false consul_1 | consul_1 | ==> Log data will now stream in as it occurs: consul_1 | consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: vagrant-ubuntu-xishuai 10.9.10.89 consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started HTTP server on [::]:8500 (tcp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Retry join LAN is supported for: aws azure gce softlayer consul_1 | 2017/11/21 04:41:25 [INFO] agent: Joining LAN cluster... consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joining: [10.9.2.236] consul_1 | 2017/11/21 04:41:25 [WARN] manager: No servers available consul_1 | 2017/11/21 04:41:25 [ERR] agent: failed to sync remote state: No known Consul servers consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: agent_1 10.9.2.236 consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: windows64-xishuai 10.9.10.187 consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joined: 1 Err: <nil> consul_1 | 2017/11/21 04:41:25 [INFO] agent: Join LAN completed. Synced with 1 initial agents consul_1 | 2017/11/21 04:41:25 [INFO] consul: adding server agent_1 (Addr: tcp/10.9.2.236:8300) (DC: dc1) consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998' hello-docker_1 | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35] hello-docker_1 | No XML encryptor configured. Key {3d8c2a18-ed43-4df9-980f-8573175ebecf} may be persisted to storage in unencrypted form. hello-docker_1 | Hosting environment: Production hello-docker_1 | Content root path: /app hello-docker_1 | Now listening on: http://[::]:54917 hello-docker_1 | Application started. Press Ctrl+C to shut down. fabio_1 | 2017/11/21 04:41:25 [INFO] Setting log level to INFO fabio_1 | 2017/11/21 04:41:25 [INFO] Runtime config fabio_1 | { fabio_1 | "Proxy": { fabio_1 | "Strategy": "rnd", fabio_1 | "Matcher": "prefix", fabio_1 | "NoRouteStatus": 404, fabio_1 | "MaxConn": 10000, fabio_1 | "ShutdownWait": 0, fabio_1 | "DialTimeout": 30000000000, fabio_1 | "ResponseHeaderTimeout": 0, fabio_1 | "KeepAliveTimeout": 0, fabio_1 | "FlushInterval": 1000000000, fabio_1 | "LocalIP": "10.0.2.15", fabio_1 | "ClientIPHeader": "", fabio_1 | "TLSHeader": "", fabio_1 | "TLSHeaderValue": "", fabio_1 | "GZIPContentTypes": null, fabio_1 | "RequestID": "" fabio_1 | }, fabio_1 | "Registry": { fabio_1 | "Backend": "consul", fabio_1 | "Static": { fabio_1 | "Routes": "" fabio_1 | }, fabio_1 | "File": { fabio_1 | "Path": "" fabio_1 | }, consul_1 | 2017/11/21 04:41:34 [WARN] agent: check 'service:8a600176-4c58-4edc-95af-71fc27345954' has deregister interval below minimum of 1m0s consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service '8a600176-4c58-4edc-95af-71fc27345954' consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998' consul_1 | 2017/11/21 04:41:35 [INFO] agent: Synced check 'service:fabio-vagrant-ubuntu-trusty-9998' consul_1 | 2017/11/21 04:41:40 [INFO] agent: Synced check 'service:8a600176-4c58-4edc-95af-71fc27345954' consul_1 | ==> Newer Consul version available: 1.0.1 (currently running: 1.0.0) consul_1 | 2017/11/21 04:41:57 [WARN] memberlist: Refuting a suspect message (from: agent_1) fabio_1 | "Consul": { fabio_1 | "Addr": "10.9.10.89:8500", fabio_1 | "Scheme": "http", fabio_1 | "Token": "", fabio_1 | "KVPath": "/fabio/config", fabio_1 | "TagPrefix": "urlprefix-", fabio_1 | "Register": true, fabio_1 | "ServiceAddr": "10.9.10.89:9998", fabio_1 | "ServiceName": "fabio", fabio_1 | "ServiceTags": null, fabio_1 | "ServiceStatus": [ fabio_1 | "passing" fabio_1 | ], fabio_1 | "CheckInterval": 1000000000, fabio_1 | "CheckTimeout": 3000000000, fabio_1 | "CheckScheme": "http", fabio_1 | "CheckTLSSkipVerify": false fabio_1 | }, fabio_1 | "Timeout": 10000000000, fabio_1 | "Retry": 500000000 fabio_1 | }, fabio_1 | "Listen": [ fabio_1 | { fabio_1 | "Addr": ":9999", fabio_1 | "Proto": "http", fabio_1 | "ReadTimeout": 0, fabio_1 | "WriteTimeout": 0, fabio_1 | "CertSource": { fabio_1 | "Name": "", fabio_1 | "Type": "", fabio_1 | "CertPath": "", fabio_1 | "KeyPath": "", fabio_1 | "ClientCAPath": "", fabio_1 | "CAUpgradeCN": "", fabio_1 | "Refresh": 0, fabio_1 | "Header": null fabio_1 | }, fabio_1 | "StrictMatch": false, fabio_1 | "TLSMinVersion": 0, fabio_1 | "TLSMaxVersion": 0, fabio_1 | "TLSCiphers": null fabio_1 | } fabio_1 | ], fabio_1 | "Log": { fabio_1 | "AccessFormat": "common", fabio_1 | "AccessTarget": "", fabio_1 | "RoutesFormat": "delta", fabio_1 | "Level": "INFO" fabio_1 | }, fabio_1 | "Metrics": { fabio_1 | "Target": "", fabio_1 | "Prefix": "{{clean .Hostname}}.{{clean .Exec}}", fabio_1 | "Names": "{{clean .Service}}.{{clean .Host}}.{{clean .Path}}.{{clean .TargetURL.Host}}", fabio_1 | "Interval": 30000000000, fabio_1 | "Timeout": 10000000000, fabio_1 | "Retry": 500000000, fabio_1 | "GraphiteAddr": "", fabio_1 | "StatsDAddr": "", fabio_1 | "Circonus": { fabio_1 | "APIKey": "", fabio_1 | "APIApp": "fabio", fabio_1 | "APIURL": "", fabio_1 | "CheckID": "", fabio_1 | "BrokerID": "" fabio_1 | } fabio_1 | }, fabio_1 | "UI": { fabio_1 | "Listen": { fabio_1 | "Addr": ":9998", fabio_1 | "Proto": "http", fabio_1 | "ReadTimeout": 0, fabio_1 | "WriteTimeout": 0, fabio_1 | "CertSource": { fabio_1 | "Name": "", fabio_1 | "Type": "", fabio_1 | "CertPath": "", fabio_1 | "KeyPath": "", fabio_1 | "ClientCAPath": "", fabio_1 | "CAUpgradeCN": "", fabio_1 | "Refresh": 0, fabio_1 | "Header": null fabio_1 | }, fabio_1 | "StrictMatch": false, fabio_1 | "TLSMinVersion": 0, fabio_1 | "TLSMaxVersion": 0, fabio_1 | "TLSCiphers": null fabio_1 | }, fabio_1 | "Color": "light-green", fabio_1 | "Title": "", fabio_1 | "Access": "rw" fabio_1 | }, fabio_1 | "Runtime": { fabio_1 | "GOGC": 800, fabio_1 | "GOMAXPROCS": 1 fabio_1 | }, fabio_1 | "ProfileMode": "", fabio_1 | "ProfilePath": "/tmp" fabio_1 | } fabio_1 | 2017/11/21 04:41:25 [INFO] Version 1.5.3 starting fabio_1 | 2017/11/21 04:41:25 [INFO] Go runtime is go1.9.2 fabio_1 | 2017/11/21 04:41:25 [INFO] Metrics disabled fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOGC=800 fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOMAXPROCS=1 fabio_1 | 2017/11/21 04:41:25 [WARN] Error initializing backend. Get http://10.9.10.89:8500/v1/agent/self: dial tcp 10.9.10.89:8500: getsockopt: connection refused fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Connecting to "10.9.10.89:8500" in datacenter "dc1" fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server access mode "rw" fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server listening on ":9998" fabio_1 | 2017/11/21 04:41:25 [INFO] Waiting for first routing table fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using dynamic routes fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using tag prefix "urlprefix-" fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Watching KV path "/fabio/config" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Manual config changed to #3821244 fabio_1 | 2017/11/21 04:41:34 [INFO] HTTP proxy listening on :9999 fabio_1 | 2017/11/21 04:41:34 [INFO] Access logging disabled fabio_1 | 2017/11/21 04:41:34 [INFO] Using routing strategy "rnd" fabio_1 | 2017/11/21 04:41:34 [INFO] Using route matching "prefix" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Health changed to #3821756 fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with id "fabio-vagrant-ubuntu-trusty-9998" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with address "10.9.10.89" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with tags "" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with health check to "http://[10.9.10.89]:9998/health" fabio_1 | 2017/11/21 04:41:35 [INFO] Config updates fabio_1 | + route add test /test http://10.9.2.236:23421/ fabio_1 | 2017/11/21 04:41:35 [INFO] consul: Health changed to #3821762 fabio_1 | 2017/11/21 04:41:40 [INFO] consul: Health changed to #3821765 fabio_1 | 2017/11/21 04:41:42 [INFO] Config updates fabio_1 | + hello-docker /hello-docker http://10.9.10.89:54917/ fabio_1 | + route add 我们可以查看 Consul UI 中的服务是否运行正常: 或者查看 Fabio UI 中的服务是否存在(通过健康检查后会出现): YAML 配置命令 配置 说明 build 指定 Dockerfile 所在的目录地址,用于构建镜像,并使用此镜像创建容器,比如上面配置的build: . command 容器的执行命令 dns 自定义 dns 服务器 expose 暴露端口配置,但不映射到宿主机,只被连接的服务访问 extends 对docker-compose.yml的扩展,配置在服务中 image 使用的镜像名称或镜像 ID links 链接到其它服务中的容器(一般桥接网络模式使用) net 设置容器的网络模式(四种:bridge,none,container:[name or id]和host) ports 暴露端口信息,主机和容器的端口映射 volumes 数据卷所挂载路径设置 Docker Compose 常用命令 命令 说明 docker-compose build 构建项目中的镜像,--force-rm:删除构建过程中的临时容器;--no-cache:不使用缓存构建;--pull:获取最新版本的镜像 docker-compose up -d 构建镜像、创建服务和启动项目,-d表示后台运行 docker-compose run ubuntu ls -d 指定服务上运行一个命令,-d表示后台运行 docker-compose logs 查看服务容器输出日志 docker-compose ps 列出项目中所有的容器 docker-compose pause [service_name] 暂停一个服务容器 docker-compose unpause [service_name] 恢复已暂停的一个服务容器 docker-compose restart 重启项目中的所有服务容器(也可以指定具体的服务) docker-compose stop 停止运行项目中的所有服务容器(也可以指定具体的服务) docker-compose start 启动已经停止项目中的所有服务容器(也可以指定具体的服务) docker-compose rm 删除项目中的所有服务容器(也可以指定具体的服务),-f:强制删除(包含运行的) 本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/docker-compose.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册