简介

之前使用Docker 都是手动去操作单个容器 比如: 编写DockerFile 手动执行 build run 等操作, 这样的弊端是如果我们有很多服务的话一个一个的执行会很麻烦
所以使用Docker Compose来轻松高效的管理容器, 可以定义运行多个容器.

Docker Compose 特性

  • 定义, 运行多个容器.
  • YAML file 配置文件.
  • docker-compose 命令.

自己理解

compose是docker官方开源的项目, 需要安装.
比如有一个 web服务 我们需要安装 nginx, php, mysql, redis 多个容器,我们使用DockerFile一个一个的去写, 一个一个的去运行命令会非常的麻烦.

安装 docker-compose

  • 官方提供的GitHub地址太慢,这里使用国内的镜像: 地址
  • 安装完成使用命令 docker-compose version 有版本信息表示安装成功

快速上手

  1. 创建应用 app.py
  2. Dockerfile 应用打包成镜像
  3. docker-compose yaml文件 定义整个服务(所需的环境)
  4. 启动compose项目

流程

  1. 创建网络
  2. 执行 docker-composer yaml
  3. 启动服务

docker-compose 配置编写规则

yaml 规则

#  yaml 有三层

version '' # 1.版本 对应docker版本
service '' # 2.服务
    服务1 : web
        # 服务配置
        image
        build
        network
    服务2 : redis
    .....

# 3.其他配置 网络/卷/全局规则
volumes:
networks:
configs:    

理解Docker0网卡

29684-tr2gsst6iqp.png

问题: docker 是如何处理容器网络访问的?

  • 我们通过命令查看某一个容器的内部ip 可以看出容器内部的ip和docker0网卡是在同一网段的
  • 并且宿主机和容器之间是可以相互ping通的
docker exec -it tomcat1 ip addr

77598-5q4381v46rc.png

原理

  • 每启动一个容器, docker就会给容器分配一个ip. 只要安装了docker 就会有一个docker0的网卡
  • docker0的网卡和真实的物理网卡之间是桥接模式
  • 使用的技术是 evth-pair技术

evth-pair 技术

  • 当我们启动容器的时候就会生成一对网卡
  • evth-pair 就是一对虚拟设备接口, 他们都是成对出现的 一段连着协议, 一段彼此相连
  • 有了这种特性 evth-pair 充当一个桥梁,连接各种虚拟设备

24034-yds8lzhwgkq.png
06812-rqz8sfmlcps.png

画图理解

75492-to9cuhy2v9.png

结论

  • tomcat01 和 tomcat02 是公用一个路由器 docker0
  • 容器在不指定网络的情况下, 都是走docker0 路由的 docker会给容器分配一个默认的ip
  • Docker中所有的网络接口都是虚拟的
    93211-0tos63kx77z.png

容器互联 --link

  • 通过上面我们会发现容器之间可以通过ip地址是可以ping通的
  • 那么再某些情况下不用ip 我们可不可以用容器名的方式 ping通?
  • 可以使用 --link 来解决上面的问题
# 我们重新启动一个tomcat 并且 --link tomcat1
docker run -d -P --link tomcat tomcat

# 完成之后我们就可以ping通了
docker exec -it jovial_chebyshev ping tomcat1

PING tomcat1 (172.17.0.4) 56(84) bytes of data.
64 bytes from tomcat1 (172.17.0.4): icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from tomcat1 (172.17.0.4): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from tomcat1 (172.17.0.4): icmp_seq=4 ttl=64 time=0.069 ms
--- tomcat1 ping statistics ---
  • 这样做有一个弊端就是 反向 ping 是不通的
  • 原理就是在 jovial_chebyshev 容器中的 /etc/host 中有写
docker exec -it jovial_chebyshev cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.4    tomcat1 612aeb07e2e7
172.17.0.2    e7613df5b961
  • --link 就是在我们 hosts 中增加了一条虚拟域名

自定义网络

查看所有的docker网络

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ea834618e218        bridge              bridge              local
2da75ecdb782        host                host                local
d7c3fa26b1bd        none                null                local

网络模式

  • bridge : 桥接模式(docker默认)
  • none : 不配置网络
  • host : 和宿主机共享网络
  • container : 容器网络连通(用的少, 局限很大)

创建自定义网络

  • --subnet 子网
  • --gateway 网关
  • --driver 默认桥接模式 不写也可以
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

查看自己创建的网络

  • 命令: docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "6eb44c49b01928fd5c010c72c2738980814855e372a215eac422d35bdb1c70c4",
        "Created": "2020-09-22T05:58:08.319032125Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

使用自己创建的网络

  • --net
docker run -d -P --net mynet --name tomcat-net-01 tomcat
再次测试
  • 使用自己的网络创建两个容器并且相互ping 都是可以ping通的
  • 比之前的 --link 要好很多
docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.063 ms

#反向ping 也是可以的
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.078 ms

网络连通

容器在不同的网段内如何实现互通?

示意图

13263-x84wd8oss4.png

  • 我们会发现不同网段的容器不能ping通的.
docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
  • 所以需要使用 --network connect 命令

连通

docker network connect mynet tomcat01

查看

docker network inspect mynet

[
    {
        "Name": "mynet",
        .....
        .....
        ...
        "Containers": {
            "0796e3b7250d5c49372183e28266de528dfe072bb884220aeff9f0ccab4521a7": {
                "Name": "tomcat-net-01",
                "EndpointID": "e53cde49134bf3fb72f9bcd801ac73e208705b8cae416b689a726511b1125d49",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "2a187f1b05a15d33c5cc382c2b84d0b93fa4748f3e2ce4daed0ca0bc7a4d0500": {
                "Name": "tomcat01",
                "EndpointID": "652193a8312425944682a4b48f2f1a1d35ec5e4cea6806fbe0d5be11380627e8",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
           .....
        },
        "Options": {},
        "Labels": {}
    }
]
  • 连通之后我们可以看到 tomcat01 容器直接放到了 mynet的网络下
  • 这就是一个容器两个ip地址
  • 这样我们就可以ping通了
docker exec -it tomcat01 ping tomcat-net-01

PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.074 ms

DockerFile 介绍

  • dockerfile 是用来构建docker镜像的文件, 命令参数脚本.

DockerFile 构建过程

基础知识

  • 每个保留关键字(指令) 都必须是大写字母
  • 从上到下的执行顺序
  • 每一个指令都会创建提交一个新的镜像层, 并提交

DockerFile 指令

FROM        # 基础镜像, 所有的东西都从这里开始
MAINTAINER  # 镜像作者 姓名+邮箱
RUN         # 镜像构建的时候需要运行的命令 
ADD         # 需要加入的内容 比如 mysql, nginx, Ubuntu 等
WORKDIR     # 镜像的工作目录
VOLUME      # 挂载目录
EXPOSE      # 暴露端口配置
CMD         # 指定这个容器启动的时候要运行的命令, 只有最后一个会生效, 可被替代
ENTRYPOINT  # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD     # 当构建一个被继承 DockerFile 这个时候需要这个命令
COPY        # 将我们的文件拷贝到镜像中
ENV         # 构建的时候设置环境变量

使用 DockerFile 构建 dnmp

todo ....

发布镜像到 DockerHub

前提条件

  1. 注册docker账号
  2. 在终端登录上自己的账号 命令: docker login

发布命令

docker push 作者名字/镜像名字:标签名字

为什么要理财

  1. 平衡一生收支的差距
    一个人一辈子可以赚取收入的年岁有限. 即便能力超凡之人, 也可能面临时运不济、收入骤减状况. 如被迫下岗待业或营运不佳导致收入减少或中断;或因天之不测风云、人之旦夕祸福冲击造成收入减少或中断, 支出却增加.

所以一定要理财的第一个重大理由就是:通过理财妥善规划安排个人家庭财务状况, 以能"平衡一生收支的差距" 保障将来老有所养, 自己晚年的生活独立, 富足.

  1. 对抗通货膨胀
    从近3至5年的货币走势来看, 钱是逐渐贬值的, 官方公布的年CPI(消费者物价指数)在2~3%, 换个说法即通账率是2~3%, 即如果钱放在手上不动, 在第二年要贬值2个百分点, 按价值等量关系, 今年100元的东西, 明年要102或103元才能买到等价值的东西, 何况实际情况远非官方公布的数据这么低.

大家都感觉到钱一年不如一年值钱, 尤其在房价表现得尤为明显. 要使自己手中的钱不像夏天的冰棍那样易化, 最起码要跑赢通货膨胀.

  1. 财务自由
    终极目标, 尽可能的达到或者要有睡后税收入, 也就是不靠出卖劳动力、时间等去赚钱 所谓的财务自由就是非工资收入大于总支出 财务自由=被动收入>花销

被动收入: 你什么都不需要做这个钱也会自己到账
举例: 假如每个月有3000元的被动收入 而你的月支付是2500元, 那你已经达到了财富自由的状态.

本金问题

  • 买理财或者基金不要去赌
  • 假如说有 100W本金 年收益率有10% 那么就有10W的被动收入 10% 是个保险做法
  • 假如有 10W本金 想要有10W的收益 那么就得有100%的年收益率 这个就是有极大的风险的

为什么说普通人适合基金投资

普通人的投资渠道

  1. 银行存款或余额宝等
  2. 证券投资:股票
  3. 房地产投资
  4. 支付宝理财
  5. 基金

银行存款

  • 收益率太低这是主要原因, 目前银行,余额宝等年利率在 1.5% 左右
  • 10W * 1.5% = 1500 收益太低, 跑不赢通货膨胀

股票

  • 上手门槛高, 选股难 等
  • 波动率大, 一个涨停或者跌停就是10%
  • 技术性太高, 一般人承受不了.

房地产投资

  • 门槛高
  • 收益兑现难
  • 而且现在已经不是炒房的最好时机了

支付宝理财

  • 比较稳定, 亏的几率很小但是同时收益也小, 可能比银行高一点

基金

  • 以上的问题, 基金都可以很好的解决
  • 想要收益高就配置指数型基金, 股票型基金, 混合型基金
  • 想要稳点 就配置货币基金, 纯债基金

认识基金

基础知识

  1. 债券: 付息还钱 也就是有人向你借钱, 还钱的时候需要还利息和本金
  2. 股票: 不还钱, 但共同分享公司的成果 假如买了10W元的股票 100股 这个公司赚钱了股票升值了, 需要抛售股票来赚取中间的差价
  3. A股: 中国境内发行的股票, 看国运 也是看今年国家发展的怎么样
  4. 指数: 通常一家公司发现一只股票, 很多家公司就会有很多只股票, 这些股票成群结队,就组成了不同的指数
  5. 大盘: 上证指数, 在上海交易所上市发行的所有股票的组合
  6. 小盘: 中证500指数 选取了500家中小公司的股票组合
  7. 基金: 基金就是基金公司拿我们的钱, 去投资帮我们买股票,债券等 帮助我们打理 比较出名的基金公司: 天弘, 富国, 华夏等 千万不要找p2p的公司
货币基金
  1. 货币基金是聚集社会闲散资金, 由基金管理人运作, 基金托管人保管资金的一种开放式基金, 专门投向风险小的货币市场工具, 区别于其他类型的开放式基金, 具有高安全性、高流动性、稳定收益性, 具有“准储蓄”的特征
  2. 开放式的 可以随时买和随时卖, 就像支付宝的余额宝一样
  3. 比较稳健, 可以购买一些债券基金避免风险
短债基金

todo...

分辨需要设置的代理

HTTP 形式:

git clone https://github.com/xxx/git.git

SSH 形式:

git clone git@github.com:xxx/git.git
HTTP 代理
git config --global http.proxy http://127.0.0.1:8080
git config --global https.proxy http://127.0.0.1:8080
socks5 代理(如 Shadowsocks)
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080

取消设置

git config --global --unset http.proxy
git config --global --unset https.proxy
只对 github 进行代理, 对国内的仓库不影响, 可以这样设置
git config --global http.https://github.com.proxy https://127.0.0.1:1080
git config --global https.https://github.com.proxy https://127.0.0.1:1080