主頁 > 後端開發 > 【學習筆記】學習Docker,看完這篇超詳細的教程就足夠了

【學習筆記】學習Docker,看完這篇超詳細的教程就足夠了

2020-10-07 11:06:18 後端開發

本文為觀看B站狂神的視頻學習Docker時所整理的筆記,中間加了一些自己的理解,如果對大家有所幫助,還希望點贊支持一下,后續我會繼續將自己遇到的Docker問題以及學習的新的知識全部整理添加到本文后面或者整理發布新的文章,如果感興趣可以關注一波,

目錄

  • Docker的概述
    • 為什么需要Docker?
    • 簡述虛擬機和Docker容器的區別
    • Docker中的DevOps(開發、運維)
    • Docker的基本組成
  • Docker的安裝
    • 前期準備(看看即可)
    • 開始安裝
    • 如何卸載Docker(了解即可)
    • 配置阿里云鏡像加速
    • Run的流程以及Docker原理
  • Docker的常用命令
    • 查看資訊和幫助命令
    • 鏡像命令
    • 容器命令
    • 常用的其他命令
      • 后臺啟動容器
      • 查看系統CPU狀態
      • 查看日志
      • 查看容器中行程資訊
      • 查看鏡像中的元資料
      • 進入當前正在運行的容器
      • 從容器中拷貝檔案到主機上
  • 常用命令小結
  • 練習
    • 練習一:使用Docker安裝Nginx
    • 練習二:使用Docker部署Tomcat
    • 練習三:使用Docker部署Elasticsearch、Kibana

Docker的概述

在這里插入圖片描述
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源,
Docker的官網地址:https://www.docker.com/
檔案地址:https://docs.docker.com/
倉庫地址:https://hub.docker.com/

為什么需要Docker?

傳統的開發問題

  • 環境(切換/配置)麻煩
    在開發一個產品的途中,時常會出現的問題就是:“在我的電腦上可以運行,而到了另外一個開發人員的電腦上就不能使用的問題”,或者是因為版本更新導致服務不可用等等,這對于運維人員來說,壓力十分大,而環境配置是一個非常頭疼的問題,每一個機器都需要部署環境(Redis集群、ES…)十分麻煩且費時費力,并且配置的環境不能跨平臺,非常不方便,
  • 應用之間的沖突(隔離性)
    假如我們將開發的兩個應用部署到同一個服務器上,如果一個應用出了問題,導致CPU出問題上升到了100%,那么第二個應用也會受到關聯;并且如果兩個應用分別使用不同的語言或者技術堆疊,當安裝在同一個服務器上的時候可能就會造成各種沖突/無法兼容,到時候除錯就非常頭疼,如下圖所示:

Docker的出現解決以上問題

  • 關于環境問題解決方案
    Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實作虛擬化,將環境構建打包成一個鏡像發布到網上,想要用這個環境的時候就直接拉取一份就OK了,

  • 解決應用之間隔離問題
    Docker核心思想就是使用容器化技術,打包裝箱,每個箱子是互相隔離的,容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低,如下圖所示:
    在這里插入圖片描述

簡述虛擬機和Docker容器的區別

這里參考知乎上大佬的說法:https://www.zhihu.com/question/48174633
服務器虛擬化解決的核心問題是資源調配,而容器解決的核心問題是應用開發、測驗和部署,

  • 使用Docker容器和使用虛擬機在運行多個相互隔離的應用時對比,Docker要簡潔很多;
  • Docker守護行程可以直接與主作業系統進行通信,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離,并將各個容器互相隔離,
  • 虛擬機啟動需要數分鐘,而Docker容器可以在數毫秒內啟動,由于沒有臃腫的從作業系統,Docker可以節省大量的磁盤空間以及其他系統資源,
  • 虛擬機更擅長于徹底隔離整個運行環境,例如,云服務提供商通常采用虛擬機技術隔離不同的用戶,而Docker通常用于隔離不同的應用,例如前端,后端以及資料庫,
  • 傳統的虛擬機,首先是虛擬出一條硬體,運行一個完整的作業系統,然后在這個系統上安裝和運行軟體;
  • Docker容器內的應用直接運行在宿主機的內容,容器是沒有自己的內核的,也沒有虛擬我們的硬體,所以就輕巧了很多;

Docker中的DevOps(開發、運維)

(1)應用更快速的交付和部署

  • 傳統:一堆的幫助檔案和安裝程式
  • Docker:打包鏡像發布測驗,一鍵運行

(2)更快捷的升級和擴縮容

  • 使用了Docker以后我們部署應用就像搭積木一樣;
  • 專案打包成一個鏡像

(3)更簡單的系統運維

  • 在容器話之后我們的開發、測驗環境都是高度一致的

(4)更高效的計算資源利用

  • Docker是內核級別的虛擬化,可以再一個物理機上可以運行很多的容器實體!服務器的性能可以被壓榨到極致,

Docker的基本組成

在這里插入圖片描述

  • 鏡像(image):docker鏡像就好比是一個模板,可以通過這個模板來創建容器服務,tomcat鏡像—>run---->tomcat01容器(提供服務),通過這個鏡像可以創建多個容器(最終服務運行或者專案運行就是在容器中運行的),

  • 容器(container):docker利用容器技術,獨立運行一個或者一組應用,通過鏡像來創建的,啟動、停止、洗掉、基本命令,目前就可以把這個容器理解為就是一個簡易的Linux系統,

  • 倉庫(repository):倉庫就是存放鏡像的地方,倉庫分為公有倉庫和私有倉庫,Docker Hub(默認是國外的)、阿里云…都有容器服務器(配置鏡像加速)

Docker的安裝

前期準備(看看即可)

不一樣的話也行,主要是看Centos的版本
運行環境:阿里云服務器 Centos 7
連接工具:XShell 5
需要掌握:Linux的基本命令
由于這里的運行環境是Centos 7,與Centos 6的命令還是有一些區別的,但是區別不大,后面我會將命令詳細的介紹,

查看環境

  • 系統內核是3.10以上的
[root@oldou ~]#  uname -r
3.10.0-957.21.3.el7.x86_64
  • 查看系統的版本:
    cat /etc/os-release
    在這里插入圖片描述

開始安裝

這里可以參考官網的幫助檔案進行安裝
在這里插入圖片描述
在這里插入圖片描述
地址:https://docs.docker.com/engine/install/centos/

第一步:卸載舊版本(運行以下代碼即可)

 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

在這里插入圖片描述
第二步:安裝yum工具包
命令:yum install -y yum-utils

第三步:設定鏡像倉庫

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   
    # 這里默認是國外的,十分的慢,我們用以下阿里云的地址
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   
    # 這是阿里云的docker鏡像地址,建議使用這個 

在這里插入圖片描述
更新一下yum索引:
命令:yum makecache fast
在這里插入圖片描述
第四步:安裝Docker
docker-ce:社區版 ee:企業版
命令:yum install docker-ce docker-ce-cli containerd.io
在這里插入圖片描述
注意:以上是安裝Docker最新的版本,如果想要安裝指定的版本,就需要進行以下命令:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
這里的<VERSION_STRING>表示版本,
在這里插入圖片描述
第五步:啟動Docker
命令:systemctl start docker
注意:Centos6使用的是service,而Centos7使用的都變成了systemctl

第六步:查看Docker是否安裝成功
命令:docker version
在這里插入圖片描述
查看Docker的狀態: systemctl status docker
在這里插入圖片描述
第七步:測驗hello-word
命令:docker run hello-world
在這里插入圖片描述
第八步:查看一下剛剛下載的hello-word的這個鏡像
命令:docker images
在這里插入圖片描述

如何卸載Docker(了解即可)

官網中有介紹,下面我給出來:
第一步:卸載依賴
命令:yum remove docker-ce docker-ce-cli containerd.io

第二步:洗掉資源 安裝的資源都在/var/lib/docker目錄下
命令:rm -rf /var/lib/docker

這樣就OK了,

配置阿里云鏡像加速

由于我們拉取鏡像的時候,使用國外的下載太慢了,當然我們這里是使用國內阿里云的,所以肯定比國外的訪問和下載快,這個時候再配個加速器就美滋滋,

第一步:登錄我們的阿里云控制臺,然后找到容器鏡像服務
在這里插入圖片描述
第二步:找到鏡像加速器---->鏡像加速地址
在這里插入圖片描述
第三步:配置使用(直接復制命令運行即可)

(1)在服務器中創建一個目錄sudo mkdir -p /etc/docker

(2)編輯組態檔

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://7ih0bv9h.mirror.aliyuncs.com"]
}
EOF

在這里插入圖片描述
(3)將服務重啟:sudo systemctl daemon-reload

(4)啟動docker:sudo systemctl restart docker

這樣就配置完成了,

Run的流程以及Docker原理

回顧hello-word的流程
在這里插入圖片描述
就拿我們運行hello-word來說,一開始我們運行hello-word的時候,Docker會在本機中尋找鏡像,而本機中沒有這個鏡像,所以就回去我們配置的Hub上去下載鏡像,如果找到了就將鏡像下載到本地運行,如果沒有就回傳錯誤,如下所示:
在這里插入圖片描述
底層原理

(1)Docker是怎么作業的?

  • Docker是一個Client-Server結構的系統,Docker的守護行程運行在本機上(運行在后臺,和mysql一樣),通過Socket從客戶端訪問,
  • DockerServer接收到Docker-Client的指令,就會執行這個命令,
    在這里插入圖片描述
    (2)Docker為什么比虛擬機(VM)快?
    在這里插入圖片描述
  • Docker利用的是宿主機的內核,VM需要的是Guest OS
    所以說,新建一個容器的時候,Docker不需要像虛擬機那樣重新加載一個作業系統內核,避免引導,虛擬機是加載Guest OS,是分鐘級別的,而Docker利用的是宿主機的作業系統,省略了這個復雜的程序,
    在這里插入圖片描述

Docker的常用命令

官方幫助檔案:https://docs.docker.com/engine/reference/run/

查看資訊和幫助命令

命令:docker version # 查看docker的版本資訊
在這里插入圖片描述
命令:docker info # 顯示Docker的系統資訊,包括鏡像和容器的數量

命令:docker xxx --help #幫助命令,可以顯示docker的所有命令

鏡像命令

查看鏡像
命令:docker images # 查看所有本地的主機上的鏡像
在這里插入圖片描述

REPOSITORY  :鏡像的倉庫源
TAG					 :鏡像的標簽
IMAGE ID		 :鏡像的ID
CERATED		 :鏡像的創建時間
SIZE				 :鏡像的大小

docker  images  [可選項]
-a    , --all        # 列出所有鏡像
-q	   , --quiet    # 只顯示鏡像的ID

搜索鏡像
命令:docker search 鏡像名 # 搜索鏡像

可選項,通過搜過過濾
 --filter-STARS=3000   #搜索出來的鏡像修飾STARS大于3000的

在這里插入圖片描述
下載鏡像
命令:docker pull 鏡像名 [:tag]# 下載鏡像,默認是下載最新版 latest ,
在這里插入圖片描述
如果是下載指定版本的鏡像,那么就需要指定:版本號,如下所示:
docker pull mysql:5.7 # 指定版本下載 下載mysql5.7

洗掉鏡像

# 洗掉鏡像  -f就是全部洗掉,后面的條件是根據什么來洗掉,這里是根據容器的id進行洗掉
docker  rmi -f  容器id   

# 洗掉多個鏡像
docker  rmi -f  容器id  容器id 容器id    

# 洗掉所有的鏡像 
docker  rmi -f $(docker images -aq)  

容器命令

說明:我們有了鏡像才可以去創建容器,Linux,下載一個centos鏡像來進行學習,

下載centos鏡像
命令:docker pull centos

新建容器并啟動
命令:docker run [可選引數] image

引數說明:
--name="Name" : 容器名字 ,tomcat01、tomcat02,用來區分容器
-d :后臺方式運行                                
-it:使用互動方式運行,進入容器查看內容
-p :指定容器的埠   -p  8080:8080  
        -p     ip:主機埠:容器埠                                
        -p     主機埠:容器埠(常用方式)
        -p     容器埠                                                     
        容器埠                                                             
-p: 隨機指定埠     

測驗,啟動并進入容器
命令:docker run -it centos /bin/bash #啟動容器
命令: ls # 查看容器內的centos,基礎版本,很多命令都是不完善的
命令:exit # 從容器中退回到主機

列出所有運行中的容器
命令:docker ps [可選引數] # 列出當前正在運行的程式

-a             #列出當前正在運行的容器+帶出歷史運行過的容器
-n=?      #顯示最近創建的容器  
-p            #只顯示容器的編號

在這里插入圖片描述

退出容器
命令:

exit                     # 直接停止容器并退出
Ctrl + P + Q             # 容器不停止退出

洗掉容器

docker rm  容器id        # 洗掉指定的容器,不能洗掉正在運行的容器
docker rm -f $(docker ps -aq)       # 洗掉所有的容器   
docker ps -a -q|xargs docker rm     # 洗掉所有的容器

啟動和容器的操作

docker start 容器id                  # 啟動容器
docker restart 容器id                # 重啟容器
docker stop 容器id                   # 停止正在運行的容器
docker kill 容器id                   # 強制停止當前正在運行的容器 

常用的其他命令

后臺啟動容器

命令:docker run -d 鏡像名

docker run -d centos            # 后臺啟動centos
  • 問題:使用docker ps查看,發現 centos停止了

  • 常見的坑:docker容器使用后臺運行的時候就必須要一個前臺執行緒,不然docker發現沒有應用就會自動停止

  • 例如:nginx容器啟動后,發現自己沒有提供服務就會立刻停止,就是沒有程式了,

查看系統CPU狀態

命令:docker stats [容器id]
在這里插入圖片描述

查看日志

命令:docker logs -tf --tail 容器,沒有日志

  • 撰寫一段shell腳本
docker run -d centos /bin/sh -c "while true; do echo oldouTest;sleep 1;done"
  • 使用docker ps去查看
  • 顯示日志 :docker logs -tf --tail number 容器id
-tf                  #顯示日志
--tail number        #要顯示日志條數 

例如:docker logs -tf --tail 10 容器id

查看容器中行程資訊

命令:docker top 容器id

查看鏡像中的元資料

命令:docker inspect 容器id

進入當前正在運行的容器

我們的容器通常都是使用后臺方式運行的,需要進入容器,修改一些配置
方式一:
命令:docker exec -it 容器id bashShell
例如:docker exec -it bb6ddb943ea5 /bin/bash
在這里插入圖片描述
方式二:
命令:docker attach 容器id
在這里插入圖片描述
兩種方式的對比

  • docker exec: 進入容器后開啟一個新的終端,可以在里面操作(常用)
  • docker attach:進入容器正在執行的終端,不會啟動新的行程

從容器中拷貝檔案到主機上

在這里插入圖片描述

# 進入到容器內:
[root@oldou home]# docker exec -it bb6ddb943ea5 /bin/bash  
[root@bb6ddb943ea5 /]# cd home
[root@bb6ddb943ea5 home]# ls

# 創建一個java檔案
[root@bb6ddb943ea5 home]# touch Test.java 
[root@bb6ddb943ea5 home]# ls
Test.java

# 退出容器回到主機
[root@bb6ddb943ea5 home]# exit
exit

#查看當前運行的容器
[root@oldou home]# docker ps

# 將容器內/home目錄下的Test.java檔案拷貝到主機的home目錄下
[root@oldou home]# docker cp bb6ddb943ea5:/home/Test.java /home
[root@oldou home]# ls
Test.java

拷貝只是一個手動的程序,后面學習了 -v 卷的技術時,可以實作同步資料

常用命令小結

在這里插入圖片描述

命令英文描述中文意思
attachAttach to a running container當前shell下attach連接指定運行鏡像
buildBuild an image from a Dockerfile通過Dockerfile定制鏡像
commitCreate a new image from a container changes提交當前容器為新的境像
cpcopy files/folders from the containers filesystem to the host path從容器中拷貝指定檔案或者目錄到宿主機中
createCreate a new container創建一個新的容器,同run.但不啟動容器
diffInspect changes on a container’s filesystem查看docker容器變化
eventsGet real time events from the server從docker服務中獲取容器實時事件
exportStream the contents of a container as a tar archive匯出容器的內容流作為一個 tar歸檔檔案[對應import]
historyShow the history of an image展示一個境像形成歷史
imagesList images列出系統當前所有鏡像
importCreate a new filesystem image from the contents of a tarball從tar包中的內容創建一個新的檔案系統映像[對應export]
infoDisplay system-wide information顯示系統相關資訊
inspectReturn low-level information on a container查看容器詳細資訊
killKill a running containerkill指定docker容器
loadLoad an image from a tar archive從—個 tar包中加載一個鏡像[對應save]
loginRegister or Login to the docker registry server注冊或者登陸一個docker源服務器
logoutLog out from a Docker registry server從當前Docker registry退出
logsFetch the logs of a container輸出當前容器日志資訊
portLookup the public-facing port which is NAT-ed to PRIVATE_PORT查看映射埠對應的容器內部源端
pausePause all processes within a container暫停容器
psList containers列出容器串列
pullPull an image or a repository from the docker registry server從docker鏡像服務器中拉取指定鏡像或者庫鏡像
pushpush an image or a repository to the docker registry server推送指定鏡像或者庫鏡像至docker源服務器
restartRestart a running container重啟運行的容器
rmRemove one or more containers移除—個或者多個容器
rmiRemove one or more images移除一個或多個境像[無容器使用該鏡像才可洗掉,否則需洗掉相關容器才可能繼續或者 -f 強制洗掉
runRun a command in a new container創建—個新的容器并運行一個命令
saveSave an image to a tar arehive保存一個鏡像為—個tar包「對應load]
searchSearch for an image on the Docker Hub在docker hub中搜索鏡像
startstart a stopped containers啟動容器
stopstop a stopped containers停止容器
tagTag an image into a repository給源中鏡像打標簽
topLookup the running processes of a container查看容器中運行的行程資訊
unpauseUnpause a paused container取消暫停容器
versionshow the docker version information查看docker版本號
waitBlock until a container stops,then print its exit code截取容器停止時的退出狀態值

練習

練習一:使用Docker安裝Nginx

官網:https://hub.docker.com/_/nginx

第一步:搜索鏡像(這里建議去docker Hub上查找一下版本資訊,上面還有幫助檔案介紹)
命令:docker search nginx

第二步:下載鏡像
命令:docker pull nginx

第三步:查看鏡像并且啟動
命令:docker images # 查看所有鏡像

**命令:docker run -d --name nginx01 -p 3344:80 nginx

-d 表示后臺運行,--name 表示給容器起名字,而nginx01表示起的名字,
-p 宿主機埠 :容器內部埠

后面的3344表示主機開發的3344埠,80表示容器內部的埠,這里表示將80埠映射到外部的3344,
可以通過公網的3344訪問到docker里面的80埠,后面的nginx表示的是鏡像名字,

在這里插入圖片描述
第四步:查看容器并且運行測驗
命令:docker ps #查看是否啟動
命令:curl localhost:3344
在這里插入圖片描述
關閉防火墻systemctl stop firewalld

到這一步的時候我們就可以使用 公網ip:3344 在瀏覽器訪問了
在這里插入圖片描述
第五步:進入Nginx容器
命令:docker exec -it nginx01 /bin/bash #進入容器

命令:whereis nginx

命令:cd /etc/nginx

命令:ls查看

命令:exit #退出

命令:docker stop 容器id #停止Nginx容器
在這里插入圖片描述
埠暴露的概念:
在這里插入圖片描述
思考問題:我們每次改動nginx組態檔,都需要進入容器內部?十分的麻煩,我要是可以在容器外部提供一個映射路徑,達到在容器修改檔案名,容器內部就可以自動修改?
使用 -v資料卷,

練習二:使用Docker部署Tomcat

官網:https://hub.docker.com/_/tomcat

方式一:

  • 官方給出的命令:
    docker run -it --rm tomcat:9.0 # 下載并啟動
    上面介紹Nginx的啟動都是后臺啟動,停止了容器以后,容器還是可以查到,并且占用著配置的埠,
    使用官方給出的 docker run -it --rm tomcat:9.0 ,一般用于測驗,用完停止就洗掉

方式二:
還是使用之前的方式,

  • 第一步:搜索鏡像(這里建議去docker Hub上查找一下版本資訊,上面還有幫助檔案介紹)
    命令:docker search tomcat

  • 第二步:下載鏡像
    命令:docker pull tomcat # 這是下載最新版的tomcat
    命令: docker pull tomcat:7.0 # 指定版本號

  • 第三步:查看鏡像并且啟動
    命令:docker images # 查看所有鏡像
    命令:docker run -d --name tomcat01 -p 3355:8080 tomcat:7.0

-d 表示后臺運行,--name 表示給容器起名字,而tomcat01表示起的名字,
-p 宿主機埠 :容器內部埠

后面的3355表示主機開發的3355埠,8080表示容器內部的埠,這里表示將8080埠映射到外部的3355,
可以通過公網的3355訪問到docker里面的8080埠,后面的tomcat表示的是鏡像名字,

我們這個時候去瀏覽器訪問發現,報了404例外,那我們進入到tomcat容器內部查看一下原因.

  • 第四步:進入容器查看原因
    命令:docker exec -it tomcat01 /bin/bash
    當我們使用ll命令時竟然不能使用,只能使用ls命令查看,同時進入到webapps目錄下發現這個目錄竟然是空的,

發現問題:
1、Linux的命令少了;
2、webapps目錄下沒有檔案;

原因:
阿里云的鏡像默認是最小的鏡像,它把所有不必要的都剔除掉了,保證最小可運行的環境,

解決辦法:
在tomcat目錄下有一個webapps.dist目錄,這個目錄下有我們所需要的檔案,也就是webapps目錄所需要的檔案,我們將這個檔案中的內容全部拷貝到webapps下,

  • 第五步:拷貝資源
    命令:cp -r webapps.dist/* webapps

這樣我們再去瀏覽器中去訪問就可以訪問到了,

思考問題:我們以后要部署專案,如果每次都要進入容器是不是十分麻煩?要是可以在容器外部提供一個映射路徑,webapps ,我們在外部放置專案,就自動同步到內部就好了!

練習三:使用Docker部署Elasticsearch、Kibana

由于暫時沒有學過Elasticsearch,所以暫時沒有做這個部分的筆記,只是暫時看了一遍,后續補上…

后續筆記待更新中…

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161141.html

標籤:java

上一篇:云上應用安全

下一篇:Mysql資料庫優化

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more