主頁 > 後端開發 > Docker

Docker

2020-09-15 22:02:20 後端開發

Docker簡介

什么是虛擬化

  在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種物體資源,如服務器、網路、記憶體及存盤等,予以抽象、轉換后呈現出來,打破物體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源,這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制,一般所指的虛擬化資源包括計算能力和資料存盤,

  在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體對資源充分利用,

  虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等,

 

什么是Docker

  Docker 是一個開源專案,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業余專案,它基于 Google 公司推出的 Go 語言實作, 專案后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案代碼在GitHub上進行維護,

 

  Docker 自開源后受到廣泛的關注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc,Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用,

  Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案, Docker 的基礎是 Linux 容器(LXC)等技術,

  在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便,用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單,

 

為什么選擇Docker

  1. 上手快:用戶只需要幾分鐘,就可以把自己的程式“Docker化”,Docker依賴于“寫時復制”(copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,代碼即改”的境界,隨后,就可以創建容器來運行應用程式了,大多數Docker容器只需要不到1秒中即可啟動,由于去除了管理程式的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶盡可能的充分利用系統資源,

  2. 職責的邏輯分類:使用Docker,開發人員只需要關心容器中運行的應用程式,而運維人員只需要關心如何管理容器,Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程式要部署的生產環境一致性,從而降低那種“開發時一切正常,肯定是運維的問題(測驗環境都是正常的,上線后出了問題就歸結為肯定是運維的問題)”,
  3. 快速高效的開發生命周期:Docker的目標之一就是縮短代碼從開發、測驗到部署、上線運行的周期,讓你的應用程式具備可移植性,易于構建,并易于協作,(通俗一點說,Docker就像一個盒子,里面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取,)
  4. 鼓勵使用面向服務的架構:Docker還鼓勵面向服務的體系結構和微服務架構,Docker推薦單個容器只運行一個應用程式或行程,這樣就形成了一個分布式的應用程式模型,在這種模型下,應用程式或者服務都可以表示為一系列內部互聯的容器,從而使分布式部署應用程式,擴展或除錯應用程式都變得非常簡單,同時也提高了程式的內省性,(當然,可以在一個容器中運行多個應用程式)

 

Docker和虛擬機比較

下面的圖片比較了Docker和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實作虛擬化,直接復用本地主機的作業系統,而傳統方式則是在硬體層面實作,

與傳統的虛擬機相比,Docker又是體現為啟動速度快、占用體積小,

使用上的區別如下圖:

 

 

Docker組件

Docker是一個客戶端-服務器(C/S)架構程式,Docker客戶端只需要向Docker服務器或者守護行程發出請求,服務器或者守護行程將完成所有作業并回傳結果,Docker提供了一個命令列工具Docker以及一整套RESTful API,你可以在同一臺宿主機上運行Docker守護行程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護行程,

 

Docker服務器與客戶端

  Docker是一個客戶端-服務器(C/S)架構程式,Docker客戶端只需要向Docker服務器或者守護行程發出請求,服務器或者守護行程將完成所有作業并回傳結果,Docker提供了一個命令列工具Docker以及一整套RESTful API,你可以在同一臺宿主機上運行Docker守護行程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護行程,

Docker鏡像與容器

  鏡像是構建Docker的基石,用戶基于鏡像來運行自己的容器,鏡像也是Docker生命周期中的“構建”部分,鏡像是基于聯合檔案系統的一種層式結構,由一系列指令一步一步構建出來,例如:添加一個檔案、執行一個命令、打開一個視窗,也可以將鏡像當作容器的“源代碼”,鏡像體積很小,非常“便攜”,易于分享、存盤和更新,

  Docker可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容器即可,容器是基于鏡像啟動起來的,容器中可以運行一個或多個行程,我們可以認為,鏡像是Docker生命周期中的構建或者打包階段,而容器則是啟動或者執行階段,  容器基于鏡像啟動,一旦容器啟動完成后,我們就可以登錄到容器中安裝自己需要的軟體或者服務, 

  所以Docker容器就是:一個鏡像格式,一些列標準操作,一個執行環境,

  Docker借鑒了標準集裝箱的概念,標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟體,

  和集裝箱一樣,Docker在執行上述操作時,并不關心容器中到底裝了什么,它不管是web服務器,還是資料庫,或者是應用程式服務器什么的,所有的容器都按照相同的方式將內容“裝載”進去,

  Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然后下載到一個物理的或者虛擬的服務器來測驗,在把容器部署到具體的主機中,像標準集裝箱一樣,Docker容器方便替換,可以疊加,易于分發,并且盡量通用,

 

Registry(注冊中心)

  Docker用Registry來保存用戶構建的鏡像,Registry分為公共和私有兩種,Docker公司運營公共的Registry叫做Docker Hub,用戶可以在Docker Hub注冊賬號,分享并保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry),

 

Docker安裝與啟動

安裝Docker

  Docker官方建議在Ubuntu中安裝,因為Docker是基于Ubuntu發布的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的,在很多版本的CentOS中是不支持更新最新的一些補丁包的,

  由于我服務器環境都使用的是CentOS,因此這里我們將Docker安裝到CentOS上,注意:這里建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支持更新,

  1. yum包更新到最新,
    1 sudo yum update
  2. 安裝需要的軟體包, yum-util提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的,
    1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. 設定yum源為阿里云,
    1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. 安裝Docker,
    1 sudo yum install docker-ce
  5. 安裝后查看docker版本,
    1 docker -v

 

設定ustc的鏡像

  ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用,ustc的Docker鏡像加速器速度很快,ustc docker mirror的優勢之一就是不需要注冊,是真正的公共服務,

  1. 編輯檔案,
    1 vim /etc/docker/daemon.json

  2. 在該檔案中輸入如下內容,
    1 {
    2   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    3 }

 

Docker的啟動與停止

  systemctl命令是系統服務管理器指令,

  • 啟動Docker,
    1 systemctl start docker
  • 停止Docker,
    1 systemctl stop docker
  • 重啟Docker,
    1 systemctl restart docker
  • 查看Docker狀態,
    1 systemctl status docker 
  • 開機啟動Docker,
    1 systemctl enable docker 
  • 查看Docker概要資訊,
    1 docker info 
  • 查看Docker幫助檔案,
    1 docker --help

 

常用命令

鏡像相關命令

查看鏡像

1 docker images

 

結果列名說明
REPOSITORY 鏡像名稱
TAG 鏡像標簽
IMAGE ID 鏡像ID
CREATED 鏡像的創建日期(不是獲取該鏡像的日期)
SIZE 鏡像大小

 

  這些鏡像都是存盤在Docker宿主機的/var/lib/docker目錄下,

 

搜索鏡像

  如果你需要從網路中查找需要的鏡像,可以通過以下命令搜索,

1 docker search 鏡像名稱

 

結果列名說明
NAME 倉庫名稱
DESCRIOTION 鏡像描述
STARS 用戶評價,反應一個鏡像的受歡迎程度
OFFCIAL 是否官方
AUTOMATED 自動構建,表示該鏡像由Docker Hub自動構建流程創建的

 

拉取鏡像

  拉取鏡像就是從中央倉庫中下載鏡像到本地,

1 docker pull 鏡像名稱

  例如,我要下載centos7鏡像

1 docker pull centos:7

 

洗掉鏡像

  按鏡像ID洗掉鏡像,

1 docker rmi 鏡像ID

  洗掉所有鏡像,

1 docker rmi `docker images -q`

 

容器相關命令

查看容器

  查看正在運行的容器,

1 docker ps

  查看所有容器,

1 docker ps –a

  查看最后一次運行的容器,

1 docker ps –l

  查看停止的容器

1 docker ps -f status=exited

 

創建與啟動容器

  創建容器命令,

1 docker run

  創建容器常用的引數說明,

 

引數說明
-i 表示運行容器
-t 表示容器啟動后會進入其命令列,加入這兩個引數后,容器創建就能登錄進去,即分配一個偽終端,
--name 表示給創建的容器命名
-v 表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或檔案映射,注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上,
-d 在run后面加上-d引數,則會創建一個守護式容器在后臺運行(這樣創建容器后不會自動登錄容器,如果只加-i -t兩個引數,創建后就會自動進去容器)
-p 表示埠映射,前者是宿主機埠,后者是容器內的映射埠,可以使用多個-p做多個埠映射

 

互動式方式創建容器

1 docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash

  退出當前容器,

1 exit

 

守護式方式創建容器

1 docker run -di --name=容器名稱 鏡像名稱:標簽

  登錄守護式容器,

1 docker exec -it 容器名稱 (或者容器ID)  /bin/bash

 

停止與啟動容器

  停止容器,

1 docker stop 容器名稱或者容器ID

  啟動容器,

1 docker start 容器名稱或者容器ID

 

檔案拷貝

  將宿主機的檔案拷貝到容器內,

1 docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄

  將容器內的檔案拷貝到宿主機,

1 docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄

 

目錄掛載

  我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的檔案從而去影響容器,

  創建容器時,添加-v引數,后邊為宿主機目錄:容器目錄,

  例如:

1 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

   如果你共享的是多級的目錄,可能會出現權限不足的提示,

   這是因為CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加引數--privileged=true來解決掛載的目錄沒有權限的問題,

 

查看容器IP地址

  我們可以通過以下命令查看容器運行的各種資料,

1 docker inspect 容器名稱或容器ID

  也可以直接執行下面的命令直接輸出IP地址,

1 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱或容器ID

 

洗掉容器

  洗掉指定的容器,

1 docker rm 容器名稱或容器ID

 

應用部署

MySQL部署

  1. 拉取MySQL鏡像,
    1 docker pull mysql:5.7
  2. 創建容器,
    1 # docker run -di --name=容器名字 -p 宿主機埠:容器埠 -e MYSQL_ROOT_PASSWORD=mysql密碼 容器名稱
    2 docker run -di --name=mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  3.  遠程登錄mysql:連接宿主機的IP ,指定埠為3306,

 

Tomcat部署

  1. 拉取Tomcat鏡像,
    1 docker pull tomcat:7-jre7
  2. 創建容器,
    1 # 創建tomcat容器,并掛載了webapps目錄
    2 # -p表示地址映射 -v 表示目錄掛載
    3 docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

 

Nginx部署

  1. 拉取Nginx鏡像,
    1 docker pull nginx
  2. 創建容器,
    1 docker run -di --name=mynginx -p 80:80 nginx

 

Redis部署

  1. 拉取Redis鏡像,
    1 docker pull redis
  2. 創建容器,
    1 docker run -di --name=myredis -p 6379:6379 redis

 

遷移與備份

 

其中涉及到的命令有:

  • docker commit:將容器保存為鏡像
  • docker save:將鏡像備份為tar檔案
  • docker load:根據tar檔案恢復為鏡像

容器保存為鏡像

  格式:

1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

 

  如:

1 [root@a ~]# docker ps
2 CONTAINER ID        IMAGE
3 5d9b684c8c64        nginx:latest
4 [root@a ~]# docker commit 5d9b684c8c64 my-nginx-image
5 sha256:32a0031127bc12826c0bc8e4292b8a38b98c5ab0158fd0189d59dbc27dadceec
6 [root@a ~]# docker images
7 REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
8 my-nginx-image      latest            32a0031127bc      4 seconds ago       133MB

 

 

鏡像備份(將鏡像保存為tar檔案)

  格式:

1 docker save [OPTIONS] IMAGE [IMAGE...] -o, --output string   Write to a file, instead of STDOUT

  如:

1 [root@a ~]# docker save -o my-nginx-image.tar my-nginx-image:latest
2 [root@a ~]# ll
3 總用量 133708
4 -rw-------. 1 root root 136857088 9月  15 11:13 my-nginx-image.tar

 

 

鏡像恢復與遷移(將tar檔案恢復為鏡像)

  格式:

1 docker load [OPTIONS] -i, --input string   Read from tar archive file, instead of STDIN

 

  如:

1 docker load -i my-nginx-image-3.tar

 

 

Dockerfile自定義鏡像

什么是Dockerfile

  Dockerfile是由一系列命令和引數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像,

  對于開發人員:可以為開發團隊提供一個完全一致的開發環境,

  對于測驗人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile檔案構建一個新的鏡像開始作業了,

  對于運維人員:在部署時,可以實作應用的無縫移植,

 

常用命令

 

 命令作用 
FROM image_name:tag  定義了使用哪個基礎鏡像啟動構建流程 
 MAINTAINER user_name 宣告鏡像的創建者 
 ENV key value 設定環境變數 (可以寫多條) 
 RUN command  是Dockerfile的核心部分(可以寫多條)
ADD source_dir/file dest_dir/file 將宿主機的檔案復制到容器內,如果是一個壓縮檔案,將會在復制后自動解壓
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有壓縮檔案并不能解壓
WORKDIR path_dir 設定作業目錄

 

使用腳本創建鏡像

  1. 創建目錄,
    1 mkdir –p /usr/local/docker-jdk
  2. 下載jdk-8u171-linux-x64.tar.gz并上傳到服務器(虛擬機)中的/usr/local/dockerjdk8目錄,
  3. 創建Dockerfile檔案,
    1 vim /usr/local/docker-jdk/Dockerfile 
  4. 將以下內容寫入Dockerfile檔案,
     1 # 指定來源鏡像
     2 FROM centos:7
     3 ?
     4 # 指定鏡像作者姓名
     5 MAINTAINER tankang
     6 ?
     7 # 指定作業目錄:容器作業時相對路徑的基準
     8 WORKDIR /usr
     9 ?
    10 # 創建鏡像時執行指令創建/usr/local/java目錄
    11 RUN mkdir /usr/local/java
    12 ?
    13 # 將壓縮檔案添加到鏡像中,是相對路徑jar,會自動解壓
    14 ADD jdk-8u121-linux-x64.tar.gz /usr/local/java
    15 ?
    16 # 設定Java環境變數
    17 ENV JAVA_HOME=/usr/local/java/jdk1.8.0_121
    18 ENV PATH=$JAVA_HOME:$PATH 
  5. 構建鏡像,
    1 # 格式
    2 docker build [OPTIONS] PATH | URL | -
    3 # 例如
    4 docker build -t='jdk1.8' .
    5 # -t后面指定的是鏡像的名字,當然也可以在后面用冒號附加tag,最后的點表示宿主機中的當前目錄,讓構建程式在當前目錄下找到Dockerfile, 
  6. 查看鏡像是否建立完成,
    1 docker images 

 

Docker私有倉庫

簡介

Docker官方的Docker hub是一個用于管理公共鏡像的倉庫,我們可以從上面拉取鏡像到本地,也可以把我們自己的鏡像推送上去,但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡像放到公網當中,那么我們就需要搭建自己的私有倉庫來存盤和管理自己的鏡像,

私有倉庫搭建與配置

  1.  拉取私有倉庫鏡像,
    1 docker pull registry
  2. 啟動私有倉庫容器,
    1 docker run -di --name=registry -p 5000:5000 registry
  3. 打開瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":[]},表示私有倉庫搭建成功并且內容為空,
  4. 修改daemon.json,
    1 vim /etc/docker/daemon.json
  5. 添加以下內容(此步用于讓Docker信任私有倉庫地址),
    1 {"insecure-registries":["宿主機IP:5000"]} 
  6. 重啟Docker服務,
    1 systemctl restart docker

 

鏡像上傳至私有倉庫

  1. 標記此鏡像為私有倉庫的鏡像,
    1 docker tag jdk1.8 宿主機IP:5000/jdk1.8

     

  2. 再次啟動私服容器,
    1 docker start registry 
  3. 上傳標記的鏡像,
    1 docker push 宿主機IP:5000/jdk1.8 
  4. 打開瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":["jdk1.8"]},表示上傳成功,

 

從私有倉庫拉取鏡像

  大多數情況下,都是某臺服務器部署了私有鏡像倉庫之后,到其它服務器上從私有倉庫中拉取鏡像,若要拉取私有倉庫鏡像需要去修改docker的組態檔,設定啟動時候的倉庫地址,

1 # 打開組態檔
2 vi /usr/lib/systemd/system/docker.service
3 # 在打開的上述檔案中按照下面的圖,添加如下的內容;注意修改下面內容中的ip地址
4 --add-registry=宿主機IP:5000 --insecure-registry=宿主機IP:5000 \
5 # 修改完后需要重新加載docker組態檔并重啟docker
6 systemctl daemon-reload
7 systemctl restart docker

 

 

配置完成之后,需要重啟docker服務,重啟后就可以從私有倉庫拉取鏡像,

 

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

標籤:Java

上一篇:Java常見重構技巧 - 去除不必要的!=null判斷空的5種方式,很少有人知道后兩種

下一篇:985、211畢業一年,面試八家大廠,四面拿美團offer(Java后端)

標籤雲
其他(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