特斯拉高管:特斯拉的車輛都是聯網的,可以說是輪子上的計算機
Docker
vm: 建立作業系統例項
docker: 建立軟體容器
論是基於翻譯和模擬的全虛擬化技術、半虛擬化技術,還是有了CPU硬體加持下的全虛擬化技術,其虛擬化的目標都是一臺完整的計算機,擁有底層的物理硬體、作業系統和應用程式執行的完整環境。
為了讓虛擬機器中的程式實現像在真實物理機器上執行“近似”的效果,背後的HyperVisor做了大量的工作,付出了“沉重”的代價。
雖然HyperVisor做了這麼多,但你有沒有問過虛擬機器中的程式,這是它想要的嗎?或許HyperVisor給的太多,而目標程式卻說了一句:你其實可以不用這樣辛苦。
確實存在這樣的情況,虛擬機器中的程式說:我只是想要一個單獨的執行執行環境,不需要你費那麼大勁去虛擬出一個完整的計算機來。虛擬出一臺計算機的成本高還是隻虛擬出一個隔離的程式執行環境的成本高?答案很明顯是前者。一臺物理機可能同時虛擬出10臺虛擬機器就已經開始感到乏力了,但同時虛擬出100個虛擬的執行環境卻還是能夠從容應對,這對於資源的充分利用可是有巨大的好處。
近幾年大火的容器技術正是在這樣的指導思想下誕生的。
不同於虛擬化技術要完整虛擬化一臺計算機,容器技術更像是作業系統層面的虛擬化,它只需要虛擬出一個作業系統環境。
install
# 從軟體倉庫安裝 docker yum install -y docker # 啟動 docker 服務 systemctl start docker # 為 docker 設定開啟自啟 systemctl enable docker # Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. # 檢視 docker 服務詳情 docker info
uninstall
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
dir
/var/lib/docker/
包含映象、容器、卷、網路等內容, 解除安裝後不會自動刪除
script
拉取映象:
docker pull <映象名稱>[:映象版本]
檢視本地映象列表:
docker images [映象名稱關鍵字]
刪除映象:
# 通過【映象名稱:映象版本(預設為 latest)】/【映象 id】 刪除映象
docker rmi <映象標識>
# 刪除所有映象 (強制刪除已存在例項容器的映象, 無法刪除正在執行中的容器所對應的映象)
docker rmi -f $(docker images -aq)
docker rmi -f `docker images -aq`
檢視容器列表:
# 檢視正在執行中的容器
docker ps
# 檢視所有容器
docker ps -a
刪除容器:
# 通過【容器 id】/【容器 name】 刪除容器
docker rm <容器標識>
# 強制刪除所有容器
docker rm -f $(docker ps -aq)
新建容器:
docker run [options] <映象標識> [command]
-d # 以後臺模式啟動容器, docker 容器內 1 號程序結束時, 會自動關閉該容器
-p localPort:containPort # 為容器設定埠對映
-t # 為容器分配一個模擬終端, 否則將以無模擬終端的模式下執行(沒有 tab 補全)
-i # stdin, 以互動模式進入容器, 否則無法與容器進行輸入輸出互動
--name <name> # 為容器設定 name 屬性
# -i (是否需要互動)、-t (是否開啟一個終端)、-d (是否在後臺執行)
# 容器退出後立即刪除該容器
docker run -it --rm --name="test_centos" centos:centos7.9.2009
docker exec -it <容器標識> bash # 容器內開啟一個終端並切換到宿主機前臺來執行命令, 這裡的 bash 就是一個 command
docker attach <容器標識> # 進入容器內的 1 號程序 (結束該終端後容器立即停止)
ctrl + d # 從容器的終端上登出並返回宿主機終端
# 由於不能使用 Ctrl + c 向容器內的終端傳送 SIGINT 訊號, 因此使用 Ctrl + d 向終端傳送 EOF
ctrl + q + p # 將容器的終端切換後後臺執行並返回宿主機終端
關閉容器:
# 立即關閉容器, 預設等待 10 秒後再關閉
docker stop -t 0 <容器標識>
# 強制結束容器的執行
docker kill <容器標識>
啟動容器:
# 啟動容器
docker start <容器標識>
# 啟動並直接與容器進行互動
docker start -i <容器標識>
重啟容器:
docker restart <容器標識>
docker restart -i <容器標識>
容器內的日誌:
# 檢視 1 號程序的 STDOUT
docker logs <容器標識>
# 跟蹤日誌輸入
docker logs -f <容器標識>
# 檢視最後 5 行的日誌資訊
docker logs -tail 5 <容器標識>
# 在每行的開頭顯示時間資訊
docker logs -t <容器標識>
# 檢視指定時間以後的日誌
docker logs --since 2021-10-22T12:45:53.381769000Z <容器標識>
檢視容器詳細資訊:
docker inspect <容器標識>
檔案傳輸:
# 向容器內複製檔案
docker cp localFile <容器標識>:targetFile
# 向宿主機複製檔案
docker cp <容器標識>:sourceFile targetFile
# docker cp from to
打包映象:
docker commit -m "msg" <容器標識>[ 新映象名稱][:新映象 tag]
修改映象 tag 資訊:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
為容器指定容器卷:
# 指定資料集對映路徑
docker run -v 宿主機目錄:容器目錄的絕對路徑 <映象標識>
# 指定一個容器只讀的資料卷
docker run -v $PWD/conf:/root/conf:ro <映象標識>
# 掛載已建立的資料卷系統
docker run -d --mount type=volume,source=<資料卷名稱>,target=<容器內的目標路徑> <映象標識>
# 使用已設定的資料卷規則
docker run -d --volumes-from <存在資料卷的容器標識> <映象標識>
構建 Dockerfile:
docker build -f <Dockerfile> -t <name>:<tag> .
# 上下文路徑下不要放無用的檔案,因為會一起打包傳送給 docker 引擎,如果檔案過多會造成過程緩慢。
為容器指定網路模式:
docker run --net=<bridge | host | none | container:xxx> <映象標識>
管理資料卷系統:
# 建立一個數據卷系統
docker volume create
# 檢視所有的資料卷系統
docker volume ls
管理網路環境:
# 檢視所有網路環境
docker network ls
# 檢視指定網路環境詳情
docker network inspect <netword id>
# 建立一個新的網路環境
docker network create -d bridge my-net
# 新建容器並指定到新建的網路環境中
docker run --network my-net <映象標識>
# 為容器指定網路環境
docker connect
映象 image
映象就是一個容器的模板
容器 container
容器就是一個映象所對應的例項, 一個映象可以執行出來多個容器, 因此映象就像是一個模板, 而容器是這個模板的產物。
容器卷 valume
網路模式 net
docker 安裝後會自動在宿主機上建立一張 docker0 網絡卡作為橋接模式的閘道器。
<預設> --net=bridge (docker0 網絡卡為容器分配一張網絡卡, 這張網絡卡掛載在 docker0 下)
--net=host (容器直接使用宿主機的網絡卡, 可以看到宿主機上的所有網絡卡)
--net=none (為容器建立獨立的名稱空間, 但是不配置網絡卡資訊, 預設配置中只有 lo)
--net=container:<容器id> (多個容器共用一張 docker0 所分配出來的的網絡卡)
常用軟體
mysql
# 指定資料路徑對映
docker run -p 3306:3306 --name $some-mysql -v /data/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=$my-secret-pw -d mysql:$tag
# 指定配置檔案路徑對映
docker run -p 3306:3306 -v /etc/container/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=$my-secret-p -d mysql:$tag
# 匯入 sql 檔案
docker exec -i $some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
# 指定時區
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=$my-secret-pw -e TZ='Asia/Shanghai' -d mysql:$tag
# 配置預設編碼
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=$my-secret-pw -d mysql:$tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker run -p 3306:3306 --name "main_mysql" -v /data/docker/mysql:/var/lib/mysql -v /etc/container/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD="Qc@mysql" -e TZ='Asia/Shanghai' -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
FastDFS
docker pull ygqygq2/fastdfs-nginx
docker run -dit -p 8888:8080 --name fastdfs_tracker -v /var/fdfs/tracker:/var/fdfs ygqygq2/fastdfs-nginx:latest tracker
docker run -dit --network=container:$trackerID --name fastdfs_storage0 -e TRACKER_SERVER=$trackerIP:22122 -v /var/fdfs/storage0:/var/fdfs ygqygq2/fastdfs-nginx:latest storage
Docker File
Dockerfile --> Image --> Container
.java --> .class --> app
FORM: 基礎映象
MAINTAINER: 設定 Dockerfile 的作者名稱
WORKDIR: 工作目錄, 進入容器的初始目錄
COPY: 將上下文路徑中的檔案複製到映象中
ADD: 複製並自動解壓指定檔案 (不保留壓縮包)
RUN: 執行 command (在 docker build 時執行, 可以多次使用)
RUN ls -al 等價於 RUN ["ls", "-al"]
# shell 格式 <==> exec 格式
# Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。
RUN yum install -y wget \
&& wget -O apache-tomcat-9.0.53.tar.gz "https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz" \
&& tar -zxf apache-tomcat-9.0.53.tar.gz
CMD: 執行 command (在 docker run 時執行, 多個 CMD 指令中前者會被後者所覆蓋, 並且 docker run 中的 command 不為空時將作為最終的 CMD)
ENTRYPOINT: 同 CMD 執行機制一樣, 但是不會被 docker run 中的 command 所覆蓋, 而是追加在 ENTRYPOINT 之後 (利用 ENTRYPOINT 和 CMD 可以實現預設引數)
ENV: 設定環境變數
ARG: 設定 Dockerfile 中的變數
VOLUME: 定義匿名資料卷
EXPOSE: 向外提示內部使用的埠 (docker run -P 會自動對映 EXPOSE 所指定的埠)