Docker入門

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>
容器 對象
鏡像
image
概念 說明
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 

image.png

鏡像的概念更多偏向于一個環(huán)境包,這個環(huán)境包可以移動到任意的Docker平臺中去運行酌媒;而容器就是你運行環(huán)境包的實例欠痴。你可以針對這個環(huán)境包運行N個實例。換句話說container是images的一種具體表現(xiàn)形式秒咨。你也可以認(rèn)為鏡像與你裝載操作系統(tǒng)iso鏡像是一個概念利凑,容器則可理解為鏡像啟動的操作系統(tǒng)。一個鏡像可以啟動任意多個容器掂器,即可以裝載多個操作系統(tǒng)捌显。

image.png

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 指令祖搓,來指明運行容器時的操作命令狱意。

image.png

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容器悠轩,目前看來有如下兩種方法间狂,建議使用第二種。

  1. 直接在容器中執(zhí)行g(shù)it命令哗蜈,更新容器中的目錄和文件(不推薦)
  1. 首先前标,在構(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
  1. 其次距潘,基于構(gòu)建的容器鏡像文件啟動容器
docker run -it --name container_name image_name:version
  1. 需要更新運行中的容器的目錄或文件時,執(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"
  1. 直接對容器實例執(zhí)行docker cp命令只搁,更新容器中的目錄和文件(推薦)
docker cp ~/myproject/. container_name:/home/myname/myproject
  1. 啟動容器實例的時候音比,為容器加載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á)到了“一鍵運行”的效果玩裙。

image.png

官方例子

image.png

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

image.png

將容器repo的/git/getting-started下的getting-started目錄 拷貝到(命令最后有一個. 表示當(dāng)前目錄)當(dāng)前目錄

docker cp repo:/git/getting-started/ .
image.png

build

為容器重新分配一個偽輸入終端docker101tutorrial(即復(fù)制新建一個image枉圃,image id不一致功茴,name重命名為docker101tutorrial), 通常與 -i 同時使用(-i: 交互式操作。要退出終端孽亲,直接輸入 exit)

cd getting-started
docker build -t docker101tutorrial .
image.png

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
image.png
docker container ls
image.png

Share

image.png

如果想要分享你的image玲昧,那么必須要有Docker Hub 的賬號,打開Docker desk 登陸(未注冊的可以hub.docker.com

docker tag docker101tutorial tokenn/docker101tutorial

docker push tokenn/docker101tutorial
image.png

查看我們的分享
https://hub.docker.com/repositories

image.png

拉取

docker pull tokenn/docker101tutorial
image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篮绿,一起剝皮案震驚了整個濱河市孵延,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亲配,老刑警劉巖尘应,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弃榨,居然都是意外死亡菩收,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門鲸睛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娜饵,“玉大人,你說我怎么就攤上這事官辈∠湮瑁” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵拳亿,是天一觀的道長晴股。 經(jīng)常有香客問我,道長肺魁,這世上最難降的妖魔是什么电湘? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上寂呛,老公的妹妹穿的比我還像新娘怎诫。我一直安慰自己,他們只是感情好贷痪,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布幻妓。 她就那樣靜靜地躺著,像睡著了一般劫拢。 火紅的嫁衣襯著肌膚如雪肉津。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天舱沧,我揣著相機與錄音妹沙,去河邊找鬼。 笑死狗唉,一個胖子當(dāng)著我的面吹牛初烘,可吹牛的內(nèi)容都是我干的涡真。 我是一名探鬼主播分俯,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哆料!你這毒婦竟也來了缸剪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤东亦,失蹤者是張志新(化名)和其女友劉穎杏节,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典阵,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡奋渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壮啊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫉鲸。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歹啼,靈堂內(nèi)的尸體忽然破棺而出玄渗,到底是詐尸還是另有隱情,我是刑警寧澤狸眼,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布藤树,位于F島的核電站,受9級特大地震影響拓萌,放射性物質(zhì)發(fā)生泄漏岁钓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屡限。 院中可真熱鬧降宅,春花似錦、人聲如沸囚霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拓型。三九已至额嘿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劣挫,已是汗流浹背册养。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留压固,地道東北人球拦。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像帐我,于是被迫代替她去往敵國和親坎炼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容