注意: 给运行中的容器 做 端口映射!(修改容器的 容器ID 和 IP地址)

文章目录

      • 前言:
        • 方法1: 使用 commit 结合 docker run
        • 方法2:修改该容器的配置文件(不推荐):
        • 方法3、使用 iptables 规则 :

       


       

看这里:

        戳此链接 通往 关于 Docker 所有的学习文章 !


 

前言:

        我们知道,在我们 run a Container 的时候,可以使用 -P(随机端口映射) 或 -p(指定端口映射);那么这是 run 容器的时候做的,那么我们如果给一个运行中的容器做端口映射呢?

        首先排除 docker run ,因为docker run 每执行一次就会创建一个 新的容器,跟我们之前旧的容器没有任何关系!还有 docker update 也只是更新容器中 mem、cpu 限制的配置。 并没有针对端口做更新!

        当前,并没有直接使用 docker command 可以实现针对:运行容器中 端口映射的更改!但是不代表无法实现!
 

看一下 docker run 时 -P 和 -p 的用法:

docker run -P :

root@zhengzelin:~#  docker run -itd -P nginx:latest 
root@zhengzelin:~#  docker ps
CONTAINER ID      IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
a436a2d7f6a3    nginx:latest    "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes       0.0.0.0:32768->80/tcp   optimistic_thompson

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

docker run -p :

-p  : 指定端口映射(有以下四种格式:)
        
               ip:hostport:ContainerPort
                       
               ip::ContainerPort
                       
               hostPort:ContainerPort
                
               ContainerPort     (最常用了吧)


root@zhengzelin:~# docker run -itd -p 8080 nginx:latest 
0f39e1c98b408eb13d2b15b92116306906fc9786067cde08cebfc348f9d6949e

root@zhengzelin:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
0f39e1c98b40     nginx:latest      "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        80/tcp, 0.0.0.0:32771->8080/tcp   determined_bassi
a436a2d7f6a3     nginx:latest      "nginx -g 'daemon of…"   58 minutes ago      Up 3 minutes        0.0.0.0:32769->80/tcp             optimistic_thompson

       


       

方法1: 使用 commit 结合 docker run

       
        我们都知道 docker commit 是将 docker Container 打包成一个镜像!那么我们就可以使用 docker commit 将该容器打包,然后再使用 docker run 基于打包后的 new image 构建一个 new container !

关于 docker commit 命令详解 ,及 docker container 其他 commands 介绍

"1、打包容器成为镜像!"

docker  commit  -a "指定作者名"  -m "指定注释消息"  容器ID(Name 也可)  imagename:tag

# 上面 -a 和 -m 选项为 可选选项! 不是必须加,不过 推荐加! 你可以使用 docker inspect imagename 来查看镜像信息!

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"2、查看生成的镜像:"

docekr images  , 或 docker inspect 镜像名

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"3、docker run 新的容器"

随机端口映射: docker run -itd -P 生成的镜像名:tag
             docker ps

指定端口映射(文章开头有格式):
eg:        docker run -itd  -p 指定的端口 生成的镜像名:tag

root@zhengzelin:~# docker run -itd -p 8080 nginx:latest 
0f39e1c98b408eb13d2b15b92116306906fc9786067cde08cebfc348f9d6949e

root@zhengzelin:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
0f39e1c98b40     nginx:latest      "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        80/tcp, 0.0.0.0:32771->8080/tcp   determined_bassi

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

如果因为新容器IP的变更,导致其他的变更,你可以查看旧容器的ip,然后将旧容器删除,
更改新容器的IP为旧容器的IP,然后重启docker 服务,重启容器!(不推荐,只能在某些时间段更改)

关于方法,下面有!往下滑!

       


       

方法2:修改该容器的配置文件(不推荐):

       
1、我们都知道 docker 容器的默认存储路径为: /var/lib/docker/containers/

2、使用 docker ps 查看容器的 ID!(不是默认路径使用:docker inspect | grep 容器ID 即可!)

3、便可得知,需要更改的容器的配置文件的路径;

4、开始修改

5、修改完成

6、重启docker服务,重启之前开启的所有容器

注意:不推荐使用,只是这也是一种方法! 生产环境中 谁敢随随便便重启 某个服务? 还有导致很多 docker container stop,这不是没事找死呢吗?

★ ★ ★ 强烈不推荐!!!只是知道还有这种方法可以实现!

1、获得 容器id:
root@zhengzelin:~# docker ps
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
e8b0d9697474     nginx:latest        "nginx -g 'daemon of…"   19 minutes ago      Up 19 minutes       80/tcp, 0.0.0.0:32774->8080/tcp   cool_gauss


2、修改配置文件:(这里的路径只是我的路径,你的路径使用你的容器ID)
root@zhengzelin:~# vim /var/lib/docker/containers/e8b0d9697474f...../hostconfig.json


3、找到里面关于 HostPort 的配置选项:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":""}]}

# 将这个端口改为你要更改的端口即可!除了 tcp ,你还可以使用 udp;
# 默认是tcp,如果使用 udp的话,你得提前声明 : 8080/udp
如果你的这里和我显示的不一样,你可以参考这篇文章:http://www.360doc.com/content/20/0419/18/835902_907077226.shtml


4、重启docker 服务,重启 容器 !!!(强烈不推荐使用该方法!)

修改容器 hostname 和 ip(也不推荐,只是告诉方法:)

        在上面那个路径: /var/lib/docker/容器ID/ 目录下,还有其他两个配置文件: hostname 和 hosts ,你查看一下就知道了!不过也需要 重启服务 和 容器,谁闲的没事更改这些配置啊,不推荐使用!
       


       

方法3、使用 iptables 规则 :

1、获取容器的 IP:

格式: docker inspect 容器ID/容器名 | grep -i ipaddress

root@zhengzelin:~# docker inspect cool_gauss | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

将 容器的8000端口映射到docker主机的8001端口

iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000

你可能感兴趣的:(Docker)