主頁 > 後端開發 > Docker之兩小時入門

Docker之兩小時入門

2020-10-27 15:00:19 後端開發

1、引言

1.1 Docker是什么

Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部專案,于 2013 年 3 月以 Apache 2.0 授權協議開源,主要專案代碼在 GitHub 上進行維護,

Docker 使用 Google 公司推出的 Go 語言 進行開發實作,

docker是linux容器的一種封裝,提供簡單易用的容器使用介面,它是最流行的Linux容器解決方案,

docker的介面相當簡單,用戶可以方便的創建、銷毀容器,

docker將應用程式與程式的依賴,打包在一個檔案里面,運行這個檔案就會生成一個虛擬容器,

程式運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了,

1.2 應用場景

web應用的自動化打包和發布

自動化測驗和持續集成、發布

在服務型環境中部署和調整資料庫或其他應用

1.3 區別

1、物理機

gzh_c364c9c6.png

2、虛擬機

gzh_c8e16485.png

3、docker容器

gzh_041aeefe.png

1.4 Docker的三大概念及優勢

  • 鏡像 image
  • 容器 container
  • 倉庫 repository

docker容器的優勢

1、更高效的利用系統資源

由于容器不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統 資源的利用率更高,

無論是應用執行速度、記憶體損耗或者檔案存盤速度,都要比傳 統虛擬機技術更高效,因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用,

2、更快速的啟動時間

傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接 運行于宿主內核,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟 動時間,大大的節約了開發、測驗、部署的時間,

3、一致的運行環境

開發程序中一個常見的問題是環境一致性問題,由于開發環境、測驗環境、生產環 境不一致,導致有些 bug 并未在開發程序中被發現,

而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題,

4、持續交付和部署

對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行,

使用 Docker 可以通過定制應用鏡像來實作持續集成、持續交付、部署,開發人員 可以通過 Dockerfile 來進行鏡像構建,并結合持續集成(Continuous Integration) 系 統進行集成測驗,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署,

而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像,

5、更輕松的遷移

由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易,Docker 可以在 很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運 行結果是一致的,

因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一 個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況,

2、Docker安裝

系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上

版本:社區版,企業版(包含了一些收費服務)

官方版安裝教程(英文)

https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script

博主版安裝教程:

# 安裝docker
yum install docker
# 啟動docker 
systemctl start/status docker 
# 查看docker啟動狀態
docker version 

配置加速器

簡介:DaoCloud 加速器 是廣受歡迎的 Docker 工具,解決了國內用戶訪問 Docker Hub 緩慢的問題,DaoCloud 加速器結合國內的 CDN 服務與協議層優化,成倍的提升了下載速度,

DaoCloud官網:

https://www.daocloud.io/mirror#accelerator-doc

# 一條命令加速(記得重啟docker)
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

3、Docker基礎命令

docker --help(中文注解)

Usage:
docker [OPTIONS] COMMAND [arg...]
       docker daemon [ --help | ... ]
       docker [ --help | -v | --version ]
A
self-sufficient runtime for containers.

Options:
  --config=~/.docker              Location of client config files  #客戶端組態檔的位置
  -D, --debug=false               Enable debug mode  #啟用Debug除錯模式
  -H, --host=[]                   Daemon socket(s) to connect to  #守護行程的套接字(Socket)連接
  -h, --help=false                Print usage  #列印使用
  -l, --log-level=info            Set the logging level  #設定日志級別
  --tls=false                     Use TLS; implied by--tlsverify  #
  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA  #信任證書簽名CA
  --tlscert=~/.docker/cert.pem    Path to TLS certificate file  #TLS證書檔案路徑
  --tlskey=~/.docker/key.pem      Path to TLS key file  #TLS密鑰檔案路徑
  --tlsverify=false               Use TLS and verify the remote  #使用TLS驗證遠程
  -v, --version=false             Print version information and quit  #列印版本資訊并退出

Commands:
    attach    Attach to a running container  #當前shell下attach連接指定運行鏡像
    build     Build an image from a Dockerfile  #通過Dockerfile定制鏡像
    commit    Create a new image from a container's changes  #提交當前容器為新的鏡像
    cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #從容器中拷貝指定檔案或者目錄到宿主機中
    create    Create a new container  #創建一個新的容器,同run 但不啟動容器
    diff    Inspect changes on a container's filesystem  #查看docker容器變化
    events    Get real time events from the server#從docker服務獲取容器實時事件
    exec    Run a command in a running container#在已存在的容器上運行命令
    export    Export a container's filesystem as a tar archive  #匯出容器的內容流作為一個tar歸檔檔案(對應import)
    history    Show the history of an image  #展示一個鏡像形成歷史
    images    List images  #列出系統當前鏡像
    import    Import the contents from a tarball to create a filesystem image  #從tar包中的內容創建一個新的檔案系統映像(對應export)
    info    Display system-wide information  #顯示系統相關資訊
    inspect    Return low-level information on a container or image  #查看容器詳細資訊
    kill    Kill a running container  #kill指定docker容器
    load    Load an image from a tar archive or STDIN  #從一個tar包中加載一個鏡像(對應save)
    login    Register or log in to a Docker registry#注冊或者登陸一個docker源服務器
    logout    Log out from a Docker registry  #從當前Docker registry退出
    logs    Fetch the logs of a container  #輸出當前容器日志資訊
    pause    Pause all processes within a container#暫停容器
    port    List port mappings or a specific mapping for the CONTAINER  #查看映射埠對應的容器內部源埠
    ps    List containers  #列出容器串列
    pull    Pull an image or a repository from a registry  #從docker鏡像源服務器拉取指定鏡像或者庫鏡像
    push    Push an image or a repository to a registry  #推送指定鏡像或者庫鏡像至docker源服務器
    rename    Rename a container  #重命名容器
    restart    Restart a running container  #重啟運行的容器
    rm    Remove one or more containers  #移除一個或者多個容器
    rmi    Remove one or more images  #移除一個或多個鏡像(無容器使用該鏡像才可以洗掉,否則需要洗掉相關容器才可以繼續或者-f強制洗掉)
    run    Run a command in a new container  #創建一個新的容器并運行一個命令
    save    Save an image(s) to a tar archive#保存一個鏡像為一個tar包(對應load)
    search    Search the Docker Hub for images  #在docker
hub中搜索鏡像
    start    Start one or more stopped containers#啟動容器
    stats    Display a live stream of container(s) resource usage statistics  #統計容器使用資源
    stop    Stop a running container  #停止容器
    tag         Tag an image into a repository  #給源中鏡像打標簽
    top       Display the running processes of a container #查看容器中運行的行程資訊
    unpause    Unpause all processes within a container  #取消暫停容器
    version    Show the Docker version information#查看容器版本號
    wait         Block until a container stops, then print its exit code  #截取容器停止時的退出狀態值

Run 'docker COMMAND --help' for more information on a command.  #運行docker命令在幫助可以獲取更多資訊
docker search  hello-docker  # 搜索hello-docker的鏡像
docker search centos # 搜索centos鏡像
docker pull hello-docker # 獲取centos鏡像
docker run  hello-world   #運行一個docker鏡像,產生一個容器實體(也可以通過鏡像id前三位運行)
docker image ls  # 查看本地所有鏡像
docker images  # 查看docker鏡像
docker image rmi hello-docker # 洗掉centos鏡像
docker ps  #列出正在運行的容器(如果創建容器中沒有行程正在運行,容器就會立即停止)
docker ps -a  # 列出所有運行過的容器記錄
docker save centos > /opt/centos.tar.gz  # 匯出docker鏡像至本地
docker load < /opt/centos.tar.gz   #匯入本地鏡像到docker鏡像庫
docker stop  `docker ps -aq`  # 停止所有正在運行的容器
docker  rm `docker ps -aq`    # 一次性洗掉所有容器記錄
docker rmi  `docker images -aq`   # 一次性洗掉所有本地的鏡像記錄

3.1 啟動容器的兩種方式

容器是運行應用程式的,所以必須得先有一個作業系統為基礎

1、基于鏡像新建一個容器并啟動

# 1. 后臺運行一個docker
docker run -d centos /bin/sh -c "while true;do echo 正在運行; sleep 1;done"
    # -d  后臺運行容器
    # /bin/sh  指定使用centos的bash解釋器
    # -c 運行一段shell命令
    # "while true;do echo 正在運行; sleep 1;done"  在linux后臺,每秒中列印一次正在運行
docker ps  # 檢查容器行程
docker  logs  -f  容器id/名稱  # 不間斷列印容器的日志資訊 
docker stop centos  # 停止容器

# 2. 啟動一個bash終端,允許用戶進行互動
docker run --name mydocker -it centos /bin/bash  
    # --name  給容器定義一個名稱
    # -i  讓容器的標準輸入保持打開
    # -t 讓Docker分配一個偽終端,并系結到容器的標準輸入上
    # /bin/bash 指定docker容器,用shell解釋器互動

當利用docker run來創建容器時,Docker在后臺運行的步驟如下:

  1. 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  2. 利用鏡像創建并啟動一個容器
  3. 分配一個檔案系統,并在只讀的鏡像層外面掛在一層可讀寫層
  4. 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
  5. 從地址池配置一個ip地址給容器
  6. 執行用戶指定的應用程式
  7. 執行完畢后容器被終止

2、將一個終止狀態(stopped)的容器重新啟動

[root@localhost ~]# docker ps -a  # 先查詢記錄
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                    NAMES
ee92fcf6f32d        centos              "/bin/bash"              4 days ago          Exited (137) 3 days ago                                kickass_raman

[root@localhost ~]# docker start ee9  # 再啟動這個容器
ee9

[root@localhost ~]# docker exec -it  ee9 /bin/bash  # 進入容器互動式界面
[root@ee92fcf6f32d /]#   # 注意看用戶名,已經變成容器用戶名

3.2 提交創建自定義鏡像

# 1.我們進入互動式的centos容器中,發現沒有vim命令
    docker run -it centos
# 2.在當前容器中,安裝一個vim
    yum install -y vim
# 3.安裝好vim之后,exit退出容器
    exit
# 4.查看剛才安裝好vim的容器記錄
    docker container ls -a
# 5.提交這個容器,創建新的image
    docker commit 059fdea031ba chaoyu/centos-vim
# 6.查看鏡像檔案
    docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chaoyu/centos-vim   latest              fd2685ae25fe        5 minutes ago   

3.3 外部訪問容器

容器中可以運行網路應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P引數指定埠映射,

docker run -d -P training/webapp python app.py
  # -P 引數會隨機映射埠到容器開放的網路埠

# 檢查映射的埠
docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED            STATUS              PORTS                     NAMES
cfd632821d7a        training/webapp     "python app.py"     21 seconds ago      Up 20 seconds       0.0.0.0:32768->5000/tcp   brave_fermi
#宿主機ip:32768 映射容器的5000埠

# 查看容器日志資訊
docker logs -f cfd  # #不間斷顯示log

# 也可以通過-p引數指定映射埠
docker run -d -p 9000:5000 training/webapp python app.py

打開瀏覽器訪問服務器的9000埠, 內容顯示 Hello world!表示正常啟動

(如果訪問失敗的話,檢查自己的防火墻,以及云服務器的安全組)

4、利用dockerfile定制鏡像

鏡像是容器的基礎,每次執行docker run的時候都會指定哪個鏡像作為容器運行的基礎,我們之前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能滿足一定的需求,當鏡像無法滿足我們的需求時,就得自定制這些鏡像,

鏡像的定制就是定制每一層所添加的配置、檔案,如果可以吧每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定制鏡像,這個腳本就是dockerfile,

Dockerfile 是一個文本檔案,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建,

引數詳解

FROM scratch #制作base image 基礎鏡像,盡量使用官方的image作為base image
FROM centos #使用base image
FROM ubuntu:14.04 #帶有tag的base image

LABEL version=“1.0” #容器元資訊,幫助資訊,Metadata,類似于代碼注釋
LABEL maintainer=“[email protected]"

#對于復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!
RUN yum update && yum install -y vim 
    Python-dev #反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相當于linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用RUN cd
WORKDIR /test # 如果沒有就自動創建
WORKDIR demo # 再進入demo檔案夾
RUN pwd     # 列印結果應該是/test/demo

ADD and COPY 
ADD hello /  # 把本地檔案添加到鏡像中,吧本地的hello可執行檔案拷貝到鏡像的/目錄
ADD test.tar.gz /  # 添加到根目錄并解壓

WORKDIR /root
ADD hello test/  # 進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑
COPY hello test/  # 等同于上述ADD效果

ADD與COPY
   - 優先使用COPY命令
    -ADD除了COPY功能還有解壓功能
添加遠程檔案/目錄使用curl或wget

ENV # 環境變數,盡可能使用ENV增加可維護性
ENV MYSQL_VERSION 5.6 # 設定一個mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 

進階知識(了解)

VOLUME and EXPOSE 
存盤和網路

RUN and CMD and ENTRYPOINT
RUN:執行命令并創建新的Image Layer
CMD:設定容器啟動后默認執行的命令和引數
ENTRYPOINT:設定容器啟動時運行的命令

Shell格式和Exec格式
RUN yum install -y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt-get”,”install”,”-y”,”vim”]
CMD [“/bin/echo”,”hello docker”]
ENTRYPOINT [“/bin/echo”,”hello docker”]


通過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“/bin/echo”,”hello $name”]#這個僅僅是執行echo命令,讀取不了shell變數
    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

CMD
容器啟動時默認執行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定義多個CMD,只有最后一個執行

ENTRYPOINT
讓容器以應用程式或服務形式運行
不會被忽略,一定會執行
最佳實踐:寫一個shell腳本作為entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT [“docker-entrypoint.sh]
EXPOSE 27017
CMD [“mongod”]

[root@master home]# more Dockerfile
FROm centos
ENV name Docker
#CMD ["/bin/bash","-c","echo hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

5、發布到倉庫

5.1 docker hub共有鏡像發布

docker提供了一個類似于github的倉庫docker hub,官方網站(需注冊使用)

https://hub.docker.com/

# 注冊docker id后,在linux中登錄dockerhub
    docker login

# 注意要保證image的tag是賬戶名,如果鏡像名字不對,需要改一下tag
    docker tag chaoyu/centos-vim peng104/centos-vim
    # 語法是:docker tag   倉庫名   peng104/倉庫名

# 推送docker image到dockerhub
    docker push peng104/centps-cmd-exec:latest

# 去dockerhub中檢查鏡像
# 先洗掉本地鏡像,然后再測驗下載pull 鏡像檔案
    docker pull peng104/centos-entrypoint-exec

5.2 私有倉庫

docker hub 是公開的,其他人也是可以下載,并不安全,因此還可以使用docker registry官方提供的私有倉庫

用法詳解:

https://yeasy.gitbooks.io/docker_practice/repository/registry.html

# 1.下載一個docker官方私有倉庫鏡像
    docker pull registry
# 2.運行一個docker私有容器倉庫
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry  registry
    -d 后臺運行 
    -p  埠映射 宿主機的5000:容器內的5000
    -v  資料卷掛載  宿主機的 /opt/data/registry :/var/lib/registry 
    registry  鏡像名
    /var/lib/registry  存放私有倉庫位置
# Docker 默認不允許非 HTTPS 方式推送鏡像,我們可以通過 Docker 的配置選項來取消這個限制
# 3.修改docker的組態檔,讓他支持http方式,上傳私有鏡像
    vim /etc/docker/daemon.json 
    # 寫入如下內容
    {
        "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries":["192.168.11.37:5000"]
    }
# 4.修改docker的服務組態檔
    vim /lib/systemd/system/docker.service
# 找到[service]這一代碼區域塊,寫入如下引數
    [Service]
    EnvironmentFile=-/etc/docker/daemon.json
# 5.重新加載docker服務
    systemctl daemon-reload
# 6.重啟docker服務
    systemctl restart docker
    # 注意:重啟docker服務,所有的容器都會掛掉

# 7.修改本地鏡像的tag標記,往自己的私有倉庫推送
    docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-hello
    # 瀏覽器訪問http://192.168.119.10:5000/v2/_catalog查看倉庫
# 8.下載私有倉庫的鏡像
    docker pull 192.168.11.37:5000/peng-hello

6、實體演示

撰寫dockerfile,構建自己的鏡像,運行flask程式,

確保app.py和dockerfile在同一個目錄!

# 1.準備好app.py的flask程式
    [root@localhost ~]# cat app.py
    from flask import Flask
    app=Flask(__name__)
    @app.route('/')
    def hello():
        return "hello docker"
    if __name__=="__main__":
        app.run(host='0.0.0.0',port=8080)
    [root@master home]# ls
    app.py  Dockerfile

# 2.撰寫dockerfile
    [root@localhost ~]# cat Dockerfile
    FROM python:2.7
    LABEL maintainer="溫而新"
    RUN pip install flask
    COPY app.py /app/
    WORKDIR /app
    EXPOSE 8080
    CMD ["python","app.py"]

# 3.構建鏡像image,找到當前目錄的Dockerfile,開始構建
    docker build -t peng104/flask-hello-docker .

# 4.查看創建好的images
    docker image ls

# 5.啟動此flask-hello-docker容器,映射一個埠供外部訪問
    docker run -d -p 8080:8080 peng104/flask-hello-docker

# 6.檢查運行的容器
    docker container ls

# 7.推送這個鏡像到私有倉庫
    docker tag  peng104/flask-hello-docker   192.168.11.37:5000/peng-flaskweb
    docker push 192.168.11.37:5000/peng-flaskweb

看完本文有識訓?請轉發分享給更多人

關注公眾號:java寶典
a

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

標籤:其他

上一篇:Python爬蟲連載8-JS加密(一)

下一篇:Spring原始碼分析之`BeanFactoryPostProcessor`呼叫程序

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