Docker概念
Docker 是世界領(lǐng)先的軟件容器平臺。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機器上可正常工作”的問題。運維人員利用 Docker 可以在隔離容器中并行運行和管理應(yīng)用醋寝,獲得更好的計算密度。企業(yè)利用 Docker 可以構(gòu)建敏捷的軟件交付管道苛骨,以更快的速度啦撮、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應(yīng)用發(fā)布新功能。
Docker 屬于 Linux 容器的一種封裝博肋,提供簡單易用的容器使用接口低斋。它是目前最流行的 Linux 容器解決方案。Docker 將應(yīng)用程序與該程序的依賴匪凡,打包在一個文件里面膊畴。運行這個文件,就會生成一個虛擬容器病游。程序在這個虛擬容器里運行唇跨,就好像在真實的物理機上運行一樣。有了 Docker衬衬,就不用擔(dān)心環(huán)境問題买猖。
為什么要使用Docker
容器除了運行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源滋尉,使得應(yīng)用的性能很高玉控,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機方式運行 10 個不同的應(yīng)用就要起 10 個虛擬機狮惜,而Docker 只需要啟動 10 個隔離的應(yīng)用即可高诺。
具體說來,Docker 在如下幾個方面具有較大的優(yōu)勢碾篡。
1虱而、更快速的交付和部署
對開發(fā)和運維(devop)人員來說,最希望的就是一次創(chuàng)建或配置耽梅,可以在任意地方正常運行薛窥。
開發(fā)者可以使用一個標(biāo)準(zhǔn)的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后,運維人員可以直接使用這個容器來部署代碼诅迷。 Docker 可以快速創(chuàng)建容器佩番,快速迭代應(yīng)用程序,并讓整個過程全程可見罢杉,使團隊中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的趟畏。 Docker 容器很輕很快!容器的啟動時間是秒級的滩租,大量地節(jié)約開發(fā)赋秀、測試、部署的時間律想。
2猎莲、更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內(nèi)核級的虛擬化技即,因此可以實現(xiàn)更高的性能和效率著洼。
3、更輕松的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行而叼,包括物理機身笤、虛擬機、公有云葵陵、私有云液荸、個人電腦、服務(wù)器等脱篙。 這種兼容性可以讓用戶把一個應(yīng)用程序從一個平臺直接遷移到另外一個娇钱。
4、更簡單的管理
使用 Docker涡尘,只需要小小的修改忍弛,就可以替代以往大量的更新工作响迂。所有的修改都以增量的方式被分發(fā)和更新考抄,從而實現(xiàn)自動化并且高效的管理。
Docker vs VM
從下圖可以看出蔗彤,VM是一個運行在宿主機之上的完整的操作系統(tǒng)川梅,VM運行自身操作系統(tǒng)會占用較多的CPU、內(nèi)存然遏、硬盤資源贫途。Docker不同于VM,只包含應(yīng)用程序以及依賴庫待侵,基于libcontainer運行在宿主機上丢早,并處于一個隔離的環(huán)境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內(nèi)完成怨酝。由于Docker輕量傀缩、資源占用少,使得Docker可以輕易的應(yīng)用到構(gòu)建標(biāo)準(zhǔn)化的應(yīng)用中农猬。但Docker目前還不夠完善赡艰,比如隔離效果不如VM,共享宿主機操作系統(tǒng)的一些基礎(chǔ)庫等斤葱;網(wǎng)絡(luò)配置功能相對簡單慷垮,主要以橋接方式為主;查看日志也不夠方便靈活揍堕。
Docker 在容器的基礎(chǔ)上料身,進行了進一步的封裝,從文件系統(tǒng)衩茸、網(wǎng)絡(luò)互聯(lián)到進程隔離等等惯驼,極大的簡化了容器的創(chuàng)建和維護。使得 Docker 技術(shù)比虛擬機技術(shù)更為輕便递瑰、快捷祟牲。
作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢抖部。Docker 容器的啟動可以在秒級實現(xiàn)说贝,這相比傳統(tǒng)的虛擬機方式要快得多;Docker 對系統(tǒng)資源的利用率很高慎颗,一臺主機上可以同時運行數(shù)千個 Docker 容器乡恕。
Docker相關(guān)概念
Docker 包括三個基本概念:
- 鏡像(Image):Docker 鏡像(Image),就相當(dāng)于是一個 root 文件系統(tǒng)俯萎。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)傲宜。
- 容器(Container):鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例一樣夫啊,鏡像是靜態(tài)的定義函卒,容器是鏡像運行時的實體。容器可以被創(chuàng)建撇眯、啟動报嵌、停止、刪除熊榛、暫停等锚国。
- 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像玄坦。
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式血筑,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器。
Docker 容器通過 Docker 鏡像來創(chuàng)建。
容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類豺总。
Docker | 面向?qū)ο?/th> |
---|---|
容器 | 對象 |
鏡像 | 類 |
概念 | 說明 |
---|---|
Docker 鏡像(Images) | Docker 鏡像是用于創(chuàng)建 Docker 容器的模板梆砸,比如 Ubuntu 系統(tǒng)。 |
Docker 容器(Container) | 容器是獨立運行的一個或一組應(yīng)用园欣,是鏡像運行時的實體帖世。 |
Docker 客戶端(Client) | Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用于執(zhí)行 Docker 守護進程和容器沸枯。 |
Docker Registry | Docker 倉庫用來保存鏡像日矫,可以理解為代碼控制中的代碼倉庫。 Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用绑榴。 一個 Docker Registry 中可以包含多個倉庫(Repository)哪轿;每個倉庫可以包含多個標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像翔怎。 通常窃诉,一個倉庫會包含同一個軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個版本赤套。我們可以通過 <倉庫名>:<標(biāo)簽> 的格式來指定具體是這個軟件哪個版本的鏡像飘痛。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽容握。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具宣脉,通過一個簡單的命令行即可在相應(yīng)的平臺上安裝Docker,比如VirtualBox剔氏、 Digital Ocean塑猖、Microsoft Azure。 |
鏡像就相當(dāng)于打包好的版本谈跛,鏡像啟動之后運行在容器中羊苟,倉庫就是裝存儲鏡像的地方。
鏡像就是上面說的集裝箱,倉庫就是超級碼頭,容器就是我們運行程序的地方.docker運行程序的過程就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器.
- build:構(gòu)建,就是構(gòu)建鏡像.
- ship:運輸,運輸鏡像,從倉庫和主機運輸.
- run:運行的鏡像就是一個容器.
build,ship,run和鏡像,倉庫,容器是一一對應(yīng)的.
Docker 命令
#首先要在宿主機上安裝Docker感憾,Docker安裝參考[官方安裝文檔](https://docs.docker.com/installation/)蜡励。 Docker命令也比較類似Git,支持push以及pull操作上傳以及下載Docker鏡像吹菱。 查看當(dāng)前Docker的版本
docker version
#拉取docker鏡像
docker pull image_name
#查看宿主機上的鏡像巍虫,Docker鏡像保存在/var/lib/docker目錄下:
docker images
#刪除鏡像
docker rmi docker.io/tomcat:7.0.77-jre7 或者 docker rmi b39c68b7af30
#查看當(dāng)前有哪些容器正在運行
docker ps
#查看所有容器
docker ps -a
#啟動彭则、停止鳍刷、重啟容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
#后臺啟動一個容器后,如果想進入到這個容器俯抖,可以使用attach命令:
docker attach container_name/container_id
#停止所有docker容器
docker kill $(docker ps -q)
#刪除容器的命令:
docker rm container_name/container_id
#刪除所有停止的容器:
docker rm $(docker ps -a -q)
#查看當(dāng)前系統(tǒng)Docker信息
docker info
#從Docker hub上下載某個鏡像:
docker pull centos:latest
docker pull centos:latest
#查找Docker Hub上的nginx鏡像
docker search nginx
#執(zhí)行docker pull centos會將Centos這個倉庫下面的所有鏡像下載到本地repository输瓜。
#從當(dāng)前目錄下的Dockerfile(命名dockerfile好像也能識別,其他就不行了)建立鏡像
sudo docker build -t reponame:tag .
#別忘了最后那個.!
sudo docker run -it --name blabla -p <物理機>:<容器>(e.g. 127.0.0.1:3306:3306) -v /your/local/path/:/map/path/in/docker/ -v /etc/localtime:/etc/localtime --net =host -d reponame:tag
# 啟動容器
#[-it 是啟動交互和偽終端]
#[-p <IP>:<宿主機端口>:<容器端口> 將宿主機(物理機)映射或者可以理解為綁定,<IP>可以指定尤揣,也可以不指定搔啊,不指定默認(rèn)是0.0.0.0,建議還是指定]
#[-v 是掛載本機目錄到到docker目錄,最好每次都把-v /etc/localtime:/etc/localtime也帶上,確保docker 容器內(nèi)時間和服務(wù)器時間一致]
#[-d 是daemonize的意思北戏,就是使容器成為守護進程负芋,后臺運作]
#[--net是設(shè)置docker的網(wǎng)絡(luò)模式,默認(rèn)不設(shè)置的話就是bridge模式嗜愈,現(xiàn)在設(shè)置為和物理機網(wǎng)絡(luò)綁定的host模式旧蛾,更多可以看 Docker的4種網(wǎng)絡(luò)模式(http://www.cnblogs.com/gispathfinder/p/5871043.html)
#[--link 是容器鏈接]
#復(fù)習(xí)幾個特別的IP:
#①127.0.0.1是本地回環(huán)地址,代指本機; [對于綁定在127.0.0.1的端口而言蠕嫁,外部無法訪問锨天,不對外打開,僅僅對內(nèi)打開]
#②0.0.0.0 代表所有不清楚的IP剃毒,安全性差病袄,也是指本機?;[對于綁定在0.0.0.0的端口而言赘阀,外部可以訪問]
#③255.255.255.255 用人類的話說:“嘿益缠,這屋子的所有人聽著了!”
#④localhost 這個是域名基公,一般都是127.0.0.1左刽,這種對應(yīng)關(guān)系寫在你的/etc/hosts里面
sudo docker exec -it blabla /bin/bash #在啟動的容器blabla中運行/bin/bash
sudo docker exec -it blabla /the/path/of/your/command
sudo docker commit blabla repo:tag #提交保存容器到一個新的鏡像repo:tag
#容器的導(dǎo)出和導(dǎo)入
sudo docker export
sudo docker import
#鏡像的導(dǎo)出和導(dǎo)入
[文件]
sudo docker save repo:tag > backup.tar
sudo docker load < backup.tar
[dockerhub]
sudo docker login
sudo docker push repo:tag
sudo docker pull repo:tag
鏡像的概念更多偏向于一個環(huán)境包,這個環(huán)境包可以移動到任意的Docker平臺中去運行酌媒;而容器就是你運行環(huán)境包的實例欠痴。你可以針對這個環(huán)境包運行N個實例。換句話說container是images的一種具體表現(xiàn)形式秒咨。你也可以認(rèn)為鏡像與你裝載操作系統(tǒng)iso鏡像是一個概念利凑,容器則可理解為鏡像啟動的操作系統(tǒng)。一個鏡像可以啟動任意多個容器掂器,即可以裝載多個操作系統(tǒng)捌显。
Docker命令參考表
docker命令選項列表
選項 | 說明 | 其他 |
---|---|---|
–config [string] | 客戶端本地配置文件路徑 | 默認(rèn)為 ~/.docker |
-D, –debug | 啟用調(diào)試模式 | |
–help | 打印用法 | |
-H, –host list | 通過socket訪問指定的docker守護進程(服務(wù)端) | unix:// , fd:// , tcp:// |
-l, –log-level [string] | 設(shè)置日志級別 (debug 、info 陡厘、warn 抽米、error 、fatal) | 默認(rèn)為 info |
–tls | 啟用TLS加密 | |
–tlscacert [string] | 指定信任的CA根證書路徑 | 默認(rèn)為 ~/.docker/ca.pem |
–tlscert [string] | 客戶端證書路徑 | 默認(rèn)為 ~/.docker/cert.pem |
–tlskey [string] | 客戶端證書私鑰路徑 | 默認(rèn)為 ~/.docker/key.pem |
–tlsverify | 啟用TLS加密并驗證客戶端證書 | |
-v, –version | 打印docker客戶端版本信息 |
用于管理的子命令列表
選項 | 說明 |
---|---|
container | 管理容器 |
image | 管理鏡像 |
network | 管理容器網(wǎng)絡(luò)(默認(rèn)為bridge糙置、host云茸、none三個網(wǎng)絡(luò)配置) |
plugin | 管理插件 |
system | 管理系統(tǒng)資源。其中, docker system prune 命令用于清理沒有使用的鏡像, 容器, 數(shù)據(jù)卷以及網(wǎng)絡(luò) |
volume | 管理數(shù)據(jù)卷 |
swarm | 管理Swarm模式 |
service | 管理Swarm模式下的服務(wù) |
node | 管理Swarm模式下的docker集群中的節(jié)點 |
secret | 管理Swarm模式下的敏感數(shù)據(jù) |
stack | Swarm模式下利用compose-file管理服務(wù) |
基礎(chǔ)子命令列表
選項 | 說明 |
---|---|
attach | 進入運行中的容器, 顯示該容器的控制臺界面谤饭。注意, 從該指令退出會導(dǎo)致容器關(guān)閉 |
build | 根據(jù) Dockerfile 文件構(gòu)建鏡像 |
commit | 提交容器所做的改為為一個新的鏡像 |
cp | 在容器和宿主機之間復(fù)制文件 |
create | 根據(jù)鏡像生成一個新的容器 |
diff | 展示容器相對于構(gòu)建它的鏡像內(nèi)容所做的改變 |
events | 實時打印服務(wù)端執(zhí)行的事件 |
exec | 在已運行的容器中執(zhí)行命令 |
export | 導(dǎo)出容器到本地快照文件 |
history | 顯示鏡像每層的變更內(nèi)容 |
images | 列出本地所有鏡像 |
import | 導(dǎo)入本地容器快照文件為鏡像 |
info | 顯示 Docker 詳細(xì)的系統(tǒng)信息 |
inspect | 查看容器或鏡像的配置信息, 默認(rèn)為json數(shù)據(jù) |
kill | -s 選項向容器發(fā)送信號, 默認(rèn)為SIGKILL信號(強制關(guān)閉) |
load | 導(dǎo)入鏡像壓縮包 |
login | 登錄第三方倉庫 |
logout | 退出第三方倉庫 |
logs | 打印容器的控制臺輸出內(nèi)容 |
pause | 暫停容器 |
port | 容器端口映射列表 |
ps | 列出正在運行的容器, -a 選項顯示所有容器 |
pull | 從鏡像倉庫拉取鏡像 |
push | 將鏡像推送到鏡像倉庫 |
rename | 重命名容器名 |
restart | 重啟容器 |
rm | 刪除已停止的容器, -f 選項可強制刪除正在運行的容器 |
rmi | 刪除鏡像(必須先刪除該鏡像構(gòu)建的所有容器) |
run | 根據(jù)鏡像生成并進入一個新的容器 |
save | 打包本地鏡像, 使用壓縮包來完成遷移 |
search | 查找鏡像 |
start | 啟動關(guān)閉的容器 |
stats | 顯示容器對資源的使用情況(內(nèi)存标捺、CPU懊纳、磁盤等) |
stop | 關(guān)閉正在運行的容器 |
tag | 修改鏡像tag |
top | 顯示容器中正在運行的進程(相當(dāng)于容器內(nèi)執(zhí)行 ps -ef 命令) |
unpause | 恢復(fù)暫停的容器 |
update | 更新容器的硬件資源限制(內(nèi)存、CPU等) |
version | 顯示docker客戶端和服務(wù)端版本信息 |
wait | 阻塞當(dāng)前命令直到對應(yīng)的容器被關(guān)閉, 容器關(guān)閉后打印結(jié)束代碼 |
daemon | 這個子命令已過期, 將在Docker 17.12之后的版本中移出, 直接使用dockerd |
run命令常用選項
選項 | 說明 |
---|---|
-d | 后臺運行容器, 并返回容器ID亡容;不指定時, 啟動后開始打印日志, Ctrl + C 退出命令同時會關(guān)閉容器 |
-i | 以交互模式運行容器, 通常與 -t 同時使用嗤疯; |
-t | 為容器重新分配一個偽輸入終端, 通常與 -i 同時使用 |
–name “anyesu-container” | 為容器指定一個別名, 不指定時隨機生成 |
-h docker-anyesu | 設(shè)置容器的主機名, 默認(rèn)隨機生成 |
–dns 8.8.8.8 | 指定容器使用的DNS服務(wù)器, 默認(rèn)和宿主一致 |
-e docker_host=172.17.0.1 | 設(shè)置環(huán)境變量 |
–cpuset=”0-2” or –cpuset=”0,1,2” | 綁定容器到指定CPU運行 |
-m 100M | 設(shè)置容器使用內(nèi)存最大值 |
–net bridge | 指定容器的網(wǎng)絡(luò)連接類型, 支持 bridge / host / none / container 四種類型 |
–ip 172.18.0.13 | 為容器分配固定ip(需要使用自定義網(wǎng)絡(luò)) |
–expose 8081 –expose 8082 | 開放一個端口或一組端口, 會覆蓋鏡像設(shè)置中開放的端口 |
-p [宿主機端口]:[容器內(nèi)端口] | 宿主機到容器的端口映射, 可指定宿主機的要監(jiān)聽的ip, 默認(rèn)為 0.0.0.0 |
-P | 注意是大寫的, 宿主機隨機指定一組可用的端口映射容器 expose 的所有端口 |
-v [宿主機目錄路徑]:[容器內(nèi)目錄路徑] | 掛載宿主機的指定目錄(或文件)到容器內(nèi)的指定目錄(或文件) |
–add-host [主機名]:[ip] | 為容器hosts文件追加host, 默認(rèn)會在hosts文件最后追加 [主機名]:[容器ip] |
–volumes-from [其他容器名] | 將其他容器的數(shù)據(jù)卷添加到此容器 |
–link [其他容器名]:[在該容器中的別名] | 添加鏈接到另一個容器, 在本容器hosts文件中加入關(guān)聯(lián)容器的記錄, 效果類似于 --add-host |
Dockerfile,鏡像和容器
Dockerfile 概念
Docker 鏡像是一個特殊的文件系統(tǒng)闺兢,除了提供容器運行時所需的程序茂缚、庫、資源屋谭、配置等文件外阱佛,還包含了一些為運行時準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量戴而、用戶等)凑术。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變所意。
鏡像的定制實際上就是定制每一層所添加的配置淮逊、文件。如果我們可以把每一層修改扶踊、安裝泄鹏、構(gòu)建、操作的命令都寫入一個腳本秧耗,用這個腳本來構(gòu)建备籽、定制鏡像,那么之前提及的無法重復(fù)的問題分井、鏡像構(gòu)建透明性的問題车猬、體積的問題就都會解決。這個腳本就是 Dockerfile尺锚。
Dockerfile 是一個文本文件珠闰,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層瘫辩,因此每一條指令的內(nèi)容伏嗜,就是描述該層應(yīng)當(dāng)如何構(gòu)建。有了 Dockerfile伐厌,當(dāng)我們需要定制自己額外的需求時承绸,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可挣轨,省去了敲命令的麻煩军熏。
Dockerfile中文名叫鏡像描述文件,是一個包含用于組合鏡像目錄的文本文檔刃唐,也可以叫“腳本”羞迷。他通過讀取Dockerfile中的指令安裝步驟自動生成鏡像界轩。
Dockerfile文件格式
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# 1画饥、第一行必須指定 基礎(chǔ)鏡像信息
FROM ubuntu
# 2衔瓮、維護者信息
MAINTAINER docker_user docker_user@email.com
# 3、鏡像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 4抖甘、容器啟動執(zhí)行指令
CMD /usr/sbin/nginx
Dockerfile 分為四部分:基礎(chǔ)鏡像信息热鞍、維護者信息、鏡像操作指令衔彻、容器啟動執(zhí)行指令薇宠。一開始必須要指明所基于的鏡像名稱,接下來一般會說明維護者信息艰额;后面則是鏡像操作指令澄港,例如 RUN 指令。每執(zhí)行一條RUN 指令柄沮,鏡像添加新的一層回梧,并提交;最后是 CMD 指令祖搓,來指明運行容器時的操作命令狱意。
git+docker
一個管理代碼,一個管理環(huán)境
git命令大合集
git init repo #初始化一個叫repo的本地git倉庫
#實際上就是創(chuàng)建一個repo的目錄拯欧,然后目錄下放一個.git详囤,.git包含了git的所有記錄,判斷一個目錄是否為git倉庫镐作,就看有沒有.git目錄藏姐,有.git目錄往下都屬于同一個git倉庫
#如果你把.git這個目錄刪除了,你的代碼雖然還在该贾,但是你的歷史變更記錄就全部沒有了包各,所以一般別動這個.git
git add file #往暫存區(qū)添加一個叫file的文件
git diff #對比修改內(nèi)容和git中最新記錄的commit的區(qū)別,最好在add之前用git diff看一看靶庙,避免一些像加了空白鍵那種無效提交
git add . #往暫存區(qū)添加在git status中提示需要add的文件(git status不會提示被.gitignore忽略的文件)
git commit -m "blablabla" #把暫存區(qū)的內(nèi)容正式提交到本地的當(dāng)前分支,其中那個blablabla就是對本次提交的說明
git commit
# 最近實踐發(fā)現(xiàn)加了-m问畅,我會盡可能擠成一行來寫,但是push到github后六荒,查看commit的時候就發(fā)現(xiàn)寫的記錄信息全部擠在一行护姆,難看死了,有些還被忽略了
# 所以不如直接git commit記錄比較全面的信息
# 不過之前得先指定git config --global core.editor /usr/bin/vim,不然貌似默認(rèn)用的是vi掏击,vi的話就有可能在你保存的時候會崩潰
# 以至于你寫的一堆提交信息全沒了.
#git commit 還有一個-a的選項卵皂,是表示連同未add的文件改動也一同加進來,因為你可能add以后又改動了文件砚亭,而一般你前面add了內(nèi)容就只用-m就可以了灯变,不用-am
git status #查看當(dāng)前所在git倉庫情況
git log #查看提交歷史殴玛,你會看到你自己之前commit時候的說明,各種blablabla
git reflog #查看操作歷史
git clone HTTPS/SSH #克隆一個項目
# 常見的要么就是長成https型的(e.g. https://github.com/tesseract-ocr/tesseract.git)
# 要么就是長成ssh型的(e.g. git@github.com:tesseract-ocr/tesseract.git)
git remote -v #查看遠(yuǎn)程代碼倉庫的信息
git remote add origin HTTPS/SSH #添加一個叫origin遠(yuǎn)程倉庫地址添祸,一般克隆自帶滚粟,如果是本地新創(chuàng)建的話就得執(zhí)行這句,然后才能push
git remote remove origin #刪除一個叫origin遠(yuǎn)程倉庫地址
git push origin <本地分支>:<遠(yuǎn)程分支> #如果沒有冒號后面的刃泌,此時默認(rèn)推送到遠(yuǎn)程origin倉庫的與<本地分支>同名的分支凡壤,如果不存在,則會被新建
git fetch --all #這條命令一般用于如果有人遠(yuǎn)程push了一條分支到repo耙替,你本地想要拉下來亚侠,直接checkout提示本地沒有,就可以fetch全部分支了~
git pull origin <遠(yuǎn)程分支>:<本地分支> #如果沒有冒號后面的俗扇,此時默認(rèn)拉取并合并遠(yuǎn)程倉庫origin的 <遠(yuǎn)程分支>到當(dāng)前分支硝烂,pull相當(dāng)于fetch+merge
git pull --rebase origin dev <遠(yuǎn)程分支>:<本地分支> #拉取遠(yuǎn)程git代碼倉庫origin的dev分支更新,并以重建的方式合并到本地分支
#一般要是嫌麻煩铜幽,就像上面那樣直接pull就好了滞谢,有些潔癖者喜歡用rebase保證本地的線性干凈,本地可以rebase啥酱,遠(yuǎn)程就別這么做了
git merge --no-ff dev master #合并本地dev分支到master分支爹凹,潔癖者會為了干凈歷史加上--no-ff選項(--no-ff意思是no fast forward非快進式合并,某公司面試問了--no-ff含義)
git merge --no-ff dev #合并本地dev分支到本地當(dāng)前分支镶殷,潔癖者會為了干凈歷史加上--no-ff選項
#沖突解決:在pull 和merge的時候會因為合并雙方文件內(nèi)容不一樣而導(dǎo)致沖突禾酱,它會顯示給你發(fā)生沖突的文件,并自動在沖突文件中標(biāo)注好不一樣的段落
#解決沖突其實已經(jīng)有很多很好的工具了(比如vimdiff之類的)绘趋,但是我覺得這些工具都稍顯得復(fù)雜不簡約颤陶,所以我推薦直接用vim打開發(fā)生沖突的腳本,手動修改好陷遮,保存
#用vim修改(sublime也不錯)清晰方便滓走,再add==>commit==>push就沒問題了(第二次push是以你修改后提交為準(zhǔn),git這時候并不理會遠(yuǎn)程倉庫的文件內(nèi)容帽馋,直接覆蓋過去~)
#或者修改好沖突以后就git add沖突的文件搅方,再git merge --continue或者git rebase --continue,省去了commit的功夫
git branch #顯示本地所有分支
git branch -D dev #-D是-d --force的shotcut绽族,強制刪除dev本地分支
git push origin :dev #刪除遠(yuǎn)程倉庫的dev分支姨涡,相當(dāng)于把一個空分支push到遠(yuǎn)程倉庫的dev上,等同于刪除該分支吧慢。
git checkout -b dev #切換到dev分支,-b是沒有dev分支時候才需要加上去的涛漂,這種情況下是創(chuàng)建并切換到dev分支的意思
git checkout -- file #撤銷工作區(qū)中一個叫file的文件的修改
git reset HEAD file #撤銷暫存區(qū)中一個叫file的文件到工作區(qū)中
git reset --hard HEAD^ #回滾當(dāng)前分支到上一個版本,注意末尾的^,有n個^說明回滾多上個版本,也就是回到多少次commit前
#貌似把上面的file 換成*(wildcard)通配符來代指所有是可以的.我就經(jīng)常多文件撤銷工作區(qū)修改的時候git checkout -- * 匈仗,純粹因為懶得一個個輸入...
在開發(fā)調(diào)試過程中瓢剿,需要不斷更新代碼到Git庫,然后使用Git庫中的最新代碼更新運行著的Docker容器悠轩,目前看來有如下兩種方法间狂,建議使用第二種。
- 直接在容器中執(zhí)行g(shù)it命令哗蜈,更新容器中的目錄和文件(不推薦)
- 首先前标,在構(gòu)建容器鏡像文件的時候坠韩,定義在Dockfile文件中并設(shè)置代碼的Git庫
RUN apt-get install -y git
RUN git config --global user.name "Xiangbin Han"
RUN git config --global user.email "youremail@mydomain.com"
RUN mkdir /home/myname/.ssh/
RUN chmod 700 /home/myname/.ssh/
ADD id_rsa /home/myname/.ssh/
RUN chmod 600 /home/myname/.ssh/id_rsa
RUN echo 'StrictHostKeyChecking no\nUserKnownHostsFile /dev/null' > /home/myname/.ssh/config
RUN chmod 644 /home/myname/.ssh/config
RUN su -myname -c \
"git clone ssh://myname@gerrit.server.com:29418/myparent/myproject /home/myname/myproject \
; cd /home/myname/myproject \
; git fetch ssh://myname@gerrit.server.com:29418/myparent/myproject ${refs} \
; git checkout FETCH_HEAD"
RUN chown -R myname:mygroup /home/myname
- 其次距潘,基于構(gòu)建的容器鏡像文件啟動容器
docker run -it --name container_name image_name:version
- 需要更新運行中的容器的目錄或文件時,執(zhí)行如下Docker命令docker exec
docker exec container_name bash -c "cd /home/myname/myproject;git fetch ssh://myname@gerrit.server.com:29418/myparent/myproject ${GERRIT_REFSPEC};git checkout FETCH_HEAD"
- 直接對容器實例執(zhí)行docker cp命令只搁,更新容器中的目錄和文件(推薦)
docker cp ~/myproject/. container_name:/home/myname/myproject
- 啟動容器實例的時候音比,為容器加載Volume(推薦)
docker run -v /mnt/temp/myproject/:/home/myname/myproject ...
補充說明:
在生產(chǎn)環(huán)境中,由于代碼比較穩(wěn)定氢惋,可以在構(gòu)建鏡像的時候就代碼直接加入到鏡像中洞翩。
即在Dockfile中設(shè)置如下:
RUN COPY . /home/myname/myproject
說明,這種方法的弊端是必須能夠在容器內(nèi)部執(zhí)行Git命令焰望,因而不得不將私鑰加入到容器骚亿,導(dǎo)致安全風(fēng)險。
我在云端熊赖,使用Docker搭建了Git裸庫来屠,裸庫中用Git hook來同步代碼。使用Docker來運行應(yīng)用震鹉,通過瀏覽器來檢查結(jié)果俱笛。
因為,代碼的編輯和運行環(huán)境的分離传趾,開發(fā)工程師可以靈活的選擇開發(fā)工具迎膜。開發(fā)工具可以是在線編輯器,也可以是本地的編輯器浆兰。
借助于Docker的靈活性磕仅,開發(fā)工程師可以快速配置出應(yīng)用運行環(huán)境,并分享給開發(fā)團隊成員簸呈。
如果說Dockerfile文件是拿來構(gòu)建鏡像的榕订,那么docker-compose.yml文件就是用來編排服務(wù)的,它以一種更加簡潔的方式來安排服務(wù)的啟動順序蝶棋,依賴關(guān)系卸亮,運行指令。真正達(dá)到了“一鍵運行”的效果玩裙。
官方例子
clone
docker run --name repo alpine/git clone https://github.com/docker/getting-started.git
各個參數(shù)解析:
- docker: Docker 的二進制執(zhí)行文件兼贸。
- run: 與前面的 docker 組合來運行一個容器段直。
- --name 為容器repo 指定一個別名 alpine/git, 不指定時隨機生成。repo 為指定要運行的鏡像溶诞,Docker 首先從本地主機上查找鏡像是否存在鸯檬,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像 alpine/git的最新版本螺垢。
- clone https://github.com/docker/getting-started.git : 在啟動的容器里執(zhí)行的命令
以上命令完整的意思可以解釋為:Docker 以alpine 鏡像創(chuàng)建一個新容器喧务,然后在容器里執(zhí)行 git clone https://github.com/docker/getting-started.git 。
將容器repo的/git/getting-started下的getting-started目錄 拷貝到(命令最后有一個. 表示當(dāng)前目錄)當(dāng)前目錄
docker cp repo:/git/getting-started/ .
build
為容器重新分配一個偽輸入終端docker101tutorrial(即復(fù)制新建一個image枉圃,image id不一致功茴,name重命名為docker101tutorrial), 通常與 -i 同時使用(-i: 交互式操作。要退出終端孽亲,直接輸入 exit)
cd getting-started
docker build -t docker101tutorrial .
Run
docker run -d -p 80:80 --name docker-tutorial docker101tutorial
新建并啟動容器
- -d選項:表示后臺運行坎穿,注:加了 -d 參數(shù)默認(rèn)不會進入容器,想要進入容器需要使用指令 docker exec
- –name選項:指定運行后容器的名字為docker-tutorial,之后可以通過名字來操作容器 docker101tutorial為鏡像
- -p選項:指定端口映射返劲,格式為:hostPort:containerPort
docker container ls
Share
如果想要分享你的image玲昧,那么必須要有Docker Hub 的賬號,打開Docker desk 登陸(未注冊的可以hub.docker.com)
docker tag docker101tutorial tokenn/docker101tutorial
docker push tokenn/docker101tutorial
查看我們的分享
https://hub.docker.com/repositories
拉取
docker pull tokenn/docker101tutorial