Docker入門

Docker概念

Docker 是世界領(lǐng)先的軟件容器平臺。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機(jī)器上可正常工作”的問題。運(yùn)維人員利用 Docker 可以在隔離容器中并行運(yùn)行和管理應(yīng)用,獲得更好的計(jì)算密度。企業(yè)利用 Docker 可以構(gòu)建敏捷的軟件交付管道,以更快的速度、更高的安全性和可靠的信譽(yù)為 Linux 和 Windows Server 應(yīng)用發(fā)布新功能。

Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。Docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面。運(yùn)行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運(yùn)行,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣。有了 Docker,就不用擔(dān)心環(huán)境問題。

為什么要使用Docker

容器除了運(yùn)行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,同時系統(tǒng)的開銷盡量小。傳統(tǒng)虛擬機(jī)方式運(yùn)行 10 個不同的應(yīng)用就要起 10 個虛擬機(jī),而Docker 只需要啟動 10 個隔離的應(yīng)用即可。

具體說來,Docker 在如下幾個方面具有較大的優(yōu)勢。

1、更快速的交付和部署

對開發(fā)和運(yùn)維(devop)人員來說,最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運(yùn)行。

開發(fā)者可以使用一個標(biāo)準(zhǔn)的鏡像來構(gòu)建一套開發(fā)容器,開發(fā)完成之后,運(yùn)維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個過程全程可見,使團(tuán)隊(duì)中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節(jié)約開發(fā)、測試、部署的時間。

2、更高效的虛擬化

Docker 容器的運(yùn)行不需要額外的 hypervisor 支持,它是內(nèi)核級的虛擬化,因此可以實(shí)現(xiàn)更高的性能和效率。

3、更輕松的遷移和擴(kuò)展

Docker 容器幾乎可以在任意的平臺上運(yùn)行,包括物理機(jī)、虛擬機(jī)、公有云、私有云、個人電腦、服務(wù)器等。 這種兼容性可以讓用戶把一個應(yīng)用程序從一個平臺直接遷移到另外一個。

4、更簡單的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實(shí)現(xiàn)自動化并且高效的管理。

Docker vs VM

從下圖可以看出,VM是一個運(yùn)行在宿主機(jī)之上的完整的操作系統(tǒng),VM運(yùn)行自身操作系統(tǒng)會占用較多的CPU、內(nèi)存、硬盤資源。Docker不同于VM,只包含應(yīng)用程序以及依賴庫,基于libcontainer運(yùn)行在宿主機(jī)上,并處于一個隔離的環(huán)境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內(nèi)完成。由于Docker輕量、資源占用少,使得Docker可以輕易的應(yīng)用到構(gòu)建標(biāo)準(zhǔn)化的應(yīng)用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機(jī)操作系統(tǒng)的一些基礎(chǔ)庫等;網(wǎng)絡(luò)配置功能相對簡單,主要以橋接方式為主;查看日志也不夠方便靈活。

Docker 在容器的基礎(chǔ)上,進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等,極大的簡化了容器的創(chuàng)建和維護(hù)。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷。

作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。Docker 容器的啟動可以在秒級實(shí)現(xiàn),這相比傳統(tǒng)的虛擬機(jī)方式要快得多;Docker 對系統(tǒng)資源的利用率很高,一臺主機(jī)上可以同時運(yùn)行數(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è)計(jì)中的類和實(shí)例一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時的實(shí)體。容器可以被創(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) 容器是獨(dú)立運(yùn)行的一個或一組應(yīng)用,是鏡像運(yùn)行時的實(shí)體。
Docker 客戶端(Client) Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護(hù)進(jìn)程通信。
Docker 主機(jī)(Host) 一個物理或者虛擬的機(jī)器用于執(zhí)行 Docker 守護(hù)進(jìn)程和容器。
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)于打包好的版本,鏡像啟動之后運(yùn)行在容器中,倉庫就是裝存儲鏡像的地方。

鏡像就是上面說的集裝箱,倉庫就是超級碼頭,容器就是我們運(yùn)行程序的地方.docker運(yùn)行程序的過程就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運(yùn)行起來變成容器.

  • build:構(gòu)建,就是構(gòu)建鏡像.
  • ship:運(yùn)輸,運(yùn)輸鏡像,從倉庫和主機(jī)運(yùn)輸.
  • run:運(yùn)行的鏡像就是一個容器.
    build,ship,run和鏡像,倉庫,容器是一一對應(yīng)的.

Docker 命令

#首先要在宿主機(jī)上安裝Docker,Docker安裝參考[官方安裝文檔](https://docs.docker.com/installation/)。 Docker命令也比較類似Git,支持push以及pull操作上傳以及下載Docker鏡像。 查看當(dāng)前Docker的版本
docker version

#拉取docker鏡像
docker pull image_name

#查看宿主機(jī)上的鏡像,Docker鏡像保存在/var/lib/docker目錄下:
docker images
#刪除鏡像
docker rmi  docker.io/tomcat:7.0.77-jre7   或者  docker rmi b39c68b7af30

#查看當(dāng)前有哪些容器正在運(yùn)行
docker ps

#查看所有容器
docker ps -a

#啟動、停止、重啟容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id

#后臺啟動一個容器后,如果想進(jìn)入到這個容器,可以使用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 <物理機(jī)>:<容器>(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>:<宿主機(jī)端口>:<容器端口>  將宿主機(jī)(物理機(jī))映射或者可以理解為綁定,<IP>可以指定,也可以不指定,不指定默認(rèn)是0.0.0.0,建議還是指定]
#[-v  是掛載本機(jī)目錄到到docker目錄,最好每次都把-v /etc/localtime:/etc/localtime也帶上,確保docker 容器內(nèi)時間和服務(wù)器時間一致]
#[-d  是daemonize的意思,就是使容器成為守護(hù)進(jìn)程,后臺運(yùn)作]  
#[--net是設(shè)置docker的網(wǎng)絡(luò)模式,默認(rèn)不設(shè)置的話就是bridge模式,現(xiàn)在設(shè)置為和物理機(jī)網(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)地址,代指本機(jī); [對于綁定在127.0.0.1的端口而言,外部無法訪問,不對外打開,僅僅對內(nèi)打開]
#②0.0.0.0 代表所有不清楚的IP,安全性差,也是指本機(jī)?;[對于綁定在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中運(yùn)行/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平臺中去運(yùn)行;而容器就是你運(yùn)行環(huán)境包的實(shí)例。你可以針對這個環(huán)境包運(yùn)行N個實(shí)例。換句話說container是images的一種具體表現(xiàn)形式。你也可以認(rèn)為鏡像與你裝載操作系統(tǒng)iso鏡像是一個概念,容器則可理解為鏡像啟動的操作系統(tǒng)。一個鏡像可以啟動任意多個容器,即可以裝載多個操作系統(tǒng)。

image.png

Docker命令參考表

docker命令選項(xiàng)列表

選項(xiàng) 說明 其他
–config [string] 客戶端本地配置文件路徑 默認(rèn)為 ~/.docker
-D, –debug 啟用調(diào)試模式
–help 打印用法
-H, –host list 通過socket訪問指定的docker守護(hù)進(jìn)程(服務(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加密并驗(yàn)證客戶端證書
-v, –version 打印docker客戶端版本信息

用于管理的子命令列表

選項(xiàng) 說明
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é)點(diǎn)
secret 管理Swarm模式下的敏感數(shù)據(jù)
stack Swarm模式下利用compose-file管理服務(wù)

基礎(chǔ)子命令列表

選項(xiàng) 說明
attach 進(jìn)入運(yùn)行中的容器, 顯示該容器的控制臺界面。注意, 從該指令退出會導(dǎo)致容器關(guān)閉
build 根據(jù) Dockerfile 文件構(gòu)建鏡像
commit 提交容器所做的改為為一個新的鏡像
cp 在容器和宿主機(jī)之間復(fù)制文件
create 根據(jù)鏡像生成一個新的容器
diff 展示容器相對于構(gòu)建它的鏡像內(nèi)容所做的改變
events 實(shí)時打印服務(wù)端執(zhí)行的事件
exec 在已運(yùn)行的容器中執(zhí)行命令
export 導(dǎo)出容器到本地快照文件
history 顯示鏡像每層的變更內(nèi)容
images 列出本地所有鏡像
import 導(dǎo)入本地容器快照文件為鏡像
info 顯示 Docker 詳細(xì)的系統(tǒng)信息
inspect 查看容器或鏡像的配置信息, 默認(rèn)為json數(shù)據(jù)
kill -s 選項(xiàng)向容器發(fā)送信號, 默認(rèn)為SIGKILL信號(強(qiáng)制關(guān)閉)
load 導(dǎo)入鏡像壓縮包
login 登錄第三方倉庫
logout 退出第三方倉庫
logs 打印容器的控制臺輸出內(nèi)容
pause 暫停容器
port 容器端口映射列表
ps 列出正在運(yùn)行的容器, -a 選項(xiàng)顯示所有容器
pull 從鏡像倉庫拉取鏡像
push 將鏡像推送到鏡像倉庫
rename 重命名容器名
restart 重啟容器
rm 刪除已停止的容器, -f 選項(xiàng)可強(qiáng)制刪除正在運(yùn)行的容器
rmi 刪除鏡像(必須先刪除該鏡像構(gòu)建的所有容器)
run 根據(jù)鏡像生成并進(jìn)入一個新的容器
save 打包本地鏡像, 使用壓縮包來完成遷移
search 查找鏡像
start 啟動關(guān)閉的容器
stats 顯示容器對資源的使用情況(內(nèi)存、CPU、磁盤等)
stop 關(guān)閉正在運(yùn)行的容器
tag 修改鏡像tag
top 顯示容器中正在運(yùn)行的進(jìn)程(相當(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命令常用選項(xiàng)

選項(xiàng) 說明
-d 后臺運(yùn)行容器, 并返回容器ID;不指定時, 啟動后開始打印日志, Ctrl + C 退出命令同時會關(guān)閉容器
-i 以交互模式運(yùn)行容器, 通常與 -t 同時使用;
-t 為容器重新分配一個偽輸入終端, 通常與 -i 同時使用
–name “anyesu-container” 為容器指定一個別名, 不指定時隨機(jī)生成
-h docker-anyesu 設(shè)置容器的主機(jī)名, 默認(rèn)隨機(jī)生成
–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運(yùn)行
-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 [宿主機(jī)端口]:[容器內(nèi)端口] 宿主機(jī)到容器的端口映射, 可指定宿主機(jī)的要監(jiān)聽的ip, 默認(rèn)為 0.0.0.0
-P 注意是大寫的, 宿主機(jī)隨機(jī)指定一組可用的端口映射容器 expose 的所有端口
-v [宿主機(jī)目錄路徑]:[容器內(nèi)目錄路徑] 掛載宿主機(jī)的指定目錄(或文件)到容器內(nèi)的指定目錄(或文件)
–add-host [主機(jī)名]:[ip] 為容器hosts文件追加host, 默認(rèn)會在hosts文件最后追加 [主機(jī)名]:[容器ip]
–volumes-from [其他容器名] 將其他容器的數(shù)據(jù)卷添加到此容器
–link [其他容器名]:[在該容器中的別名] 添加鏈接到另一個容器, 在本容器hosts文件中加入關(guān)聯(lián)容器的記錄, 效果類似于 --add-host

Dockerfile,鏡像和容器

Dockerfile 概念

Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運(yùn)行時所需的程序、庫、資源、配置等文件外,還包含了一些為運(yùn)行時準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。

鏡像的定制實(shí)際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構(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、維護(hù)者信息
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ǔ)鏡像信息、維護(hù)者信息、鏡像操作指令、容器啟動執(zhí)行指令。一開始必須要指明所基于的鏡像名稱,接下來一般會說明維護(hù)者信息;后面則是鏡像操作指令,例如 RUN 指令。每執(zhí)行一條RUN 指令,鏡像添加新的一層,并提交;最后是 CMD 指令,來指明運(yùn)行容器時的操作命令。

image.png

git+docker

一個管理代碼,一個管理環(huán)境

git命令大合集

  git init repo  #初始化一個叫repo的本地git倉庫
  #實(shí)際上就是創(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 
  # 最近實(shí)踐發(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的選項(xiàng),是表示連同未add的文件改動也一同加進(jìn)來,因?yàn)槟憧赡躠dd以后又改動了文件,而一般你前面add了內(nèi)容就只用-m就可以了,不用-am

  git status  #查看當(dāng)前所在git倉庫情況
  git log     #查看提交歷史,你會看到你自己之前commit時候的說明,各種blablabla
  git reflog  #查看操作歷史

  git clone HTTPS/SSH #克隆一個項(xiàng)目
  # 常見的要么就是長成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選項(xiàng)(--no-ff意思是no fast forward非快進(jìn)式合并,某公司面試問了--no-ff含義)
  git merge --no-ff dev          #合并本地dev分支到本地當(dāng)前分支,潔癖者會為了干凈歷史加上--no-ff選項(xiàng)

  #沖突解決:在pull 和merge的時候會因?yàn)楹喜㈦p方文件內(nèi)容不一樣而導(dǎo)致沖突,它會顯示給你發(fā)生沖突的文件,并自動在沖突文件中標(biāo)注好不一樣的段落
  #解決沖突其實(shí)已經(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,強(qiáng)制刪除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 -- * ,純粹因?yàn)閼械靡粋€個輸入... 

在開發(fā)調(diào)試過程中,需要不斷更新代碼到Git庫,然后使用Git庫中的最新代碼更新運(yùn)行著的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. 需要更新運(yùn)行中的容器的目錄或文件時,執(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. 直接對容器實(shí)例執(zhí)行docker cp命令,更新容器中的目錄和文件(推薦)
docker cp ~/myproject/. container_name:/home/myname/myproject
  1. 啟動容器實(shí)例的時候,為容器加載Volume(推薦)
docker run -v /mnt/temp/myproject/:/home/myname/myproject ...

補(bǔ)充說明:

在生產(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ùn)行應(yīng)用,通過瀏覽器來檢查結(jié)果。

因?yàn)椋a的編輯和運(yùn)行環(huán)境的分離,開發(fā)工程師可以靈活的選擇開發(fā)工具。開發(fā)工具可以是在線編輯器,也可以是本地的編輯器。
借助于Docker的靈活性,開發(fā)工程師可以快速配置出應(yīng)用運(yùn)行環(huán)境,并分享給開發(fā)團(tuán)隊(duì)成員。

如果說Dockerfile文件是拿來構(gòu)建鏡像的,那么docker-compose.yml文件就是用來編排服務(wù)的,它以一種更加簡潔的方式來安排服務(wù)的啟動順序,依賴關(guān)系,運(yùn)行指令。真正達(dá)到了“一鍵運(yùn)行”的效果。

image.png

官方例子

image.png

clone

docker run --name repo alpine/git clone https://github.com/docker/getting-started.git 

各個參數(shù)解析:

  • docker: Docker 的二進(jìn)制執(zhí)行文件。
  • run: 與前面的 docker 組合來運(yùn)行一個容器。
  • --name 為容器repo 指定一個別名 alpine/git, 不指定時隨機(jī)生成。repo 為指定要運(yùn)行的鏡像,Docker 首先從本地主機(jī)上查找鏡像是否存在,如果不存在,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選項(xiàng):表示后臺運(yùn)行,注:加了 -d 參數(shù)默認(rèn)不會進(jìn)入容器,想要進(jìn)入容器需要使用指令 docker exec
  • –name選項(xiàng):指定運(yùn)行后容器的名字為docker-tutorial,之后可以通過名字來操作容器 docker101tutorial為鏡像
  • -p選項(xiàng):指定端口映射,格式為: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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容