docker
- 為什么使用docker
不知道怎么去解釋吧巧还,感覺(jué)就是省去了很多環(huán)境的安裝英妓,比如你要在服務(wù)器運(yùn)行一個(gè)node服務(wù)也拜,你必須要使用pm2這樣的工具去啟用泡嘴,然后假如還有個(gè)python的應(yīng)用丑瞧,我想肯定還要下個(gè)python的工具吧柑土,那么這樣就很多很雜,在自己的linux主機(jī)就變的很復(fù)雜很不好管理绊汹,而docker可以完美的去解決這些場(chǎng)景稽屏,不需要pm2也能在服務(wù)端跑起一個(gè)node服務(wù);
- docker的概念
image: 鏡像西乖,類似于一個(gè)說(shuō)明書(shū)狐榔,告訴docker怎么去做出一個(gè)這樣的應(yīng)用出來(lái);
container: 容器获雕,根據(jù)這個(gè)image生成薄腻,生成以后就可以通過(guò)命令去使用;
- docker常用的指令
- docker image ls <查看鏡像列表>
- docker run -d -p 3000:8000 列表名 <將鏡像8000運(yùn)行在本機(jī)的3000端口后臺(tái)運(yùn)行典鸡,產(chǎn)生一個(gè)容器>
- docker ps -a <查看容器的執(zhí)行情況>
- docker build -t 鏡像名稱 . <創(chuàng)建一個(gè)鏡像被廓,點(diǎn)標(biāo)示文件的文件位置>
- docker container stop 容器id <暫停一個(gè)服務(wù)>
- 如何去創(chuàng)建一個(gè)簡(jiǎn)易的服務(wù)(以官網(wǎng)的例子說(shuō)明,node更簡(jiǎn)單了)
- 新建一個(gè)空目錄萝玷,mkdir docker_example 嫁乘,名字隨意;
- cd docker_example目錄球碉, 然后首先創(chuàng)建三個(gè)文件夾,
touch Dockerfile蜓斧,touch app.py,touch requirements.txt;
Dockerfile: 這個(gè)文件夾的名字必須是這個(gè),然后說(shuō)下他的配置睁冬;我以官網(wǎng)的例子然后看注釋:
Dockerfile
FROM node <繼成>
COpy app/app <拷貝>
WORKDIR /app <工作目錄>
RUN npm install <執(zhí)行命令挎春,在編譯階段執(zhí)行>
EXPOSE 3000 <暴露一個(gè)端口>
CMD node app.js <命令,容器運(yùn)行階段的命令>
# 使用python作為運(yùn)行時(shí)候的夫鏡像豆拨,意思這個(gè)應(yīng)用繼承自python
FROM python:2.7-slim
# 創(chuàng)建一個(gè)工作目錄叫做app
WORKDIR /app
# 將當(dāng)前目錄內(nèi)容復(fù)制到/ app的容器中
COPY . /app
# 安裝requirements.txt中指定的任何所需包(這里不需要關(guān)心pip的問(wèn)題)
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 使端口80可用于此容器外的世界直奋,我們?cè)诒緳C(jī)隨意一個(gè)接口去對(duì)接這個(gè)接口即可
EXPOSE 80
# 定義一個(gè)環(huán)境變量
ENV NAME World
# 在容器啟動(dòng)時(shí)運(yùn)行app.py,類似于我們?cè)诿钚腥?python app.py(類似于node app.js)
CMD ["python", "app.py"]
app.py 這個(gè)就是服務(wù)代碼了施禾,看不懂沒(méi)關(guān)系脚线,把它當(dāng)作js看就是了。弥搞。邮绿。
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)
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)
requirements.txt,這就類似于node里面package.json文件了
Flask
Redis
- 三個(gè)文件創(chuàng)建以后渠旁,那我們就去把這個(gè)鏡像生成,docker build --tag=friendlyhello .
--tag也可以寫(xiě)成--t,指定版本船逮,記住一定要在這個(gè)目錄下面執(zhí)行這個(gè)命令顾腊,鏡像名字為friendlyhello,好像不能有大寫(xiě)
執(zhí)行 docker image ls挖胃;就可以看到你剛剛的friendlyhello這個(gè)鏡像了杂靶,
執(zhí)行 docker run -p 4000:80 friendlyhello,然后用瀏覽器訪問(wèn)云主機(jī)的4000端口冠骄,然后就可以看到歡迎頁(yè)了伪煤,是不是很簡(jiǎn)單,很神奇凛辣,也不需要配置一大堆的東西了抱既;
初步的一個(gè)簡(jiǎn)單基于docker的服務(wù)就跑通了,后期在慢慢研究它更多的功能吧扁誓;