zoukankan      html  css  js  c++  java
  • docker端口映射和容器互相访问

    端口映射

    容器运行时如果没有指定端口,与外界是无法通信的,比如当前我们的有一台MySQL的docker container,当前容器正在运行mysql并提供3306端口

    # docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    2e54153e56ca        mysql:version1      "/bin/bash"         8 days ago          Up About a minute                       mysql-new-container
    
    # docker exec -it mysql-new-container /bin/bash -c "netstat -antlp |grep 3306"
    tcp6       0      0 :::3306                 :::*                    LISTEN      -                   

    此时我们并未做端口映射,所以宿主机和外界是无法访问该MySQL服务的

    将容器关机,重开机时进行端口映射

    先将容器内的Mysql服务停止

    # docker exec -u mysqladmin -it mysql-new-container /bin/bash -c "/usr/local/mysql/bin/mysqladmin -uroot -pmypna123 shutdown"

    停止容器

    # docker stop mysql-new-container
    mysql-new-container

    根据容器创建一个image镜像

    # docker commit mysql-new-container mysql-new-container-temp
    sha256:2f516f00086e5bd6f52bb90b75f03a763eaff08f62a93b6cd73d1eb0226571fe
    
    # docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    mysql-new-container-temp   latest              2f516f00086e        4 seconds ago       333MB
    mysql                      version1            bf6b23f800ed        2 weeks ago         333MB
    centos                     latest              0f3e07c0138f        5 weeks ago         220MB

    删除容器

    # docker rm mysql-new-container
    mysql-new-container

    根据镜像新建容器并启动会mysql

    # docker run --name mysql-new-container --hostname mysql-new-container --mount type=volume,source=mysql-new-vol,target=/usr/local/mysql -p 3306:3306 -it mysql-new-container-temp /bin/bash
    # docker ps
    CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
    bdc71602ee74        mysql-new-container-temp   "/bin/bash"         4 minutes ago       Up 4 minutes        0.0.0.0:3306->3306/tcp   mysql-new-container
    
    # docker exec -u mysqladmin -it mysql-new-container /bin/bash
    $ cd /usr/local/mysql/bin
    $ mysqld_safe &

    查看该容器的端口映射信息

    # docker port mysql-new-container
    3306/tcp -> 0.0.0.0:3306

    测试端口映射,访问宿主机的3306端口

    mysql -h 172.16.101.55 -u root -pmypna123 -P 3306 mysql -e "status"
    mysql: [Warning] Using a password on the command line interface can be insecure.
    --------------
    mysql  Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using  EditLine wrapper
    
    Connection id:        331
    Current database:    mysql
    Current user:        root@sht-sgmhadoopnn-01.telenav.cn
    SSL:            Cipher in use is DHE-RSA-AES256-SHA
    Current pager:        stdout
    Using outfile:        ''
    Using delimiter:    ;
    Server version:        5.7.18-log MySQL Community Server (GPL)
    Protocol version:    10
    Connection:        172.16.101.55 via TCP/IP
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    TCP port:        3306
    Uptime:            7 min 25 sec
    
    Threads: 2  Questions: 28  Slow queries: 0  Opens: 117  Flush tables: 1  Open tables: 71  Queries per second avg: 0.062
    --------------

     容器互联

    容器之间默认无法正常进行通信,我们新建一个web容器,在web容器里可以访问到另外一个容器mysql-new-container

    # docker run --name web --hostname web --link mysql-new-container:db -it centos:latest /bin/bash
    
    # docker ps -a --no-trunc
    CONTAINER ID                                                       IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
    1bb29181e0cd5df1d34c94313e9920093bcf705626750da2d43f8067dd332281   centos:latest              "/bin/bash"         6 minutes ago       Up 6 minutes                                 web
    bdc71602ee74907c8902c878b805cc28b57726b80350395fd4cd9cf69a86795d   mysql-new-container-temp   "/bin/bash"         31 minutes ago      Up 31 minutes       0.0.0.0:3306->3306/tcp   mysql-new-container,web/db

     通过使用--link选项可以实现该功能,通过登录web容器查看信息

    [root@web /]# 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.2    db mysql-new-container mysql-new-container
    172.17.0.3    web
    
    [root@web /]# env  
    DB_PORT=tcp://172.17.0.2:3306
    DB_PORT_3306_TCP_ADDR=172.17.0.2
    LANG=en_US.UTF-8
    HOSTNAME=web
    DB_PORT_3306_TCP=tcp://172.17.0.2:3306
    DB_PORT_3306_TCP_PORT=3306
    PWD=/
    HOME=/root
    TERM=xterm
    SHLVL=1
    DB_NAME=/web/db
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    DB_PORT_3306_TCP_PROTO=tcp
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    _=/usr/bin/env

     可以发现--link选项主要是向节点的hosts文件和环境变量添加被连接节点的信息

  • 相关阅读:
    IIS打开本地站点时,无法访问本地json文件的解决办法
    几种流行的前端框架(BootStrap、Layui、Element-UI、Mint UI、Angular、Vue.js、React)
    六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
    SpringBoot框架开发的优秀的项目「值得收藏学习」
    jmeter接口之json提取器应用
    【设计模式(23)】行为型模式之访问者模式
    【设计模式(22)】行为型模式之模板模式
    【设计模式(21)】行为型模式之策略模式
    HTML回忆笔记,给那些忘了但又没完全忘的人准备的
    vscode创建html文件使用"!+tab"不起作用的解决方法
  • 原文地址:https://www.cnblogs.com/ilifeilong/p/11784630.html
Copyright © 2011-2022 走看看