羅湖附近公司做網(wǎng)站建設(shè)哪家服務(wù)周到百搜網(wǎng)絡(luò)科技有限公司
docker與虛擬機(jī)的區(qū)別
首先要知道三個層次
硬件層:計(jì)算機(jī)硬件
內(nèi)核層:與硬件交互,提供操作硬件的指令
應(yīng)用層: 系統(tǒng)應(yīng)用封裝內(nèi)核指令為函數(shù),便于程序員調(diào)用。用戶程序基于系統(tǒng)函數(shù)庫實(shí)現(xiàn)功能。?
docker在打包的時候直接把應(yīng)用層的函數(shù)庫也進(jìn)行打包,所以不管是linux的什么系統(tǒng)都可以跑docker。
虛擬機(jī)基于Hypervisor,這個技術(shù)可以模擬計(jì)算機(jī)硬件,所以可以運(yùn)行不同的操作系統(tǒng)。
?docker的架構(gòu)
鏡像和容器
docker和DockerHub
docker架構(gòu)?
?鏡像基本命令
拉取鏡像
docker pull ubuntu:20.04:拉取一個鏡像
docker pull nginx
列出本地所有鏡像
docker images
刪除鏡像
docker image rm ubuntu:20.04
docker rmi ubuntu:20.04
導(dǎo)出壓縮鏡像
docker save -o ubuntu_20_04.tar ubuntu:20.04
加載鏡像
docker load -i ubuntu_20_04.tar
創(chuàng)建某個容器的鏡像
docker [container] commit CONTAINER IMAGE_NAME:TAG
容器相關(guān)命令
容器生命周期管理命令
docker exec :在運(yùn)行的容器中執(zhí)行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]-d :分離模式: 在后臺運(yùn)行-i :即使沒有附加也保持STDIN 打開-t :分配一個偽終端
bash: 進(jìn)入容器后執(zhí)行的命令在容器 mynginx 中以交互模式執(zhí)行容器內(nèi) /root/runoob.sh 腳本:
runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh
http://www.runoob.com/在容器 mynginx 中開啟一個交互模式的終端:
runoob@runoob:~$ docker exec -i -t mynginx /bin/bash
root@b1a0703e41e7:/#
docker rm :刪除一個或多個容器。
docker rm [OPTIONS] CONTAINER [CONTAINER...]-f :通過 SIGKILL 信號強(qiáng)制刪除一個運(yùn)行中的容器。-l :移除容器間的網(wǎng)絡(luò)連接,而非容器本身。-v :刪除與容器關(guān)聯(lián)的卷。
docker run :創(chuàng)建一個新的容器并運(yùn)行一個命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]-i: 以交互模式運(yùn)行容器,通常與 -t 同時使用
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-d: 后臺運(yùn)行,并返回容器ID-P: 隨機(jī)端口映射,容器內(nèi)部端口隨機(jī)映射到主機(jī)的端口
-p: 指定端口映射,格式為:主機(jī)(宿主)端口:容器端口
--name="nginx-lb": 為容器指定一個名稱
docker kill?:殺掉一個運(yùn)行中的容器。
docker kill [OPTIONS] CONTAINER [CONTAINER...]-s :向容器發(fā)送一個信號殺掉運(yùn)行中的容器mynginxrunoob@runoob:~$ docker kill -s KILL mynginx
mynginx
運(yùn)行與暫停之間切換的兩條
docker pause 容器名或IDdocker unpause 容器名或ID
運(yùn)行與停止之間切換
docker start 容器名或IDdocker restart 容器名或IDdocker stop 容器名或ID
?容器操作命令
docker ps :?列出容器
docker ps [OPTIONS]-a :顯示所有的容器,包括未運(yùn)行的。-f :根據(jù)條件過濾顯示的內(nèi)容。--format :指定返回值的模板文件。-l :顯示最近創(chuàng)建的容器。-n :列出最近創(chuàng)建的n個容器。--no-trunc :不截?cái)噍敵觥?q :靜默模式,只顯示容器編號。-s :顯示總的文件大小。
docker inspect :?獲取容器/鏡像的元數(shù)據(jù)。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]-f :指定返回值的模板文件。-s :顯示總的文件大小。--type :為指定類型返回JSON。
docker top :查看容器中運(yùn)行的進(jìn)程信息,支持 ps 命令參數(shù)。
docker top [OPTIONS] CONTAINER [ps OPTIONS]
docker attach :連接到正在運(yùn)行中的容器。(建議不要用這個,用docker exec比較好)
區(qū)別如下:docker exec與docker attach的區(qū)別_Christina_2020的博客-CSDN博客
docker attach [OPTIONS] CONTAINER
docker exec -it CONTAINER bash 這個代替--sig-proxy=false 保證按下ctrl+c不會關(guān)閉容器
docker logs :?獲取容器的日志
docker logs [OPTIONS] CONTAINER-f : 跟蹤日志輸出--since :顯示某個開始時間的所有日志-t : 顯示時間戳--tail :僅列出最新N條容器日志
docker export :將文件系統(tǒng)作為一個tar歸檔文件導(dǎo)出到STDOUT。
docker export [OPTIONS] CONTAINER-o :將輸入內(nèi)容寫到文件。docker export -o xxx.tar CONTAINER:將容器CONTAINER導(dǎo)出到本地文件xxx.tar中docker export/import與docker save/load的區(qū)別:export/import會丟棄歷史記錄和元數(shù)據(jù)信息,僅保存容器當(dāng)時的快照狀態(tài)save/load會保存完整記錄,體積更大
docker port?用于列出指定的容器的端口映射
docker port [OPTIONS] CONTAINER
docker stats :?顯示容器資源的使用情況,包括:CPU、內(nèi)存、網(wǎng)絡(luò) I/O 等。
docker stats [OPTIONS] [CONTAINER...]--all , -a :顯示所有的容器,包括未運(yùn)行的。--format :指定返回值的模板文件。--no-stream :展示當(dāng)前狀態(tài)就直接退出了,不再實(shí)時更新。--no-trunc :不截?cái)噍敵觥?/code>
其他一些命令
docker cp xxx CONTAINER:xxx 或 docker cp CONTAINER:xxx xxx:在本地和容器間復(fù)制文件
docker rename CONTAINER1 CONTAINER2:重命名容器
docker update CONTAINER --memory 500MB:修改容器限制
docker數(shù)據(jù)卷
容器和數(shù)據(jù)耦合的問題
掛載好數(shù)據(jù)卷之后就可以在外面修改相關(guān)配置文件。?
?操作數(shù)據(jù)卷
掛載數(shù)據(jù)卷
?直接用宿主機(jī)目錄掛載到容器目錄
總結(jié)
自定義鏡像
?鏡像結(jié)構(gòu)
鏡像就是將應(yīng)用程序及其需要的系統(tǒng)函數(shù)庫,環(huán)境,配置,依賴打包而成。
?
?DockerFile
案例
? dockerfile文件命令如下
依賴一個基礎(chǔ)的鏡像,配置了JDK,又準(zhǔn)備了相對應(yīng)項(xiàng)目和入口文件,然后制作了一個項(xiàng)目鏡像。
# 指定基礎(chǔ)鏡像
FROM ubuntu:16.04
# 配置環(huán)境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local# 拷貝jdk和java項(xiàng)目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安裝JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置環(huán)境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口,java項(xiàng)目的啟動命令
ENTRYPOINT java -jar /tmp/app.jar
如果是基于一個完成度更高的鏡像來搭建,比如說一個配置好了jdk的ubuntu鏡像,那么就可以減少配置的流程。
?DockerCompose
version是命令的版本,這里有多個版本。?
docker run \--name mysql \-e MYSQL_ROOT_PASSWORD=123 \-p 3306:3306-v tmp/mysgl/data:/var/lib/mysql \-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \-d \
mysql:5.7.25
?這個里面將上面這個docker run語句中的必要參數(shù)都轉(zhuǎn)換為了docker指令。在微服務(wù)集群里面mysql只供給集群內(nèi)的服務(wù),不需要暴露。然后這里默認(rèn)就是-d,后臺運(yùn)行。
構(gòu)建鏡像
docker build -t web:1.0 .
創(chuàng)建容器
docker run --name web -p8090:8090 -d web:1.0
而第二個則是將這兩個命令集合,里面的 . 就是從當(dāng)前目錄先構(gòu)建鏡像再運(yùn)行容器。屬于臨時構(gòu)建鏡像并運(yùn)行。
實(shí)踐的視頻講的不行。
docker鏡像倉庫
?
docker私人倉庫除非是做運(yùn)維,不然沒什么必要搭建。
官方搭建是沒有UI界面的,有人人提供的UI界面。
?部署好之后就如下所示