大量的互联网应用服务包含多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。Docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。
Docker的四种网络模式
1. host模式 :
docker run 使用 --net=host指定
docker使用的网络实际上和宿主机一样
2. container模式:
使用 --net=container:container_id/container_name
多个容器使用共同的网络,看到的ip是一样的。
3. none 模式
使用 --net=none指定
这种模式下,不会配置任何网络。
4. bridge模式
使用 --net=bridge指定,默认模式,不会指定
此模式会为每个容器分配一个独立的network namespace
端口映射实现访问容器
外部网络访问容器 :外部的用户要访问容器,先将容器的ip映射出去,然后客户利用宿主机的ip来访问
[root@30c1fec5df6a /]# [root@langzi01 ~]# docker run -d -P training/webapp python app.py
[root@langzi01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4986deb00c32 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32768->5000/tcp musing_haibt
通过docker ps查看发现 32768 端口映射到了容器的 5000 端口。此时访问主机的 32768 端口就可以访问容器内 web 应用提供的内容
通过docker logs查看容器信息
[root@langzi01 ~]# docker logs -f musing_haibt
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
映射所有接口的地址:
使用 hostPort:containerPort 格式将本地的 5000 端口映射到容器的 5000 端口,可以执行如下命令:
[root@langzi01 ~]# docker run -d -p 5000:5000 training/webapp python app.py
ab2c757be1b4515b37859704cc5ca67af00190d8a067093dba2fecb92f65ae3d
[root@langzi01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab2c757be1b4 training/webapp "python app.py" 5 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp eloquent_kilby
此时默认会绑定本地所有接口上的所有地址(如果主机有多个 IP,那么每个 IP 的 5000 端口都映射到了容器的 5000 端口)。
多次使用 -p 参数可以绑定多个端口:
[root@langzi01 ~]# docker run -d -p 5001:5001 -p 3000:8000 training/webapp python app.py
8081850a70fd7e76fb34a8e205ef9f315ffb0f5028eded4630b7763c3a4c2816
[root@langzi01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8081850a70fd training/webapp "python app.py" 4 seconds ago Up 3 seconds 5000/tcp, 0.0.0.0:5001->5001/tcp, 0.0.0.0:3000->8000/tcp jovial_ptolemy
映射指定地址到指定的端口:
可以使用 ip:hostPort:containerPort 格式的参数指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1:
[root@langzi01 ~]# docker run -d -p 127.0.0.1:5002:5002 training/webapp python app.py
7f9341d8a64ca56cae2c7d47fbaf7327542e0ca0ef1b4b215b683b9e005c5d46
[root@langzi01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f9341d8a64c training/webapp "python app.py" About a minute ago Up About a minute 5000/tcp, 127.0.0.1:5002->5002/tcp trusting_euler
映射指定地址到指定的任意端口:
使用 ip::containerPort 格式的参数可以绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口:
[root@langzi01 ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
ba45085521a63529bb353fa3e926eb7d9b38f7df8b3332740b163f61d7627620
查看映射端口配置
[root@langzi01 ~]# docker port peaceful_franklin 5000
127.0.0.1:32769
[root@langzi01 ~]# docker port jovial_ptolemy 8000
0.0.0.0:3000
Docker 给已经创建并运行的容器添加端口映射
创建时没有添加端口映射,通过commit提交一个运行中的容器,重新运行镜像添加端口
[root@langzi01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06f21b81bf7c centos "/bin/bash" 2 days ago Up 2 days data03
127de2f57a5b centos "/bin/bash" 2 days ago Up 2 days data02
2f5f9417b073 centos "/bin/bash" 2 days ago Up 2 days data01
#提交一个容器
[root@langzi01 ~]# docker commit -m "centos_with_httpd" -a "frankie" 2f5 centos_with_httpd:frankie
sha256:a78cc36474c845328fc44daf6bb3f1cc489a5c2a908061b07757d5990bdd0c77
[root@langzi01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_httpd frankie a78cc36474c8 9 seconds ago 312 MB
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67f671d4bf82 centos_with_httpd:frankie "bash" 9 seconds ago Up 8 seconds 0.0.0.0:5123->8000/tcp lucid_almeida
[root@langzi01 ~]# docker run -itd -p 5123:80 centos_with_httpd:frankie bash
67f671d4bf82472a9e70f30d59fe161fb085a55005a95c6c1d9e4edb9bdff345
[root@langzi01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67f671d4bf82 centos_with_httpd:frankie "bash" 9 seconds ago Up 8 seconds 0.0.0.0:5123->80/tcp lucid_almeida
[root@langzi01 ~]# docker exec -it 15d bash
[root@15dee97e8218 /]# /usr/sbin/httpd
[root@15dee97e8218 /]# curl 'localhost/hello.html'
Hello,World
在主机里面访问
[root@langzi01 ~]# curl '172.17.0.1:5123/hello.html'
Hello,World
查看容器的名字
[root@langzi01 ~]# docker inspect -f "{{ .Name }}" 15dee97e8218
/eager_agnesi
网友评论