使用link就是类似使用了容器的ip地址,无需知道其真实ip,使用link后的别名就可以知道


使用link连接容器

以 mysql 为 栗子

  1. 启动一个 mysql-server,详细参数可以参照说明文档:https://hub.docker.com/r/mysql/mysql-server/,设置密码,挂载数据库 等等

    wilker@ubuntu:~$ docker pull mysql/mysql-server # 拉一个官方的镜像下来
    wilker@ubuntu:~$ docker run --name=mysql_server11 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server # 启动容器,并设置 root 用户密码
  2. 进入 mysql_server11 容器中修改一下 root 用户可以访问的ip地址,默认是 localhost,别的ip是连不进来的,这里改成 任意 ip 都可以连进来(生产环境不能这样干)

    wilker@ubuntu:~$ docker exec -it mysql_server11 mysql -uroot -p123456 # 进入容器的mysql服务
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.7.18 MySQL Community Server (GPL)mysql> show databases; # 看下默认的数据库
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+mysql> use mysql; # 使用 mysql 数据库
    Database changed
    mysql> select host,user from user where user='root';
    +-----------+------+
    | host      | user |
    +-----------+------+
    | localhost | root | # 默认只有 当前容器能用 root 用户连进来,要修改一下
    +-----------+------+
    1 row in set (0.00 sec)mysql> update user set host = '%'  where user ='root'; # 修改成 % 表示任意ip
    Query OK, 1 row affected (0.03 sec)
    Rows matched: 1  Changed: 1  Warnings: 0mysql> select host,user from user where user='root'; # 查看一下修改成功没
    +------+------+
    | host | user |
    +------+------+
    | %    | root |
    +------+------+
    1 row in set (0.00 sec)mysql> flush privileges; # 刷新权限使之生效
    Query OK, 0 rows affected (0.01 sec)mysql> exit; # 退出 mysql,然后自动退出容器
    Bye
    wilker@ubuntu:~$
  3. 去 docker hub 拉一个客户端下来,使用 link 连接 mysql_server11 容器,并使用别名 为 db

    wilker@ubuntu:~$ docker pull imega/mysql-client # 拉 mysql 客户端镜像
    wilker@ubuntu:~$ docker run --name=mysql_client11 --link=mysql_server11:db -i -t imega/mysql-client mysql -h db -uroot -p123456 # -h 的值为 db,就是 mysql_server11 的ip别名
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 14
    Server version: 5.7.18 MySQL Community Server (GPL)Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> show databases; # 成功进入 mysql_server11 容器中的数据库
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)MySQL [(none)]> exit;
    Bye
    • 退出客户端容器是容器也就变为 Exit 状态了,再次进入可以用 start 这个容器

      wilker@ubuntu:~$ docker start mysql_client11 -a
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MySQL connection id is 15
      Server version: 5.7.18 MySQL Community Server (GPL)Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> 

查看容器连接后的环境变量

还是用上面运行的 mysql 栗子

  • mysql_server11 的环境变量

    wilker@ubuntu:~$ docker exec mysql_server11 env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=e3edaf102b4a
    MYSQL_ROOT_PASSWORD=123456
    PACKAGE_URL=https://repo.mysql.com/yum/mysql-5.7-community/docker/x86_64/mysql-community-server-minimal-5.7.18-1.el7.x86_64.rpm
    HOME=/root
  • mysql_client11 的环境变量,这里可以看到 mysql_server11 容器的环境变量

    wilker@ubuntu:~$ docker exec mysql_client11 env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=db696da76b9c
    DB_PORT=tcp://172.17.0.2:3306
    DB_PORT_3306_TCP=tcp://172.17.0.2:3306
    DB_PORT_3306_TCP_ADDR=172.17.0.2
    DB_PORT_3306_TCP_PORT=3306
    DB_PORT_3306_TCP_PROTO=tcp
    DB_PORT_33060_TCP=tcp://172.17.0.2:33060
    DB_PORT_33060_TCP_ADDR=172.17.0.2
    DB_PORT_33060_TCP_PORT=33060
    DB_PORT_33060_TCP_PROTO=tcp
    DB_NAME=/mysql_client11/db
    DB_ENV_MYSQL_ROOT_PASSWORD=123456
    DB_ENV_PACKAGE_URL=https://repo.mysql.com/yum/mysql-5.7-community/docker/x86_64/mysql-community-server-minimal-5.7.18-1.el7.x86_64.rpm
    HOME=/root
    • 再看一下 hosts 文件, db 可以解析为 172.17.0.2,
    wilker@ubuntu:~$ docker exec mysql_client11 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 e3edaf102b4a mysql_server11
    172.17.0.3      db696da76b9c

参考资料

  • http://blog.tingyun.com/web/article/detail/892
  • http://www.jianshu.com/p/13752117ff97
  • https://www.oschina.net/translate/dockerlinks
  • mysql 的相关操作:http://www.cnblogs.com/flying607/p/4766041.html

docker_容器间的链接 link相关推荐

  1. Docker框架使用系列教程(五)容器间的链接

    Docker容器的教程这里已经是第五期了,我们今天讲一讲容器之间的链接,包括常用的命令等等,喜欢的话记得收藏起来慢慢看. 容器间的链接有两种方法,任选其一即可 例如: docker run -d -P ...

  2. docker容器网络配置之容器间的链接(默认桥接网络下的links)

    一. 遗留的容器连接方式  --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...

  3. ping 不通容器 宿主_Docker容器间通信

    Docker容器间通信 Docker会为每个创建的容器自动分配一个虚拟IP,这个虚拟IP无法从容器外侧进行访问,只是Docker环境内部容器间彼此通信的标识,容器间的网络是互通互联的. 但是通过这种虚 ...

  4. docker 获取宿主机ip_Docker基础修炼6——网络初探及单机容器间通信

    如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...

  5. docker笔记13 - 容器间的单双向通信

    1.容器间基于Link实现单向通信 镜像列表 [root@iZbp1e9mxelwe7pwimpw8sZ ~]# docker images REPOSITORY TAG IMAGE ID CREAT ...

  6. docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  7. docker 容器之间通信_还不清楚docker容器间是如何通信的?看这篇文章就够了

    如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...

  8. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  9. Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

    前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...

最新文章

  1. On/Off FlipSwitch 按钮
  2. 超时时间已到。在操作完成之前超时时间已过或服务器未响应
  3. Vagrant: hostmanager 主机名管理插件
  4. leetCode-第四题求两个数组的中位数
  5. VTK:二次曲面用法实战
  6. 清新BLOG-CMS博客主题源码
  7. spring12----基于@AspectJ的AOP
  8. 消息中间件之JMS实践(ActiveMQ) 1
  9. DeveloperAppleHelp
  10. 对于拼接进去的html原来绑定的jq事件失效
  11. php redis stream,php redis-close() 之后为什么还能使用 $redis-get('key') 获取数据?
  12. Svn分支管理的使用(三)
  13. python下载bt文件_使用libtorrent-python下载Torrent
  14. 电脑卡慢怎么办,是什么原因,怎么处理Sysmain
  15. 带你理解 Hanoi 汉诺塔递归算法
  16. 棉猴论坛VIP之驱动基础系列教程 视频教程
  17. 驻波在物理上的应用与魅力
  18. linux网络操作系统项目教程第三版答案,《Linux网络操作系统项目教程(RHEL7.4 CentOS 7.4)(第3版))》习题及答案...
  19. C# winform对话框用法大全
  20. win7 无法打开vscode 1.71版本

热门文章

  1. 7135制作自动量程电压切换_icl7135电路
  2. 地面三维激光扫描仪的工作原理
  3. 计算机二级python用什么版本好_如何准备全国计算机二级Python?
  4. Biomedical images dataset findings(4 Chest page)
  5. 关于《活着》一点读后感
  6. 网络安全理论综合题纲
  7. 性能大PK count(*)、count(1)和count(列)
  8. 电力载波ES1642芯片使用经验(中继部分测试)
  9. 非职业项目经理人的管理精华
  10. 在Quake4中创建模型