使用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. R语言使用beanplot包绘制豆荚图实战:与箱图、小提琴图对比、绘制不对称的豆荚图
  2. 2、Ktor学习-自动重新加载;
  3. 【C#】特性标签中的属性解释
  4. linux时间调整为dst,在Linux中禁用夏令时(DST)更改
  5. ionic tab导航在android 顶部解决方案
  6. 自动开料机器人_工业4.0智能家具无人化生产线 自动化无人化大势所趋
  7. List集合_介绍常用方法
  8. centos mysql 远程连接_Linux下开启MySQL的远程连接
  9. 在 Pycharm下使Python2和Python3共用Anaconda中的各种库/包的解决方法
  10. 关于获取安卓设备的mac地址
  11. 串口发送图片VGA显示
  12. 视频聊天室软件的技术标准
  13. 2014520420145212信息安全系统实验三报告
  14. 服务器远程预览本地设备视频, 预览多个,打不开视频流
  15. acs880变频器静态辨识_ACS880变频器PID控制参数设置 -
  16. 祭十大已经逝去的软件
  17. HDU4565 So Easy!【矩阵快速幂】
  18. 24.FFmpeg学习笔记 - 用libavfilter转换原始音频格式1
  19. Vufroia相机对焦问题
  20. docker容器网络配置之容器间的链接(默认桥接网络下的links)

热门文章

  1. 仿脉脉PHP源码,脉脉——一个让你能够学习工作的平台
  2. 各种java开源框架笔记
  3. ORA-00942: table or view does not exist
  4. 如何在macOS中管理家长控制?
  5. 数字图像与机器视觉基础(2)
  6. 千峰笔记【数通基础】③ DHCP、DNS、FTP、WEB服务器搭建(Windows2003)
  7. 金山云容器引擎服务入门指南
  8. 找不到libgvplugin_pango.so.6的问题
  9. ArcGIS 对等高线进行标注
  10. 《火球——UML大战需求分析》(第1章 大话UML)——1.1 UML基础知识扫盲