docker連接兩個容器
容器是用來提供服務的,每個容器都是運行一個進程,或許是一個web程序,或許是一個資料庫服務,而在每個容器之間都是需要相互訪問的,從而在這裡構建一個python的程序,一個容器運行python的應用程序,一個容器用來運行redis服務,在應用程序中訪問redis,具體架構如下:
運行redis的時候,步驟如下:
首先下載到redis的鏡像,然後根據鏡像運行一個鏡像的實例,也就是redis這個實例,在其中需要注意的是,容器對外暴露的埠就是6379埠,從而在主機上對應監聽一個6379的埠,差不多就是埠映射了。
構建應用程序的dockerfile如下:
[root@docker 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
[root@docker 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)
[root@docker 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"]
[root@docker appdockerfile]# cat requirements.txt
Flask
Redis
創建鏡像:
查看生成的鏡像:
運行應用程序容器並進行測試:
參數--link表示為tagname:alias,一個是標籤的名稱,一個是別名。
其實redis暴露不暴露埠是無所謂的,這個埠是給宿主機訪問的,而app的容器和redis的容器的交互實際上是通過內部網路進行的,如下:
容器默認使用的都是那個橋接網路,而不是使用宿主機的IP來進行通信,如果你使用的是宿主機的IP,然後來訪問容器暴露的埠的話,會顯示沒有路由到這個redis的主機。
在這裡連接的是redis的主機名,容器的網路是可以解析這個主機名的:
在構建dockerfile的時候,為了進行調試為啥無法連接到redis主機,從而需要進行安裝相關的包進行調試,但是構建dockerfile的時候,總是出現如下報錯:
要想使用root許可權,必須在dockerfile中添加指令如下:
表示使用root的許可權運行程序。
在使用dockerfile的時候,ADD指令和COPY指令很相似,都是將文件複製到對應的路徑之中。首先,源路徑都必須是相對的路徑,相對於dockefile的路徑。而ADD所做的可以更多,ADD的源路徑可以是一個url,而COPY必須是一個目錄或者文件;ADD的源文件如果是一個壓縮文件,那麼在複製的時候,會自動進行解壓,而COPY不會。
推薦使用COPY。
就算使用絕對路徑,也會直接變成相對路徑。