Docker新手入門:基本用法

Docker新手入門:基本用法


1.Docker簡介

1.1 第一本Docker書

工作中不斷碰到Docker,今天終于算是正式開始學習了。在挑選系統學習Docker以及虛擬化技術的書籍時還碰到了不少麻煩,主要就是沒有特別經典的書!Docker的《第一版Docker書》和《Docker技術入門與實戰》普遍評價不高,而《Docker開發實踐》和《Dockeru源碼分析》又是2015年最近才出的,評價不是很多。綜合看了下,最終還是選擇了《Docker開發實踐》,以下都主要以這本書作為學習資料。

1.2 Docker是什么?

《Docker開發實踐》中講了個故事:20世紀60年代以前的海運,貨物都放置在一起,很容易擠壓受損。同時,不同的運輸方式之間的轉運也很麻煩,例如從碼頭和火車汽車轉運卸貨時。不同貨物和不同交通工具之間的組合是一個巨大的二維矩陣。海運界最后達成了一致,制定了國際標準集裝箱來解決這個棘手的問題。所有貨物都打包進集裝箱互相隔離,所有交通工具都通過集裝箱轉運,極大地提供了運輸的安全性和效率。

在軟件開發中我們也經常碰到同樣的問題,使用了各種各樣技術框架的應用程序,從前端靜態網站到后端數據庫,從PHP到Java,以及多種多樣的部署環境,從測試服務器到線上環境,從虛擬機到公有云等等。Docker,正是這個集裝箱,而Docker的logo也的確是個集裝箱。

1.3 Docker與容器和虛擬機

很自然地我們會問,Docker跟虛擬機有什么區別啊?這個問題可以拆成兩部分。因為Docker并不是什么完全獨創的技術,而是屬于很早便有了的容器技術,所以第一個問題就是容器與虛擬機的區別?同屬于容器技術,Docker的兄弟姐妹還有Solaris Zones、BSD jails、LXC等。但Docker現在這么火,自然有它的獨到之處,所以第二個問題就是Docker與其他容器的區別?

關于第一個問題比較簡單,容器是一種輕量級的虛擬技術。它不像虛擬機那樣具有一套完整的CPU、內存和磁盤,對操作系統有絕對的權限。容器和宿主主機共享內核,所有容器共享操作系統,在一臺物理機上可以運行成百上千的容器。第二個問題稍麻煩一些,與LXC相比,Docker對配置進行了抽象,使應用在任何平臺上的運行環境都一致。同時提供了版本控制、鏡像托管等類似Git的現代化設施和生態圈。

總體來看,Docker的應用場景有:

  • 加速本地開發:快速搭建好開發環境和運行環境。
  • 自動打包和部署應用。
  • 創建輕量級的私有Paas環境。
  • 自動化測試和持續集成。
  • 創建安全沙盒。

2.Docker安裝與32位問題

2.1 安裝Docker

Docker對Linux環境有兩個要求,一是64位系統,二是內核在3.8以上。而我使用的是Linux Mint 17的32位版,所以下載了源碼包準備編譯安裝。正愁找不到編譯安裝的資料時,發現Ubuntu軟件庫提供了已經編譯好的Docker 32位版,真是太好了!再看一下我的內核版本是3.13,也符合要求,于是直接用apt安裝。

cdai@dell ~ $ uname -a
Linux dell 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:30:01 UTC 2014 i686 i686 i686 GNU/Linuxcdai@dell ~ $ apt-cache search docker
docker.io - Linux container runtime
kdocker - lets you dock any application into the system tray
vim-syntax-docker - Docker container engine - Vim highlighting syntax filescdai@dell ~ $ sudo apt-get install docker.io
cdai@dell ~ $ docker -v
Docker version 1.0.1, build 990021a

2.2 32位版鏡像

盡管Docker能用了,但是官方Docker Hub中的鏡像都是為64位系統準備的,下載這些鏡像后創建啟動容器時會報”finalize namespace drop capabilities operation not permitted”的錯誤。所以我們可以用官方提供的Dockerfile構建出32位版本的鏡像,才能在32位系統上使用。(鏡像構建的具體講解請參見第3.4節)

以構建32位版的Ubuntu為例,執行官方GitHub上提供的Shell腳本即可。經過漫長的等待后,就能看到32位的Ubuntu鏡像已經成功安裝到我們本地了,官方的腳本果然還是挺靠譜的。

cdai ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
32bit/ubuntu        14.04               c062cc00654e        About a minute ago   295.3 MB

注意:這里為了在我的老本子上學習研究Docker而做了workaround,真正應用時當然還是一定要在64位機器上使用Docker的。


3.入門實戰

3.1 核心概念

在開始使用Docker之前,首先要了解Docker中的概念和它們之間的關系,否則直接上手可能會搞得一頭霧水。Docker中最重要的三個概念就是:鏡像、容器、庫。

  • 鏡像:是一個包含了應用程序和其運行時依賴環境的只讀文件。
  • 容器:它是構建容器的模板,通過一個鏡像我們可以構造出很多相互獨立但運行環境一樣的容器。
  • :Docker提供了Hub來保存公有或私有的鏡像,也允許第三方搭建。

下面就是典型的Docker工作流,從這張圖中能清晰地理解這三個重要概念之間的關系。本節接下來就根據這個Workflow逐一介紹常用的操作。

docker-workflow

3.2 搜索下載鏡像

首先用docker search [keyword]命令查看Docker Hub上都有哪些鏡像可以下載,search后可以用通配符表示關鍵字:

cdai ~ $ docker search ubuntu
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                         Ubuntu is a Debian-based Linux operating s...   2179      [OK]       
ubuntu-upstart                 Upstart is an event-based replacement for ...   31        [OK]       
torusware/speedus-ubuntu       Always updated official Ubuntu docker imag...   25                   [OK]
tleyden5iwx/ubuntu-cuda        Ubuntu 14.04 with CUDA drivers pre-installed    17                   [OK]
ubuntu-debootstrap             debootstrap --variant=minbase --components...   12        [OK]       
neurodebian                    NeuroDebian provides neuroscience research...   11        [OK]       ...

接下來用docker pull [repository/url:tag]命令下載鏡像。因為從官方Docker Hub下載非常慢,所以這里從國內的鏡像站http://dockerpool.com/下載,速度非常快。(注:后面會講到用docker run命令創建容器,其實如果鏡像不存在Docker會自動去下載,這里為了學習pull命令所以手動下載鏡像)

cdai ~ $ docker pull dl.dockerpool.com:5000/ubuntu:14.04
cdai ~ $ docker pull dl.dockerpool.com:5000/centos:latest

下載完成后,就可以用docker images查看本地都有哪些鏡像。這里的REPOSITORY列可能有三種類型:

  • [namespace/ubuntu]:當你在Docker Hub上注冊賬戶時,賬戶名就自動成為你的namespace,它是用來區分不同用戶的鏡像的。
  • [ubuntu]:這種只有倉庫名的可以認為它屬于頂級namespace,這種倉庫只用于官方的鏡像。
  • [dl.dockerpool.com:5000/ubuntu]:URL路徑表示鏡像是放置在第三方搭建的Hub上。
cdai ~ $ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
dl.dockerpool.com:5000/ubuntu   14.04               5506de2b643b        10 months ago       199.3 MB
dl.dockerpool.com:5000/centos   latest              87e5b6b3ccc1        11 months ago       224 MB

如果想要查看鏡像的詳細信息,可以用docker inspect [image-id]命令查看。(注:下面容器一節會看到,這個命令也能夠用來查看容器的詳細信息)

cdai ~ $ docker inspect 5506de2b643b
[{"Architecture": "amd64","Author": "","Comment": "","Config": {"AttachStderr": false,"AttachStdin": false,"AttachStdout": false,"Cmd": ["/bin/bash"],...},"Container": "201ae89099c20e577dd9c60cb9199c2dac0688d49efa676bf3eeb859666294bd","ContainerConfig": {"AttachStderr": false,"AttachStdin": false,"AttachStdout": false,...},"Created": "2014-10-23T23:53:59.03271073Z","DockerVersion": "1.3.0","Id": "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5","Os": "linux","Parent": "22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723","Size": 0
}]

3.3 創建啟動容器

了解了鏡像的基本操作后,我們就可以創建容器了。首先用docker create創建容器或者用docker run [repository:tag]創建并運行容器。容器可以分為兩種類型:

  • 交互型容器:前臺運行,可以通過控制臺與容器交互。如果創建該容器的終端被關閉,則容器就變為停止狀態。此外,在容器控制臺中輸入exit或者通過docker stopdocker kill也能終止容器。
  • 后臺型容器:后臺運行,創建啟動之后就與終端無關了,需要用docker stopdocker kill來終止。

說明:因為我的老本子是32位的,即便從第三方Hub安裝了鏡像也都是64位的無法使用,所以這里的例子都使用第一節中手動構建出的32位Ubuntu鏡像。

首先我們創建運行一個交互型容器試試,在容器的控制臺里簡單的輸出個”Hello,Docker”。怎么樣?Docker容器非常輕量級,啟動非常快吧!用docker ps可以查看正在運行的容器,用docker ps -a查看所有容器,包括未啟動的容器。(-l和-n=x能列出最后創建的一個或x個容器)

cdai ~ $ docker run -i -t 32bit/ubuntu:14.04 /bin/bash
root@328aa6305d82:/# echo "Hello, Docker!"
Hello, Docker!
root@328aa6305d82:/# exit
exitcdai ~ $ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS                     PORTS               NAMES
328aa6305d82        32bit/ubuntu:14.04   /bin/bash           24 seconds ago      Exited (0) 4 seconds ago                       stupefied_curie     

現在再創建運行一個后臺型容器。可以用restart參數設置容器異常退出時自動重啟:”always”不管什么返回碼都嘗試重啟容器;”on-failure:x”則只在返回碼非0時才會重啟,并嘗試x次。最后可以接上一個容器啟動后執行的命令。這里為了做一個例子學習,所以用一個循環每隔5秒輸出”hello world”。(Docker 1.3后提供了docker exec用于在容器運行之后中途啟動另一個程序)

cdai ~ $ docker run -d 32bit/ubuntu:14.04 /bin/bash -c "while true; do echo hello world; sleep 5; done"
5c40590cc23cfa02bd6c0220da77b601973f01f8bc430baca22315ef68d81e44
cdai ~ $ docker ps
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS               NAMES
5c40590cc23c        32bit/ubuntu:14.04   /bin/bash -c while    5 seconds ago       Up 5 seconds                            evil_bartik         

現在容器已經在后臺運行起來了,沒有控制臺我們怎樣能查看容器的狀態呢?Docker提供了一些很實用的容器內操作命令,例如docker logs [container-name]能夠查看容器內標準輸出流中的內容,docker top [container-name]查看容器中的所有進程。下面就用這兩個命令查看一下剛才啟動的容器運行得怎么樣了?注意:啟動容器時如果沒用name參數指定容器名稱的話,Docker會自動生成一個,下面的命令都用這個名稱作為參數。

cdai ~ $ docker logs -f evil_bartik
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
^C
cdai ~ $ docker top evil_bartik
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                26803               1700                0                   21:54               ?                   00:00:00            /bin/bash -c while true; do echo hello world; sleep 5; done
root                26859               26803               0                   21:55               ?                   00:00:00            sleep 5

可以看到我們的容器運行良好,循環體在不斷輸出”hello world”到輸出流中。之前學習鏡像說過docker inspect也可以用于容器,現在就用它查看一下容器的詳細信息。從輸出可以清晰地看到啟動命令、環境參數、網絡等信息。

cdai ~ $ docker inspect evil_bartik
[{"Args": ["-c","while true; do echo hello world; sleep 5; done"],"Config": {"AttachStderr": false,"AttachStdin": false,"AttachStdout": false,"Hostname": "5c40590cc23c","Image": "32bit/ubuntu:14.04",...},"Created": "2015-09-03T13:54:03.389202827Z","Driver": "aufs",..."MountLabel": "","Name": "/evil_bartik","NetworkSettings": {"Bridge": "docker0","Gateway": "172.17.42.1","IPAddress": "172.17.0.5","IPPrefixLen": 16,"PortMapping": null,"Ports": {}},...
}]

容器學習的差不多了,現在就把它停下來了吧。之前說過,對于后臺型容器有docker stop [container-name]docker kill [container-name]兩種方法。那它們有什么區別呢?前者會給容器內的進程發送SIGTERM信號,默認行為是容器退出,當然容器內的程序也可以捕獲該信號后自行處理。而后者會給容器內的進程發送SIGKILL信號,導致容器直接退出。

cdai ~ $ docker stop evil_bartik
evil_bartik
cdai ~ $ docker ps -a
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS                      PORTS               NAMES
5c40590cc23c        32bit/ubuntu:14.04   /bin/bash -c while    3 minutes ago       Exited (-1) 5 seconds ago                       evil_bartik         
328aa6305d82        32bit/ubuntu:14.04   /bin/bash              11 minutes ago      Exited (0) 11 minutes ago                       stupefied_curie     

3.4 制作上傳鏡像

本地鏡像的制作有使用commit命令和編寫Dockerfile兩種方式。下面就先分別介紹這兩種制作方式,然后學習一下如何把我們自己制作的本地鏡像上傳到Docker Hub上。

3.4.1 用commit制作鏡像

首先啟動我們之前創建的交互型容器stupefied_curie。啟動成功后會發現我們并沒有進入容器的控制臺,這時就要使用之前沒有介紹的一個容器內使用的命令,attach命令,幫我們重新進入一個已啟動容器的控制臺。(注意:執行attach后,要按一次回車才會出現容器的控制臺界面。而且后臺型容器是無法attach的)

cdai ~ $ docker ps -a
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS                    PORTS               NAMES
328aa6305d82        32bit/ubuntu:14.04   /bin/bash              10 hours ago        Exited (0) 10 hours ago                       stupefied_curie     

attach上之后我們就可以在容器內操作了,這里我們安裝一個Sqlite數據庫并保存一個文本文件,準備好要制作成本地鏡像的容器。本以為一切會很順利,結果卻碰到了容器內無法上網的問題,因為默認容器與宿主主機是橋接的關系需要配置一些DNS等設置。上網查了一下最簡單的方法就是改一下網絡模式,讓容器使用與宿主主機一樣的網絡棧。這里重新創建一個交互型容器,網絡模式使用host模式。

cdai ~ $ docker run -i -t --net="host" 32bit/ubuntu:14.04 /bin/bash
root@cdai:/# apt-get install sqlite3
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:sqlite3-doc
The following NEW packages will be installed:sqlite3
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 28.3 kB of archives.
After this operation, 161 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/main sqlite3 i386 3.8.2-1ubuntu2.1 [28.3 kB]
Fetched 28.3 kB in 2s (10.8 kB/s)                   
Selecting previously unselected package sqlite3.
(Reading database ... 11535 files and directories currently installed.)
Preparing to unpack .../sqlite3_3.8.2-1ubuntu2.1_i386.deb ...
Unpacking sqlite3 (3.8.2-1ubuntu2.1) ...
Setting up sqlite3 (3.8.2-1ubuntu2.1) ...
root@cdai:/# echo "test docker commit" >> hellodocker
root@cdai:/# exit
exit

現在就可以用docker commit [container-id]命令將前面準備好的容器制作成鏡像了!(為什么有的命令用ID有的用name呢?)執行完成后,就能查我們的鏡像已安裝到本地庫了。這里還發現了一個問題,就是基于32位鏡像創建的容器,再制作成鏡像好像又是64位了,啟動時又會報”finalize namespace drop capabilities operation not permitted”錯誤,:(

cdai ~ $ docker ps -a
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS                     PORTS               NAMES
1718e35463ff        32bit/ubuntu:14.04   /bin/bash              53 seconds ago      Exited (0) 8 seconds ago                       boring_babbage      cdai ~ $ docker commit --author="cdai" 1718e35463ff cdai/sqlite3:v1
e10622157a5df7c82bdf148bda021e0fe312c153852f7a6c765c216d4d636ecb
cdai ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
cdai/sqlite3        v1                  e10622157a5d        6 seconds ago       321.8 MB
32bit/ubuntu        14.04               c062cc00654e        11 hours ago        295.3 MB

3.4.2 用Dockerfile制作鏡像

上面我們在容器的控制臺上手動執行一些操作,而Dockerfile是一種更加透明并且可重復的制作方式,因為我們不是手動執行操作,而是將所有操作用Docker提供的命令和語法編寫到Dockerfile中。命令名全部大寫,常用的Dockerfile命令有:

  • FROM:指定擴展自哪個父級鏡像。
  • RUN:執行命令修改鏡像。例如RUN apt-get update和RUN [“apt-get”, “update”]。前者在/bin/sh中執行命令,后者直接使用系統調用exec執行。
  • EXPOSE:指明容器內進程對外開放的端口。也可以在容器啟動時用-p參數開放一些在Dockerfile里沒有列出的端口。
  • ADD:添加宿主主機文件、文件夾或URL指定資源到鏡像中。
  • ENV:設置容器運行的環境變量。
  • USER:為容器的運行以及Dockerfile后面的命令指定用戶。

其他命令還有:MAINTAINER聲明作者信息、WORKDIR指定工作目錄(最后一個會作為容器啟動后的工作目錄)、VOLUME掛載文件、CMD和ENTRYPOINT指定容器啟動后執行的命令、ONBUILD指定一些命令在當前鏡像構建時不會執行,而是在子鏡像構建時觸發。

了解了這些常用的命令,下面就可以開始編寫Dockerfile了。注意:Dockerfile文件名默認就叫”Dockerfile”,否則執行build命令時Docker會找不到。編寫好后,執行docker build .就可以開始構建了,每一條Dockerfile的命令都相當于構建出一個臨時鏡像,最后一步會生成最終的目標鏡像。

cdai $ ls
-rw-r--r--  1 root root   17 Sep  4 09:08 abc.txt
-rw-r--r--  1 root root  188 Sep  4 09:08 Dockerfile
cdai $ cat Dockerfile 
FROM 32bit/ubuntu:14.04
MAINTAINER cdai "XXX@163.com"
USER root
RUN apt-get install -y nginx
EXPOSE 80 8080
RUN touch test.txt
ADD abc.txt .
ENTRYPOINT ["ls"]
CMD ["-a", "-l"]cdai $ docker build -t cdai/nginx:v1 .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon 
Step 0 : FROM 32bit/ubuntu:14.04---> c062cc00654e
Step 1 : MAINTAINER cdai "dc_726@163.com"---> Running in 53ece79679ed---> 979f81286bbe
Removing intermediate container 53ece79679ed
Step 2 : USER root---> Running in f5d29e4895e5---> 4965bbb8d8cd
Removing intermediate container f5d29e4895e5
Step 3 : RUN apt-get install -y nginx---> Running in d4e46baff94a
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:fontconfig-config fonts-dejavu-core geoip-database libfontconfig1libfreetype6 libgd3 libgeoip1 libjbig0 libjpeg-turbo8 libjpeg8 libtiff5libvpx1 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxml2 libxpm4libxslt1.1 nginx-common nginx-core sgml-base xml-core
Suggested packages:libgd-tools geoip-bin fcgiwrap nginx-doc sgml-base-doc debhelper...
Setting up nginx (1.4.6-1ubuntu3.3) ...---> 73f5d909ac29
Removing intermediate container d4e46baff94a
Step 4 : EXPOSE 80 8080---> Running in 4333d2f3c58c---> b693316fb774
Removing intermediate container 4333d2f3c58c
Step 5 : RUN touch test.txt---> Running in 815dfbfb2005...

3.4.3 上傳鏡像到Hub

首先用docker login命令輸入我們在Docker Hub的登錄信息,Docker會將其保存到~/.dockercfg中。

cdai $ docker login
Username: cdai
Password: 
Email: XXX@163.com
Login Succeeded
cdai $ cat ~/.dockercfg 
{"https://index.docker.io/v1/":{"auth":"XXXXaToxXXXXXXlEYiE=","email":"XXX@163.com"}}cdai $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
cdai/sqlite3        v1                  e10622157a5d        37 minutes ago      321.8 MB
32bit/ubuntu        14.04               c062cc00654e        11 hours ago        295.3 MBcdai $ docker push cdai/sqlite3:v1
The push refers to a repository [cdai/sqlite3] (len: 1)
Sending image list
Pushing repository cdai/sqlite3 (1 tags)
c062cc00654e: Buffering to disk ...

4.附:Docker相關技術

  • 容器隔離:采用libcontainer取代了LXC作為默認容器。通過內核的pid、net、ipc、mnt和uts等命名空間實現對進程、網絡、消息、文件系統和主機名的隔離。
  • 資源調配:通過cgroups控制資源的度量和分配。
  • 可移植性:利用AUFS實現對容器的快速更新。AUFS具有層的概念,每次修改都是在已有的只寫層進行增量修改,修改內容形成新的文件層而不影響原有的層。
  • 安全性:通過命名空間的隔離和cgroups審計,并配合一系列工具如SELinux等來保證安全。

轉載于:https://www.cnblogs.com/xiaomaohai/p/6157599.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256758.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

有限元筆記04:二維實體單元

1.二維實體即平面問題 創建單元的步驟: 型函數(插值函數)>>>應變矩陣>>>剛度矩陣>>>質量矩陣>>>力的分量 1)三角形單元 2)面坐標 3)線性矩形單元 4)高斯積分 6)任意…

oracle中的常用函數

一、運算符算術運算符&#xff1a; - * / 可以在select 語句中使用連接運算符&#xff1a;|| select deptno|| dname from dept; 比較運算符&#xff1a;> > ! < < like between is null in邏輯運算符&#xff1a;not and or 集合運算符&#xff1a; 集合操作不適…

SLAM后端優化之-核函數

1、核函數作用&#xff1a;保證每條邊的誤差不會大的沒邊&#xff0c;掩蓋掉其他的邊 在SLAM后端優化中&#xff0c;BA優化了所有的相機姿態和所有路標點&#xff0c;使用的最小化誤差項作的二范數平方和作為目標函數&#xff1b;當我們的誤差來源特別大的時候&#xff1b;BA優…

線程與內核對象的同步-2

等待定時器內核事件 CreateWaitableTimer( PSECURITY_ATTRIBUTES psa, BOOL fManualReset, PCTSTR pszName); 進程可以獲得它自己的與進程相關的現有等待定時器的句柄。 HANDLE OpenWaitableTimer( DWORD dwDesiredAccess, BOOL bInheritHandle, PCTSTR pszName); 等待定時器對…

【Win10 應用開發】自定義應用標題欄

Win 10 app對窗口標題欄的自定義包括兩個層面&#xff1a;一是只定義標題中各部分的顏色&#xff0c;如標題欄上文本的顏色、三個系統按鈕&#xff08;最大化&#xff0c;最小化&#xff0c;關閉&#xff09;的背景顏色等&#xff1b;另一層是把窗口的可視區域直接擴展到標題欄…

學習筆記(59):Python實戰編程-Graphics

立即學習:https://edu.csdn.net/course/play/19711/343123?utm_sourceblogtoedu 1.graphics&#xff1a;圖形界面組件的繪制&#xff0c;利用的是坐標的定位來對各個組件進行相對地位置布局 2.graphics與thinkter的區別 1&#xff09;窗口的創建上&#xff1a; win graphics…

IIS6配置Asp.net MVC運行環境

Windows server 2003 IIS6 搭建Asp.net MVC運行環境 1、安裝.Net Framework4.0。 下載地址&#xff1a; http://www.microsoft.com/zh-cn/download/details.aspx?id17718 2、安裝WindowsServer2003-KB968930-x86-CHS.exe&#xff0c;PowerShell 2.0的補丁 下載地址&#xff1…

VIO-slam 系統構建

文章目錄 目錄 文章目錄 前言 一、VIO系統數據的獲取&#xff1a;圖像傳感器選型、IMU傳感器選型 二、建立linux系統ROS環境 三、如何讀取圖像數據 四、如何讀取IMU傳感器數據 五、標定圖像和IMU數據的外參、相機的內參 六、移植VINS-MONO或者VINS-FUSION&#xff1a;主要調試獲…

MySQL5.7多源復制的實驗

MySQL5.7多源復制的實驗 node1: 192.168.2.171 master1 node2: 192.168.2.172 slave node3: 192.168.2.170 master2 node2上執行&#xff1a; change master to master_host192.168.2.171, master_userrpl, master_passwordAbcd1234, master_port3306, master_log…

最優化課堂筆記04:非線性規劃(考點4-5例題)

目錄 4.1 多元函數的泰勒展開 4.2方向導數與梯度 4.2.1方向導數 n元函數在點沿特定方向的方向導數 4.2.2梯度 4.3二次函數及正定矩陣 4.4凸函數與凸規劃 4.4.1凸函數 4.4.2凸規劃 4.4無約束優化問題的極值條件 4.5約束優化問題的極值條件&#xff08;重點考點&#x…

k近鄰算法C++二維情況下的實現

k近鄰算法C二維實現 這是一個k近鄰算法的二維實現&#xff08;即K2的情況&#xff09;。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <cmath> u…

java——對象學習筆記

1.面向對象&#xff08;OOP&#xff09;的三大特性 對象的行為&#xff08;behavior&#xff09;&#xff1a;可以對對象施加哪些操作&#xff0c;或者可以對對象施加哪些方法。 對象的狀態&#xff08;state&#xff09;&#xff1a;當施加那些方法后&#xff0c;對象如何響應…

C++獲取一段算法程序耗時方法

1、添加頭文件庫#include <chrono> 2、代碼編寫 std::chrono::steady_clock::time_point t1 std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point t2 std::chrono::steady_clock::now(); std::chrono::duration<double> time_used12 st…

cisco 動態路由協議RIP筆記

動態路由協議RIP router(config)#router rip 啟動RIP進程 router(config-router)#network 1.0.0.0 宣告主網絡號 router(config-router)#version 2 使用版本v2 router(config-router)#no auto-summary 關閉路由匯總功能 本文轉自 meteor_hy 51CTO博客&#xff0c;原文鏈接&a…

EBS FORM開發問題總結

1&#xff0c;form是基于單表視圖建立的&#xff0c;沒有寫on-insert此類的觸發器。在視圖上加了個rownum列結果導致form上的列不能更新 據說此種情形下的form會判斷視圖上的列是否屬于基表&#xff0c;不屬于的話會導致整個塊不能更新。 2&#xff0c;在form界面上顯示行號 在…

Django 學習資源

相關的分享&#xff1a; 開發者頭條&#xff1a;http://toutiao.io/search?utf8%E2%9C%93&qdjango 極客頭條及Django資訊&#xff1a;http://www.csdn.net/tag/django/news 一些優秀的文章&#xff1a; Django 常用測試方法&#xff1a;https://messense.me/django-common…

orb-slam2在PC和ARM上運行

ORBSLAM2的編譯與運行 環境&#xff1a;Ubuntu16.04 ORBSLAM2 &#xff08;1&#xff09;安裝工具 sudo apt-get install cmake sudo apt-get install git sudo apt-get install gcc g (2) 安裝pangolin 安裝依賴項&#xff1a; sudo apt-get install libglew-dev sudo ap…

爛泥:智能DNS使用與配置

公司的業務現在已經擴展到海外&#xff0c;對外提供的統一接口都是通過域名來解析的&#xff0c;但是海外用戶訪問國內接口的話&#xff0c;你懂的&#xff0c;很慢的。為了提高域名解析的速度&#xff0c;打算使用智能DNS功能&#xff0c;來解決海外用戶域名解析慢的問題。 PS…

現代制造工程——考試復習01

第一部分 金屬切削原理 1.切削過程中工件上的加工表面分類 2.不同工藝的工件和刀具的相對關系 3.不同工藝的主運動和進給運動的方向 4.思考&#xff1a;主運動一般只有一個&#xff0c;但是進給運動一個也可以是多個 5.切削三要素&#xff08;必考&#xff09; 6.思考&#x…