浅谈Docker如何自定义host文件

目录
  • 一、命令
  • 二、docker-compose.yml
  • 三、dockerfile
  • 四、直接修改
  • 五、修改镜像
  • 总结

1、问:我们的真正开发的时候数据库都是部署在内网的,而我们程序连接数据库的时候,需要指定内网的地址。但是有时候我们需要迁移环境,那么我们的后端代码就得跟着进行修改,有没有一种好的办法,不让我们修改代码吗?

答:可以肯定的说是有的,那就是在代码中指定的不是IP地址,而是域名。我们只需要配置域名和IP地址建立映射关系,所有的项目都无需更改代码就可以达到目的。

2、问:正式环境一般都是集群的形式,至少三台服务器,我们需要买三个域名吗?而且域名只能绑定公网IP,我们能把数据库公开到外网吗?为了安全,没人会把数据库公开到外网的。那该怎么办呢?

答:那就是修改host文件,在host自定义我们的域名和数据库集群的内网IP。在物理机linux上,直接修改/etc/host文件即可。

如果我们的服务以docker的形式部署在linux上。那么docker中的host怎么修改呢?

一、命令

一般正式环境的镜像都是提前编译好的,如果不是采取docker-compose编译的镜像,很难修改host,所以我们只能在启动的时候通过参数配置。

docker run --add-host=www.scalerwang.com:192.168.1.100 --add-host=blog.scalerwang.com:192.168.1.200 --name wangscaler -it mydocker

使用命令参数指定--add-host

二、docker-compose.yml

在yml中指定,编译的docker容器自动配置host文件,yaml相关内容如下

services:
  service-nginx:
    image: nginx
    extra_hosts:
    - "www.scalerwang.com:192.168.1.100"
    - "blog.scalerwang.com:192.168.1.200"

三、dockerfile

dockerfile没有直接的参数可以直接修改host文件,如果想通过dockerfile修改host文件,需要事先准备好host文件放在你的代码根目录下

MAINTAINER WangScaler@163.com
ADD / /wangscaler
RUN cat /wangscaler/hosts >> /etc/hosts

如此也是可以的。

四、直接修改

如果你不嫌费劲的话,可以试试。当然如果你的程序以后台启动,你环境不对启动不起来的话,你也不能进去修改。
这个方法一是累人(集群数量越多越累),二是不适用(docker没这个正确的host跑不起来,还有可能你设置的域名正是别人的,那就向人家发起请求了)。

五、修改镜像

如果你的项目以docker的形式部署,往往都是先通过dockerfile、docker-compose编译成镜像。这时候你可以把镜像拉下来,修改完host再重新推上去覆盖原来的镜像。

总结

最好用的方法就是前两种,省时省力,一次性搞定。如果你是dockerfile编译的镜像,就选第一种;如果你是docker-compose编译的就直接再docker-compose.yml修改好,一劳永逸。第三种也是可以接受的,但是后两种你就当不知道,不要尝试去做。
Docker的更多使用方法,比如创建容器时指定IP地址、以及上述所提到的dockerfile和docker-compose创建容器的方式等等,请参考往期文章Docker的搭建及基本命令。

到此这篇关于浅谈Docker如何自定义host文件的文章就介绍到这了,更多相关Docker自定义host文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker每次启动容器,IP及hosts指定的操作

    前言 每次在使用Docker启动Hadoop集群的时候,都需要重新绑定下网卡,固定IP,同时修改/etc/hosts文件,非常麻烦,于是想探寻下原因及优化. 一.原因 /etc/hosts, /etc/resolv.conf和/etc/hostname,容器中的这三个文件不存在于镜像,在启动容器的时候,通过mount的形式将这些文件挂载到容器内部.因此,如果在容器中修改这些文件的话,修改部分不会存在于容器的top layer,而是直接写入这三个物理文件中. 为什么重启后修改内容不存在了?原因是:

  • Docker网络之单host网络及使用案例

    前言 前面总结了Docker基础以及Docker存储相关知识,今天来总结一下Docker单主机网络的相关知识.毋庸置疑,网络绝对是任何系统的核心,他在Docker中也占有重要的作用. 一.Docker默认网络 在新安装docker的主机上执行 docker network ls 便能看到docker默认安装的所有网络,分别是none网络.host网络和bridge网络. 1.1 none 网络 none网络就是什么都没有的网络.挂在这个网络下的容器除了lo,没有其他任何网卡.容器run时,可以通

  • Docker出现Cannot connect to the Docker daemon. Is the docker daemon running on this host错误解决办法

    Docker出现Cannot connect to the Docker daemon. Is the docker daemon running on this host错误解决办法 发生现象: ubuntu15下,安装完Docker后,运行docker images 报错Cannot connect to the Docker daemon. Is the docker daemon running on this host? 如下图 图 原因分析: 目前我遇到这个问题是两个原因造成的,一个

  • docker 容器自定义 hosts 网络访问操作

    在 docker-compose.yml 中增加 extra_hosts 关键字就可以将数据写入到容器的 /etc/hosts. extra_hosts 添加主机名映射. extra_hosts: "somehost:162.242.195.82" "otherhost:50.31.209.229" 将会在/etc/hosts创建记录: 162.242.195.82 somehost 50.31.209.229 otherhost 注意: 如果指向的是本机,不要写容

  • docker容器中无法获取宿主机hostname的解决方案

    在nodejs环境中测试通过,其它语言同理,只需要使用获取环境变量的方法即可. 思路: docker容器和宿主机环境是隔离的,但是可以在启动docker容器时将宿主机的主机名以环境变量的形式传入,代码在容器中获取该值即可. 操作: docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # 使用-e 参数传入环境变量,值为主机名 如果使用yml文件启动: version: '3' services: mys

  • 浅谈Docker如何自定义host文件

    目录 一.命令 二.docker-compose.yml 三.dockerfile 四.直接修改 五.修改镜像 总结 1.问:我们的真正开发的时候数据库都是部署在内网的,而我们程序连接数据库的时候,需要指定内网的地址.但是有时候我们需要迁移环境,那么我们的后端代码就得跟着进行修改,有没有一种好的办法,不让我们修改代码吗? 答:可以肯定的说是有的,那就是在代码中指定的不是IP地址,而是域名.我们只需要配置域名和IP地址建立映射关系,所有的项目都无需更改代码就可以达到目的. 2.问:正式环境一般都是

  • 浅谈docker compose书写规则

    本文对集群部署相关的一概不做介绍 版本约束 Docker Engine >= 19.03 Docker Compose >=3.8 结构介绍 docker-compose.yaml 文件结构主要由 version # docker compose版本 networks # 网络,用于docker容器内部通讯 x-{name} # 模版命名规则 以x-开头 用于复用 volumes # 挂载卷 services # 服务模块,内部定义容器信息 其内部参数相当于docker run时的参数 模块介

  • 浅谈ASP.NET Core静态文件处理源码探究

    前言 静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接处理接收到的静态文件处理而不需要经过应用程序池处理,所以很多情况下对于静态文件的处理程序本身是无感知的.ASP.NET Core则不同,作为Server的Kestrel服务是宿主到程序上的,由宿主运行程序启动Server然后可以监听请求,所以通过程序我们直接可以处理静态文件相关.静态文件默认存储到项目的ww

  • 浅谈lumen的自定义依赖注入

    比如我现在有个token认证系统,目前我用mysql的token表实现,将来有可能会改成redis,怎么实现未来的无缝连接呢. 先定义一个合约文件app/Contracts/TokenHandler.php <?php namespace App\Contracts; /** * 处理Token的Contracts * @package App\Contracts */ interface TokenHandler { /** * 创建一个token * @param $userId integ

  • 浅谈docker学习之docker数据卷(volume)

    1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们需要明确Docker内的文件系统是如何工作的.Docker镜像被存储在一系列的只读层.当我们开启一个容器,Docker读取只读镜像并添加一个读写层在顶部.如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层.在读写层中的旧版本文件隐藏于该文件之下,但并没有被不破坏 - 它仍然存在于镜像以下.当Docker的容器被删除,然后重新启动镜像时,将开启一个没有任何更改的新的容器 - 这些更改会丢失

  • 浅谈docker --privileged=true参数作用

    大约在0.6版,privileged被引入docker. 使用该参数,container内的root拥有真正的root权限. 否则,container内的root只是外部的一个普通用户权限. privileged启动的容器,可以看到很多host上的设备,并且可以执行mount. 甚至允许你在docker容器中启动docker容器. $ docker help run ... --privileged=false Give extended privileges to this container

  • 浅谈SpringBoot如何自定义Starters

    一.Starters原理 1.1 Starters场景启动器 1.场景需要用到的依赖是什么? 比如依赖的jar 2.如何编写自动配置? 以WebMvcAutoConfiguration自动配置为例: @Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) @Conditiona

  • 浅谈PHP命令执行php文件需要注意的问题

    require_once '/data/web/fewfawef/wwwroot/Public/queenchuli/common/mysql.php'; 里面必须要写绝对路径 写死 才行哈 这样就不会出错了 以上这篇浅谈PHP命令执行php文件需要注意的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 浅谈php fopen下载远程文件的函数

    如下所示: //下载附件 function get_file($url, $folder = "./") { set_time_limit (24 * 60 * 60); // 设置超时时间 $destination_folder = $folder . '/'; // 文件下载保存目录,默认为当前文件目录 if (!is_dir($destination_folder)) { // 判断目录是否存在 mkdirs($destination_folder); // 如果没有就建立目录

  • 浅谈终端直接执行py文件,不需要python命令

    然后给脚本文件运行权限, 方法(1)chmod +x ./*.py 方法(2)chmod 755 ./*.py (777也无所谓啦) 这个命令不去调整,会出现permission denied的错误 终端直接执行. 如果在脚本内容的开头已经给出了类似于如下的注释: #!/usr/bin/env python(或者是 #!/usr/bin/python) 那就可以直接在终端里运行: ./*.py 如果没有这个注释 就在终端中执行: python ./*.py (注意:有些linux版本上运行即使上

随机推荐