为什么要使用docker

  • 依赖管理
  • 快速移植,不需要手动安装依赖
  • 例如Java需要jvm的依赖
  • 开发和生产环境一致性
  • 资源隔离
  • 保持机器整洁
  • 避免一个程序修改的环境变量,启动脚本等影响其他程序
  • 减少因为端口等资源被占用导致的错误
  • 安全
  • 避免恶意程序影响其与程序
  • 限制程序的资源占用(CPU,内存),避免物理机崩溃

储存卷

  • 环境变量和储存卷实现“多态”
  • 密码等配置数据不用插入镜像中,而是通过环境变量或者配置文件动态载入
  • 使得镜像可以复用
  • 绑定挂载卷
  • 把宿主机器上的文件或目录映射到容器中,避免不必要的拷贝
  • 必须都为绝对路径
  • 可以只挂载单个文件
  • -v /path/file: /path/file
  • 可以设置为只读,避免容器的修改
  • 管理卷
  • 不必指定宿主机器上的目录位置,docker会自动创建对应目录
  • 只能绑定目录,而不是文件
  • 可以通过docker inspect -f “{{json .Mounts}}” <container>查看对应的主机路径
  • 共享储存卷
  • –-volumes-from <container>参数可以共享储存卷
  • 不能更改原来绑定的路径,以及读写权限
  • 可以通过在数据卷中使用cp命令复制到指定路径
  • 如果从多个容器共享,且他们拥有相同给的挂载点,则只会共享最后一个
  • 比如共有相同的配置文件路径
  • 如果一个数据卷容器有多个挂载路径,那么某一个路径冲突的概率就会增加,所以最好一个数据卷一个挂载
docker run --name devConfig -v /config <image> bash -c "cp /dev/* /config/"
docker run --name prodConfig -v /config <image> bash -c "cp /prod/* /config/"

docker run --name devApp --volumes-from devConfig <image>
docker run --name prodApp --volumes-from prodConfig <image>

网络

dockerfile启动nacos时开启登录验证命令怎么写_IP

  • 虽然上图两个joined容器所在的网络和默认bridge网络存在连接,但是仍然无法通信
  • 因为iptables DROP掉了网桥 docker0 与自建网络之间双向的流量
  • docker在设计时就是想隔离不同网络
  • https://yq.aliyun.com/articles/311450?spm=a2c4e.11155435.0.0.7bee216fWZYjAs
  • 容器默认可以访问外网,只是外网默认不能访问容器
  • 容器通过-P或者-p参数启动连接时,默认连接地址为0.0.0.0,即接受所有地址的流量
  • 可以通过显式设置地址来指定允许访问的IP地址
  • docker服务端会启动一个虚拟网卡(docker 0)
  • 这个接口相当于一个网卡,拥有独立的IP地址(ifconfig可以查到),使得容器可以和外部网络通信
  • 所有bridge模式的容器都被挂载到了docker0的子网中
  • 所有连接到docker 0 的接口都是同一个虚拟子网的一部分,可以通过IP地址互相通信
  • 问题在于如何方便得知道对方的IP,这就需要--link或者加入同一自定义网络了
  • docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名通信
  • 使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的
  • 如果-p 1234:5678,容器之间访问5678端口,外部服务访问1234端口
  • 因为容器之间属于同一个局域网中,而外部服务访问是通过NAT转换的
  • 可以通过设置-icc-false禁止容器间通信
  • 每个容器都有一个本地回环接口(localhost或127.0.0.1)
  • 这样本机程序可以通过套接字通信
  • docker利用NAT实现与外网的通信
  • 容器使用-p指定映射的端口时,docker会通过iptables创建一条nat规则,把宿主机打到映射端口的数据包通过转发到docker0的网关,docker0再通过广播找到对应ip的目标容器,把数据包转发到容器的端口上

dockerfile启动nacos时开启登录验证命令怎么写_IP_02



  • 每一个映射的端口,host 都会启动一个 docker-proxy 进程来处理访问容器的流量

dockerfile启动nacos时开启登录验证命令怎么写_环境变量_03

  • link原理
  • 在接受容器(即设置了link参数的容器)中保存了设置了以下信息:
  • 设置环境变量:源容器的名称、别名、IP、暴露的端口等
  • 如果源容器重启后更换了IP,接受容器的环境变量并不会更新
  • 更新/etc/hosts文件:添加源容器IP和别名的记录
  • 源容器重启后会自动更新接受容器的 /etc/hosts文件
  • 接收容器必须在源容器后启动
  • 这只针对位于默认网络中的容器
  • 自定义网络中可以先定义接收容器
  • 实际上自定义网络中的link不是通过配置 /etc/hosts文件实现的,而是通过DNS解析