docker連接兩個容器

容器是用來提供服務的,每個容器都是運行一個進程,或許是一個web程序,或許是一個資料庫服務,而在每個容器之間都是需要相互訪問的,從而在這裡構建一個python的程序,一個容器運行python的應用程序,一個容器用來運行redis服務,在應用程序中訪問redis,具體架構如下:

Java

運行redis的時候,步驟如下:

Java

首先下載到redis的鏡像,然後根據鏡像運行一個鏡像的實例,也就是redis這個實例,在其中需要注意的是,容器對外暴露的埠就是6379埠,從而在主機上對應監聽一個6379的埠,差不多就是埠映射了。

構建應用程序的dockerfile如下:

[[email protected] appdockerfile]# ls -l

Advertisements

total 12

-rw-r--r--. 1 root root 665 Dec 18 04:16 app.py

-rw-r--r--. 1 root root 146 Dec 18 04:18 dockerfile

-rw-r--r--. 1 root root 12 Dec 18 04:16 requirements.txt

[[email protected] appdockerfile]# cat app.py

from flask import Flask

from redis import Redis, RedisError

import os

import socket

# Connect to Redis

redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

Advertisements

app = Flask(__name__)

@app.route("/")

def hello():

try:

visits = redis.incr("counter")

except RedisError:

visits = "<i>cannot connect to Redis, counter disabled</i>"

html = "<h3>Hello {name}!</h3>" \

"<b>Hostname:</b> {hostname}<br/>" \

"<b>Visits:</b> {visits}"

return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":

app.run(host='0.0.0.0', port=80)

[[email protected] appdockerfile]# cat dockerfile

FROM python:2.7-slim

WORKDIR /app

ADD . /app

RUN pip install --trusted-host pypi.python.org -r requirements.txt

EXPOSE 80

CMD ["python","app.py"]

[[email protected] appdockerfile]# cat requirements.txt

Flask

Redis

創建鏡像:

Java

查看生成的鏡像:

Java

運行應用程序容器並進行測試:

參數--link表示為tagname:alias,一個是標籤的名稱,一個是別名。

其實redis暴露不暴露埠是無所謂的,這個埠是給宿主機訪問的,而app的容器和redis的容器的交互實際上是通過內部網路進行的,如下:

Java

容器默認使用的都是那個橋接網路,而不是使用宿主機的IP來進行通信,如果你使用的是宿主機的IP,然後來訪問容器暴露的埠的話,會顯示沒有路由到這個redis的主機。

Java

在這裡連接的是redis的主機名,容器的網路是可以解析這個主機名的:

Java

在構建dockerfile的時候,為了進行調試為啥無法連接到redis主機,從而需要進行安裝相關的包進行調試,但是構建dockerfile的時候,總是出現如下報錯:

Java

要想使用root許可權,必須在dockerfile中添加指令如下:

Java

表示使用root的許可權運行程序。

在使用dockerfile的時候,ADD指令和COPY指令很相似,都是將文件複製到對應的路徑之中。首先,源路徑都必須是相對的路徑,相對於dockefile的路徑。而ADD所做的可以更多,ADD的源路徑可以是一個url,而COPY必須是一個目錄或者文件;ADD的源文件如果是一個壓縮文件,那麼在複製的時候,會自動進行解壓,而COPY不會。

推薦使用COPY。

Java

就算使用絕對路徑,也會直接變成相對路徑。

Advertisements

你可能會喜歡