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

前言

每次在使用Docker启动Hadoop集群的时候,都需要重新绑定下网卡,固定IP,同时修改/etc/hosts文件,非常麻烦,于是想探寻下原因及优化。

一、原因

/etc/hosts, /etc/resolv.conf和/etc/hostname,容器中的这三个文件不存在于镜像,在启动容器的时候,通过mount的形式将这些文件挂载到容器内部。因此,如果在容器中修改这些文件的话,修改部分不会存在于容器的top layer,而是直接写入这三个物理文件中。

为什么重启后修改内容不存在了?原因是:每次Docker在启动容器的时候,通过重新构建新的/etc/hosts文件,这又是为什么呢?原因是:容器重启,IP地址为改变,hosts文件中原来的IP地址无效,因此理应修改hosts文件,否则会产生脏数据。

二、解决办法

在每次启动容器的时候指定IP、hostname、往/etc/hosts里添加hosts,命令如下:

docker run -itd --name hadoop0 --hostname hadoop0 --net network_my --ip 192.168.10.30 --add-host hadoop1:192.168.10.31 --add-host hadoop2:192.168.10.32 -d -P -p 50070:50070 -p 8088:8088 hadoop:master

Docker 网络模式及配置的操作

--hostname :指定hostname;
--net : 指定网络模式
--ip:指定IP
--add-host :指定往/etc/hosts添加的host

以上命令需要docker1.9以上版本才行;

启动完容器后,进入容器查看 /etc/hosts

[root@centos-linux-7 /]# docker exec -it hadoop0 bash
[root@hadoop0 /]# 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
192.168.10.31 hadoop1
192.168.10.32 hadoop2
192.168.10.30 hadoop0
[root@hadoop0 /]#

上述命令太长,可写成shell脚本,另外网上有说其它几种方式:

1、使用dockerfile构建镜像

2、使用docker-compose启动

3、修改docker容器启动公共加载的环境变量的配置文件(我没找到我这个版本的该配置文件)

第一种方式应该是不行的,虽然dockerfile在构建镜像时能设置相关环境变量,但前面提到过IP、hostname、/etc/hosts都是重新加载的,所以得在docker容器启动的时候指定,镜像里的都是不行的;

第二种,本人暂时对docker-compose不熟悉,也暂时不深入探讨;

第三种,本人感觉不方便,因为那是公共的,对于不同容器,无法个性化;

综上所述,本人觉得在容器启动的时候,通过命令行指定最方便,但缺点是命令行太长,不过写成shell脚本就行啦!

补充:linux docker 设置固定容器IP(docker默认 容器ip会变解决)

一、创建自己的网络类型并指定网段

命令

docker network create --subnet=172.18.0.0/16 mynetwork

二、镜像启动运行时指定自己的网络IP

命令

docker run -itd -p 5001:5001 --name 镜像名称 --net mynetwork --ip 172.18.0.2 --privileged=true --restart=always -d 镜像名称

三、重启docker、查看容器IP

重启dockers

命令

service docker restart

查看所有容器

命令

docker ps -a

查看容器信息

命令

docker inspect 容器名称

这样容器IP就不会变了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 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 容器自定义 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容器访问宿主机的MySQL操作

    背景: 有一个flask项目提供接口,使用docker容器构建并且运行,MySQL在宿主机运行,需要在容器中可以让flask连接上宿主机的mysql 使用ifconfig命令可以看到,有一个docker0和eth0,在docker容器中可以通过eth0的IP地址加上端口号(3306)这样就可以连接上宿主机的MySQL了:另外,nginx可以通过docker0的IP地址加上构建容器时指定的端口号进行访问容器. 补充:docker的mysql容器运行正常,但是宿主机却连不上数据库,解决方法来啦 do

  • 浅谈Docker run 容器处于created状态问题

    在最近遇到的一次问题中,有这样一种现象: 系统有一个测试脚本会不断的执行docker run命令来运行容器,在测试过程中发现有一个情况是,有时候容器没有完全被运行到"Up"状态,而是处于"created"状 态,现象十分奇怪. 上环境首先查看了"created"状态的容器,以及dockerd日志: (1) dockerd的日志中只有"post create"请求,但是居然没有收到该容器的"post start&quo

  • Docker容器从镜像恢复代码的操作步骤

    有时候代码丢失了需要从容器运行的镜像中恢复出所需代码,此时仅需在容器运行的服务器进行简单的几步操作,就能提取出打包镜像时使用的代码 查看所有容器: docker container ls -a 根据容器id进入到指定容器: docker exec -ti id /bin/bash 拷贝容器内目录到服务指定文件夹: docker container cp id:/usr/local/tomcat/webapps/province-admin /home/test/province-admin 经过

  • 解决docker容器重启之后/etc下某些配置文件被重置的问题

    1. /etc/hosts, /etc/resolv.conf和/etc/hostname容器中的这三个文件不存在于镜像,而是存在于于/var/lib/docker/containers/,在启动容器的时候,通过mount的形式将这些文件挂载到容器内部. 因此,如果在容器中修改这些文件的话,修改部分不会存在于容器的top layer,而是直接写入这三个物理文件中. 2.为什么重启后修改内容不存在了? 原因是:每次Docker在启动容器的时候,通过重新构建新的/etc/hosts文件,这又是为什么

  • docker logs-查看docker容器日志的实现

    通过docker logs命令可以查看容器的日志. 命令格式: $ docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) --tail string 从日志末尾显示多少行日志, 默认是all -t, --timestamps 显示时间戳 --until string 显示自某个timest

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

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

  • docker已启动容器修改添加端口映射的两种方法

    目录 简述 一.先提交,在配置 1.先将容器提交为镜像 2.创建新的容器并运行 二. 修改配置文件 1.关闭docker服务 2.修改hostconfig.json 3.修改config.v2.json 4.重启 docker服务 5.查看配置项已经修改成功 补充:docker容器怎么开端口 总结 简述 正常情况下,在你创建容器时可以添加多个端口映射,写法如下 每个端口映射都加一个-p docker run -itd --name centos -p 4000:8081 -p 3306:3306

  • Docker 镜像和容器的区别详解

    最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层

  • 解决docker run 或者 docker restart 启动镜像就自动退出

    执行命令:docker run --name centos8 -d centos /bin/bash,通过docker ps查看正在运行中容器,找不到centos8. 通过docker ps -a查看发现,centos8容器已经处于停止状态了 [root@MiWiFi-R4A-srv server]$ docker run --name centos8 -d centos /bin/bash a770630ca865b3c3346a321a383f302ed22af9281be8482f4f4d

  • Docker为网络bridge模式指定容器ip的方法

    前言 众所周知bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace.设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上.下面来看看Docker为网络bridge模式指定容器ip的方法. 实现方法 如果只是简单创建一个bridge模式的网络是无法给容器指定ip的 [root@vultrvpn conf.d]# docker network create --driver bridge wordpress_net ad1ff3d972

  • docker 创建容器时指定容器ip的实现示例

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定. 在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的. 我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可. 查看网络模式 docker network ls 创建一个新的bridge网络 docker network create --driver bridge --subnet=172.18.12.0/16 --gatewa

  • docker for windows 容器内网通过独立IP直接访问的方法

    Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 2.宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口 但在实际使用中并不是很方便. 以下在win10环境中队DockerDocker容器通过独立IP暴露给局域网的方法进行记录. Docker的默认启动方式中,会产生一块虚拟网卡,然后容器内自行分配单独的网卡和IP.

  • WIN10系统和Docker内部容器IP互通方式

    1.安装了Window版本的Docker之后,我们启动 Docker Quickstart Terminal ,我们会得到一个IP,我的为: 192.168.99.100 2.启动一个mysql镜像,并获取这个镜像的IP: 在开始的时候,从本机直接到172.17.0.2是网络不通的,但是我们本机能到 192.168.99.100,172.17.0.2到192.168.99.100也是通的,我们可以在本机配置一个到172.17.0.2通过192.168.99.100的路由: route add -

  • Docker如何进入启动容器

    本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作. 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等. 1.attach命令 attach命令是Docker自带的命令,命令格式为: docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[=true]] Container

随机推荐