1. 程式人生 > >Docker與Kubernetes系列(三): 外部訪問Docker容器

Docker與Kubernetes系列(三): 外部訪問Docker容器

使用 docker ps 可以看到,本地主機的 49155 被對映到了容器的 5000 埠。此時訪問本機的 49155 埠即可訪問容器內 web 應用提供的介面。

$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

-p(小寫的)則可以指定要對映的埠,並且,在一個指定埠上只可以繫結一個容器。支援的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

例如:

對映所有介面地址

使用 hostPort:containerPort 格式本地的 5000 埠對映到容器的 5000 埠,可以執行

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

此時預設會繫結本地所有介面上的所有地址。

二、容器互聯

容器的連線(linking)系統是除了埠對映外,另一種跟容器中應用互動的方式。

該系統會在源和接收容器之間建立一個隧道,接收容器可以看到源容器指定的資訊。

使用 --link 引數可以讓容器之間安全的進行互動。

下面先建立一個新的資料庫容器。

$ sudo docker run -d --name db training/postgres

然後建立一個 web 容器,並將它連線到 db 容器

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

此時,db 容器和 web 容器建立互聯關係。

--link 引數的格式為 --link name:alias,其中 name 是要連結的容器的名稱,alias

 是這個連線的別名。

使用 docker ps 來檢視容器的連線

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db, web/db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  web

可以看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器連結到 db 容器,web 容器將被允許訪問 db 容器的資訊。

Docker 在兩個互聯的容器之間建立了一個安全隧道,而且不用對映它們的埠到宿主主機上。在啟動 db 容器的時候並沒有使用 -p 和 -P 標記,從而避免了暴露資料庫埠到外部網路上。