Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
一 准备
准备一个tomcat的docker镜像。
这里就直接通过Docker Hub查找一个既有的镜像了。
docker pull tomcat
二 启动
1 按照老方式启动
docker run -itd --name mytomcat tomcat
docker ps
可以看出创建了一个tomcat容器,通过port看出占用了8080端口。
可以使用logs查看是否正常启动。
docker logs mytomcat
但是这个8080端口是容器的,外面是无法直接访问的。
可以使用curl命令测试一下:
整个实践过程如下:
[[email protected] ~]# curl http://127.0.0.0:8080
curl: (7) Failed to connect to 127.0.0.0: Network is unreachable
2 任意端口映射启动
按照老方式启动无法访问容器,但docker可以通过 -P 或 -p 参数来将容器内端口映射到外部主机上。
当使用 -P(大写的)标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。
我们再重新启动tomcat。
docker run -itd -P tomcat
使用 docker ps 可以看到,本地主机的端口32768被映射到了容器的8080端口上。
此时访问本机的32768端口,即可访问容器内web应用提供的界面。
整个实践过程如下:
3 指定端口映射启动
当使用 -p(小写的)则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。
支持的格式有三种:
hostPort:containerPort:映射本机所有ip的指定端口。
ip:hostPort:containerPort:映射指定ip地址的指定端口。
ip::containerPort:映射指定ip地址的任意端口。
以三种方式启动三个容器,tomcat1,tomcat2,tomcat3。
映射本机所有ip的指定端口
docker run -itd --name tomcat1 -p 9527:8080 tomcat
映射指定ip地址的指定端口
docker run -itd --name tomcat2 -p 192.168.0.107:9528:8080 tomcat
映射指定ip地址的任意端口
docker run -itd --name tomcat3 -p 192.168.0.107::8080 tomcat
执行docker ps查看。
整个实践过程如下:
本机有4个ip地址:192.168.0.107 172.17.0.1 127.0.0.1 192.168.122.1
对于tomcat1,可以使用192.168.0.107:9527 172.17.0.1:9527 127.0.0.1:9527 192.168.122.1:9257访问容器中的tomcat。
对于tomcat2,只能使用192.168.0.107:9528访问。
对于tomcat3,只能使用192.168.0.107:32768访问。
4 指定多个端口启动
-p 标记可以多次使用来绑定多个端口
docker run -itd --name tomcat4 -p 192.168.0.107:9530:8080 -p 192.168.0.107:9531:8080 tomcat
5 查看映射端口配置–docker port
三 容器互联
在平时开发中,部署应用程序和数据库通常不会在同一物理主机上,这也是为了安全。
那么想象一种场景,应用全部通过docker创建,则应用程序和DB应该也是分属于不同的容器。那么应用程序要访问db该如何处理?
当然,可以将db的容器端口也是用-P或-p映射出来,但是docker还提供了 –link 参数,可以让容器之间安全的进行交互。
--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。
同样的先创建一个mysql的数据库镜像。
docker pull mysql
创建一个mysql容器。
docker run --name db_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
这里的-e MYSQL_ROOT_PASSWORD=123456是初始化root用户的密码。
然后创建一个新的 tomcat 容器,并将它连接到 db 容器。
docker run -itd -P --name tomcat5 --link db_mysql:db tomcat /bin/bash
进入到容器tomcat5。
docker attach tomcat5
查看/etc/hosts 文件的信息,可以看到添加了db_mysql的信息,通过ping命令也是可以ping通的。
因为我们在创建tomcat5容器时,也指定db_mysql容器的别名db,所以我们也可以ping通db。
ping db_mysql
ping db
整个实践过程如下: