鏡像
以前我在windows上學(xué)習(xí)linux的時(shí)候丹拯,都是搭一個(gè)linux的虛擬機(jī)森书,現(xiàn)在沒想到docker也可以這么簡單輕量的啟動(dòng)一個(gè)linux的交互式終端梢什,供我們簡單的學(xué)習(xí)
# -i 表示交互式 -t表示終端 --rm表示用后就刪除容器 bash表示終端是shell
docker run -it --rm centos:centos7.2 bash
鏡像的命令
docker image --help 看到所有的鏡像相關(guān)的命令
- 查看所有的鏡像
docker image ls
- 刪除鏡像
docker image rm [image_tag_name]
docker image rm [image_id]
- 查看鏡像所占的體積 真實(shí)的硬盤空間
docker system df
鏡像的構(gòu)建 —— Dockerfile
它是用來構(gòu)建自定義鏡像的
- 基礎(chǔ)鏡像畢竟是基礎(chǔ)鏡像甫煞,無法滿足我們的需求,我們總是要各種定制(為了方便)沉馆,而方式有二:docker commit 和 Dockerfile 码党,由于docker commit實(shí)在不容易記錄更改,日久就忘了斥黑。所以 Dockerfile 就成了我們的選擇
- 一個(gè) Dockerfile 可能長這樣:
# 基礎(chǔ)鏡像
FROM python:3.7.5-slim
# 工作目錄
WORKDIR /home/user/app
# 復(fù)制當(dāng)前目錄下所有文件入容器目錄(自動(dòng)創(chuàng)建目錄)
COPY / /home/user/app
# 構(gòu)建層 執(zhí)行各種命令
RUN pip install flask
# 聲明一個(gè)端口用以隨機(jī)映射
EXPOSE 5000
# 聲明數(shù)據(jù)卷
VOLUME /data
# 容器啟動(dòng)后執(zhí)行的命令
CMD ["python","index.py"]
- FROM base_image_name
# FROM表示從一個(gè)鏡像為基礎(chǔ)來構(gòu)建
FROM debian
- RUN 這玩意兒運(yùn)行一次就構(gòu)建一層揖盘,所以盡量少構(gòu)建層
一次RUN完
# 這個(gè)可以用以裝環(huán)境依賴什么的
RUN apt-get update \
&& apt-get install -y python3 && pip3 install flask \
&& rm -rf /var/lib/apt/lists/*
- COPY 復(fù)制文件命令
命令 源地址 鏡像中的目錄
COPY / /home/user/app/
# 將操作的主機(jī)的目錄下的文件(比如build好的文件)copy到鏡像的目錄下
- WORKDIR
WORKDIR /home/user/app
# 這樣就可以指定工作目錄 即使沒有也會(huì)遞歸創(chuàng)建整個(gè)路徑
- CMD
cmd命令 容器運(yùn)行的時(shí)候,是以服務(wù)該主進(jìn)程的锌奴,當(dāng)CMD這個(gè)命令執(zhí)行結(jié)束的時(shí)候兽狭,那就結(jié)束了,所以沒必要去后臺(tái)運(yùn)行進(jìn)程
CMD ["python3","index.py"]
index.py內(nèi)容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
- EXPOSE 暴露端口
# 這個(gè)EXPOSE 的作用在于使用運(yùn)行docker run -P ...... 命令的時(shí)候,會(huì)使用宿主機(jī)的隨機(jī)端口來自動(dòng)映射到這個(gè)聲明的端口
# docker run -p <宿主端口>:<容器端口> -t [container_tag_name]
EXPOSE 5000
- ENV 配置環(huán)境變量
# 格式:ENV <key1>=<value1> <key2>=<value2>...
ENV ASP_ENV=production FLASK_ENV=production
- ARG 構(gòu)建環(huán)境變量
# 這個(gè)也是一種環(huán)境變量箕慧,只不過它只存在與構(gòu)建鏡像的時(shí)候服球,運(yùn)行的時(shí)候并不存在,主要對于CI系統(tǒng)的一些構(gòu)建會(huì)比較有用
ARG NODE_VERSION=10.1
- VOLUME 數(shù)據(jù)卷 又一個(gè)很重要的東西颠焦,類似一個(gè)路徑映射關(guān)系斩熊。注意:數(shù)據(jù)卷是一個(gè)關(guān)系。同時(shí)無法在創(chuàng)建鏡像是指定本機(jī)目錄伐庭,只能聲明這個(gè)卷粉渠,創(chuàng)建容器的時(shí)候才能關(guān)聯(lián)本機(jī)目錄
# 我們數(shù)據(jù)持久化會(huì)用到這個(gè)東西,比如你的mysql圾另,這個(gè)就必不可少了
# 定義一個(gè)匿名卷
命令 鏡像使用的目錄
VOLUME /data
# 該命令會(huì)關(guān)聯(lián)本機(jī)目錄 創(chuàng)建一個(gè)匿名的卷霸株,同時(shí)把本地路徑/var/user/data 映射到容器的 /data目錄,也就是在容器中訪問/data就是訪問本地的/var/user/data 目錄
docker run -v /var/user/data:/data -t [image_tag_name]