Docker入門

Docker概念

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

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

為什么要使用Docker

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

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

1、更快速的交付和部署

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

開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。

2、更高效的虛擬化

Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。

3、更輕松的遷移和擴展

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

4、更簡單的管理

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

Docker vs VM

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

Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多;Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。

Docker相關概念

Docker 包括三個基本概念:

  • 鏡像(Image):Docker 鏡像(Image),就相當于是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
  • 容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
  • 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。

Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

Docker 容器通過 Docker 鏡像來創建。

容器與鏡像的關系類似于面向對象編程中的對象與類。

Docker 面向對象
容器 對象
鏡像
image
概念 說明
Docker 鏡像(Images) Docker 鏡像是用于創建 Docker 容器的模板,比如 Ubuntu 系統。
Docker 容器(Container) 容器是獨立運行的一個或一組應用,是鏡像運行時的實體。
Docker 客戶端(Client) Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。
Docker 主機(Host) 一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。
Docker Registry Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。 Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。 一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。 通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。
Docker Machine Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

鏡像就相當于打包好的版本,鏡像啟動之后運行在容器中,倉庫就是裝存儲鏡像的地方。

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

  • build:構建,就是構建鏡像.
  • ship:運輸,運輸鏡像,從倉庫和主機運輸.
  • run:運行的鏡像就是一個容器.
    build,ship,run和鏡像,倉庫,容器是一一對應的.

Docker 命令

#首先要在宿主機上安裝Docker,Docker安裝參考[官方安裝文檔](https://docs.docker.com/installation/)。 Docker命令也比較類似Git,支持push以及pull操作上傳以及下載Docker鏡像。 查看當前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

#查看當前有哪些容器正在運行
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)

#查看當前系統Docker信息
docker info

#從Docker hub上下載某個鏡像:
docker pull centos:latest
docker pull centos:latest

#查找Docker Hub上的nginx鏡像
docker search nginx
#執行docker pull centos會將Centos這個倉庫下面的所有鏡像下載到本地repository。

#從當前目錄下的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>可以指定,也可以不指定,不指定默認是0.0.0.0,建議還是指定]
#[-v  是掛載本機目錄到到docker目錄,最好每次都把-v /etc/localtime:/etc/localtime也帶上,確保docker 容器內時間和服務器時間一致]
#[-d  是daemonize的意思,就是使容器成為守護進程,后臺運作]  
#[--net是設置docker的網絡模式,默認不設置的話就是bridge模式,現在設置為和物理機網絡綁定的host模式,更多可以看 Docker的4種網絡模式(http://www.cnblogs.com/gispathfinder/p/5871043.html)
#[--link 是容器鏈接]


#復習幾個特別的IP:
#①127.0.0.1是本地回環地址,代指本機; [對于綁定在127.0.0.1的端口而言,外部無法訪問,不對外打開,僅僅對內打開]
#②0.0.0.0 代表所有不清楚的IP,安全性差,也是指本機?;[對于綁定在0.0.0.0的端口而言,外部可以訪問]
#③255.255.255.255 用人類的話說:“嘿,這屋子的所有人聽著了!”
#④localhost  這個是域名,一般都是127.0.0.1,這種對應關系寫在你的/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

#容器的導出和導入
sudo docker export 
sudo docker import 

#鏡像的導出和導入
[文件]
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

鏡像的概念更多偏向于一個環境包,這個環境包可以移動到任意的Docker平臺中去運行;而容器就是你運行環境包的實例。你可以針對這個環境包運行N個實例。換句話說container是images的一種具體表現形式。你也可以認為鏡像與你裝載操作系統iso鏡像是一個概念,容器則可理解為鏡像啟動的操作系統。一個鏡像可以啟動任意多個容器,即可以裝載多個操作系統。

image.png

Docker命令參考表

docker命令選項列表

選項 說明 其他
–config [string] 客戶端本地配置文件路徑 默認為 ~/.docker
-D, –debug 啟用調試模式
–help 打印用法
-H, –host list 通過socket訪問指定的docker守護進程(服務端) unix:// , fd:// , tcp://
-l, –log-level [string] 設置日志級別 (debug 、info 、warn 、error 、fatal) 默認為 info
–tls 啟用TLS加密
–tlscacert [string] 指定信任的CA根證書路徑 默認為 ~/.docker/ca.pem
–tlscert [string] 客戶端證書路徑 默認為 ~/.docker/cert.pem
–tlskey [string] 客戶端證書私鑰路徑 默認為 ~/.docker/key.pem
–tlsverify 啟用TLS加密并驗證客戶端證書
-v, –version 打印docker客戶端版本信息

用于管理的子命令列表

選項 說明
container 管理容器
image 管理鏡像
network 管理容器網絡(默認為bridge、host、none三個網絡配置)
plugin 管理插件
system 管理系統資源。其中, docker system prune 命令用于清理沒有使用的鏡像, 容器, 數據卷以及網絡
volume 管理數據卷
swarm 管理Swarm模式
service 管理Swarm模式下的服務
node 管理Swarm模式下的docker集群中的節點
secret 管理Swarm模式下的敏感數據
stack Swarm模式下利用compose-file管理服務

基礎子命令列表

選項 說明
attach 進入運行中的容器, 顯示該容器的控制臺界面。注意, 從該指令退出會導致容器關閉
build 根據 Dockerfile 文件構建鏡像
commit 提交容器所做的改為為一個新的鏡像
cp 在容器和宿主機之間復制文件
create 根據鏡像生成一個新的容器
diff 展示容器相對于構建它的鏡像內容所做的改變
events 實時打印服務端執行的事件
exec 在已運行的容器中執行命令
export 導出容器到本地快照文件
history 顯示鏡像每層的變更內容
images 列出本地所有鏡像
import 導入本地容器快照文件為鏡像
info 顯示 Docker 詳細的系統信息
inspect 查看容器或鏡像的配置信息, 默認為json數據
kill -s 選項向容器發送信號, 默認為SIGKILL信號(強制關閉)
load 導入鏡像壓縮包
login 登錄第三方倉庫
logout 退出第三方倉庫
logs 打印容器的控制臺輸出內容
pause 暫停容器
port 容器端口映射列表
ps 列出正在運行的容器, -a 選項顯示所有容器
pull 從鏡像倉庫拉取鏡像
push 將鏡像推送到鏡像倉庫
rename 重命名容器名
restart 重啟容器
rm 刪除已停止的容器, -f 選項可強制刪除正在運行的容器
rmi 刪除鏡像(必須先刪除該鏡像構建的所有容器)
run 根據鏡像生成并進入一個新的容器
save 打包本地鏡像, 使用壓縮包來完成遷移
search 查找鏡像
start 啟動關閉的容器
stats 顯示容器對資源的使用情況(內存、CPU、磁盤等)
stop 關閉正在運行的容器
tag 修改鏡像tag
top 顯示容器中正在運行的進程(相當于容器內執行 ps -ef 命令)
unpause 恢復暫停的容器
update 更新容器的硬件資源限制(內存、CPU等)
version 顯示docker客戶端和服務端版本信息
wait 阻塞當前命令直到對應的容器被關閉, 容器關閉后打印結束代碼
daemon 這個子命令已過期, 將在Docker 17.12之后的版本中移出, 直接使用dockerd

run命令常用選項

選項 說明
-d 后臺運行容器, 并返回容器ID;不指定時, 啟動后開始打印日志, Ctrl + C 退出命令同時會關閉容器
-i 以交互模式運行容器, 通常與 -t 同時使用;
-t 為容器重新分配一個偽輸入終端, 通常與 -i 同時使用
–name “anyesu-container” 為容器指定一個別名, 不指定時隨機生成
-h docker-anyesu 設置容器的主機名, 默認隨機生成
–dns 8.8.8.8 指定容器使用的DNS服務器, 默認和宿主一致
-e docker_host=172.17.0.1 設置環境變量
–cpuset=”0-2” or –cpuset=”0,1,2” 綁定容器到指定CPU運行
-m 100M 設置容器使用內存最大值
–net bridge 指定容器的網絡連接類型, 支持 bridge / host / none / container 四種類型
–ip 172.18.0.13 為容器分配固定ip(需要使用自定義網絡)
–expose 8081 –expose 8082 開放一個端口或一組端口, 會覆蓋鏡像設置中開放的端口
-p [宿主機端口]:[容器內端口] 宿主機到容器的端口映射, 可指定宿主機的要監聽的ip, 默認為 0.0.0.0
-P 注意是大寫的, 宿主機隨機指定一組可用的端口映射容器 expose 的所有端口
-v [宿主機目錄路徑]:[容器內目錄路徑] 掛載宿主機的指定目錄(或文件)到容器內的指定目錄(或文件)
–add-host [主機名]:[ip] 為容器hosts文件追加host, 默認會在hosts文件最后追加 [主機名]:[容器ip]
–volumes-from [其他容器名] 將其他容器的數據卷添加到此容器
–link [其他容器名]:[在該容器中的別名] 添加鏈接到另一個容器, 在本容器hosts文件中加入關聯容器的記錄, 效果類似于 --add-host

Dockerfile,鏡像和容器

Dockerfile 概念

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

鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。有了 Dockerfile,當我們需要定制自己額外的需求時,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻煩。

Dockerfile中文名叫鏡像描述文件,是一個包含用于組合鏡像目錄的文本文檔,也可以叫“腳本”。他通過讀取Dockerfile中的指令安裝步驟自動生成鏡像。

Dockerfile文件格式

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
 
# 1、第一行必須指定 基礎鏡像信息
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、容器啟動執行指令
CMD /usr/sbin/nginx

Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令、容器啟動執行指令。一開始必須要指明所基于的鏡像名稱,接下來一般會說明維護者信息;后面則是鏡像操作指令,例如 RUN 指令。每執行一條RUN 指令,鏡像添加新的一層,并提交;最后是 CMD 指令,來指明運行容器時的操作命令。

image.png

git+docker

一個管理代碼,一個管理環境

git命令大合集

  git init repo  #初始化一個叫repo的本地git倉庫
  #實際上就是創建一個repo的目錄,然后目錄下放一個.git,.git包含了git的所有記錄,判斷一個目錄是否為git倉庫,就看有沒有.git目錄,有.git目錄往下都屬于同一個git倉庫
  #如果你把.git這個目錄刪除了,你的代碼雖然還在,但是你的歷史變更記錄就全部沒有了,所以一般別動這個.git

  git add file   #往暫存區添加一個叫file的文件
  git diff       #對比修改內容和git中最新記錄的commit的區別,最好在add之前用git diff看一看,避免一些像加了空白鍵那種無效提交
  git add .      #往暫存區添加在git status中提示需要add的文件(git status不會提示被.gitignore忽略的文件)

  git commit  -m  "blablabla"  #把暫存區的內容正式提交到本地的當前分支,其中那個blablabla就是對本次提交的說明
  git commit 
  # 最近實踐發現加了-m,我會盡可能擠成一行來寫,但是push到github后,查看commit的時候就發現寫的記錄信息全部擠在一行,難看死了,有些還被忽略了
  # 所以不如直接git commit記錄比較全面的信息
  # 不過之前得先指定git config --global core.editor /usr/bin/vim,不然貌似默認用的是vi,vi的話就有可能在你保存的時候會崩潰
  # 以至于你寫的一堆提交信息全沒了.

#git commit 還有一個-a的選項,是表示連同未add的文件改動也一同加進來,因為你可能add以后又改動了文件,而一般你前面add了內容就只用-m就可以了,不用-am

  git status  #查看當前所在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  #查看遠程代碼倉庫的信息
  git remote add origin HTTPS/SSH #添加一個叫origin遠程倉庫地址,一般克隆自帶,如果是本地新創建的話就得執行這句,然后才能push
  git remote remove origin  #刪除一個叫origin遠程倉庫地址
  git push origin <本地分支>:<遠程分支>  #如果沒有冒號后面的,此時默認推送到遠程origin倉庫的與<本地分支>同名的分支,如果不存在,則會被新建

  git fetch --all #這條命令一般用于如果有人遠程push了一條分支到repo,你本地想要拉下來,直接checkout提示本地沒有,就可以fetch全部分支了~

  git pull origin <遠程分支>:<本地分支>   #如果沒有冒號后面的,此時默認拉取并合并遠程倉庫origin的 <遠程分支>到當前分支,pull相當于fetch+merge
  git pull --rebase origin dev  <遠程分支>:<本地分支> #拉取遠程git代碼倉庫origin的dev分支更新,并以重建的方式合并到本地分支
  #一般要是嫌麻煩,就像上面那樣直接pull就好了,有些潔癖者喜歡用rebase保證本地的線性干凈,本地可以rebase,遠程就別這么做了

  git merge --no-ff dev master   #合并本地dev分支到master分支,潔癖者會為了干凈歷史加上--no-ff選項(--no-ff意思是no fast forward非快進式合并,某公司面試問了--no-ff含義)
  git merge --no-ff dev          #合并本地dev分支到本地當前分支,潔癖者會為了干凈歷史加上--no-ff選項

  #沖突解決:在pull 和merge的時候會因為合并雙方文件內容不一樣而導致沖突,它會顯示給你發生沖突的文件,并自動在沖突文件中標注好不一樣的段落
  #解決沖突其實已經有很多很好的工具了(比如vimdiff之類的),但是我覺得這些工具都稍顯得復雜不簡約,所以我推薦直接用vim打開發生沖突的腳本,手動修改好,保存
  #用vim修改(sublime也不錯)清晰方便,再add==>commit==>push就沒問題了(第二次push是以你修改后提交為準,git這時候并不理會遠程倉庫的文件內容,直接覆蓋過去~)
  #或者修改好沖突以后就git add沖突的文件,再git merge --continue或者git rebase --continue,省去了commit的功夫

  git branch   #顯示本地所有分支
  git branch -D  dev #-D是-d --force的shotcut,強制刪除dev本地分支
  git push origin  :dev  #刪除遠程倉庫的dev分支,相當于把一個空分支push到遠程倉庫的dev上,等同于刪除該分支。
  git checkout -b dev   #切換到dev分支,-b是沒有dev分支時候才需要加上去的,這種情況下是創建并切換到dev分支的意思

  git checkout -- file  #撤銷工作區中一個叫file的文件的修改
  git reset HEAD file   #撤銷暫存區中一個叫file的文件到工作區中
  git reset --hard HEAD^  #回滾當前分支到上一個版本,注意末尾的^,有n個^說明回滾多上個版本,也就是回到多少次commit前

  #貌似把上面的file 換成*(wildcard)通配符來代指所有是可以的.我就經常多文件撤銷工作區修改的時候git checkout -- * ,純粹因為懶得一個個輸入... 

在開發調試過程中,需要不斷更新代碼到Git庫,然后使用Git庫中的最新代碼更新運行著的Docker容器,目前看來有如下兩種方法,建議使用第二種。

  1. 直接在容器中執行git命令,更新容器中的目錄和文件(不推薦)
  1. 首先,在構建容器鏡像文件的時候,定義在Dockfile文件中并設置代碼的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. 其次,基于構建的容器鏡像文件啟動容器
docker run -it --name container_name image_name:version
  1. 需要更新運行中的容器的目錄或文件時,執行如下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. 直接對容器實例執行docker cp命令,更新容器中的目錄和文件(推薦)
docker cp ~/myproject/. container_name:/home/myname/myproject
  1. 啟動容器實例的時候,為容器加載Volume(推薦)
docker run -v /mnt/temp/myproject/:/home/myname/myproject ...

補充說明:

在生產環境中,由于代碼比較穩定,可以在構建鏡像的時候就代碼直接加入到鏡像中。

即在Dockfile中設置如下:

RUN COPY . /home/myname/myproject

說明,這種方法的弊端是必須能夠在容器內部執行Git命令,因而不得不將私鑰加入到容器,導致安全風險。

我在云端,使用Docker搭建了Git裸庫,裸庫中用Git hook來同步代碼。使用Docker來運行應用,通過瀏覽器來檢查結果。

因為,代碼的編輯和運行環境的分離,開發工程師可以靈活的選擇開發工具。開發工具可以是在線編輯器,也可以是本地的編輯器。
借助于Docker的靈活性,開發工程師可以快速配置出應用運行環境,并分享給開發團隊成員。

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

image.png

官方例子

image.png

clone

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

各個參數解析:

  • docker: Docker 的二進制執行文件。
  • run: 與前面的 docker 組合來運行一個容器。
  • --name 為容器repo 指定一個別名 alpine/git, 不指定時隨機生成。repo 為指定要運行的鏡像,Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像 alpine/git的最新版本。
  • clone https://github.com/docker/getting-started.git : 在啟動的容器里執行的命令

以上命令完整的意思可以解釋為:Docker 以alpine 鏡像創建一個新容器,然后在容器里執行 git clone https://github.com/docker/getting-started.git 。

image.png

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

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

build

為容器重新分配一個偽輸入終端docker101tutorrial(即復制新建一個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 參數默認不會進入容器,想要進入容器需要使用指令 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容