原文連接:http://tabalt.net/blog/docker...html
Docker是一個使用Golang開發的開源應用容器引擎,讓開發者能夠打包應用和依賴到一個輕量級、可移植的鏡像中,而後分發到任何流行的Linux機器上,並在這些機器上啓動容器,容器之間隔離獨立,資源消耗低。linux
鏡像是一個分層的文件系統,集成了容器運行時所需的操做系統、應用程序、運行時環境等;鏡像是隻讀的,構建以後內容不會被改變,可被複制和分發。nginx
容器是由鏡像啓動的運行時實例,可被啓動、中止、刪除,容器之間相互隔離,容器對資源的使用能夠作限制。容器從鏡像啓動時,Docker會在鏡像的上層建立一個可寫層。git
鏡像倉庫相似於代碼倉庫,用來集中存放鏡像文件。鏡像編譯好後推送(push)到倉庫中,在運行容器的機器上拉取(pull)下來即完成了鏡像的複製和分發。github
Dockerfile是由一系列命令和參數構成的腳本,這些命令基於基礎鏡像,將業務須要的應用程序和依賴環境打包起來,並最終建立一個新的鏡像。docker
Docker是C/S(客戶端Client-服務器Server)架構模式,客戶端是名爲docker
的命令行工具,服務器是名爲dockerd
的守護進程,用戶經過客戶端向服務器提供的接口發送請求和指令,守護進程執行一系列操做後返回給客戶端結果。centos
Docker的官方文檔(https://docs.docker.com/install/ )上提供了很是詳細的安裝流程,簡單摘錄在CentOS 7.x 上下載Docker社區版並安裝的操做命令:服務器
mkdir ~/soft && cd ~/soft wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm sudo yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm sudo systemctl start docker sudo docker run hello-world
當控制檯輸出Hello from Docker!
加一大段介紹文字時,安裝就大功告成了。網絡
剛剛咱們成功運行了Docker提供的Hello World
版容器,大體的執行過程以下:架構
run
和參數hello-world
,並請求Docker Daemon守護進程提供的相關接口hello-world
的鏡像啓動爲容器的請求後,嘗試在本地查找名爲hello-world
的鏡像hello-world
的鏡像hello-world
的鏡像拉取到本地後,Docker Daemon再真正執行啓動容器的操做/hello
程序,輸出Hello from Docker!
等介紹文字/hello
程序就退出了,Docker容器也跟着退出上述流程中,咱們的Docker Daemon程序自動拉取了hello-world
鏡像,也能夠經過命令先行拉取下來:
sudo docker pull hello-world
經過下面的命令能夠查看本地的鏡像列表:
[tabalt@dev ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 2cb0d9787c4d 6 weeks ago 1.85kB
容器運行完退出後,其實還有殘留,可經過以下命令看到:
[tanyanping@p10992v ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb61ae864566 hello-world "/hello" About an hour ago Exited (0) About an hour ago modest_cray
Dockerfile由一行行的命令語句組成,支持以 # 開頭的註釋,主要有四個部分:基礎鏡像信息、維護者信息、鏡像操做指令、容器啓動指令。 主要指令列舉以下(加*
表示經常使用):
指令 | 做用 | 格式 | 說明 |
---|---|---|---|
FROM* | 指定基礎鏡像 | FROM <image> FROM <image>:<tag> |
首條指令必須爲FROM 可以使用多個 FROM 建立多個鏡像 |
MAINTAINER | 指定維護者 | MAINTAINER <name> |
|
ENV* | 指定環境變量 | ENV <key> <value> |
後續RUN指令和容器中可用 |
USER | 指定運行容器的用戶 | USER daemon |
用戶名或UID,對後續的RUN指令生效 |
WORKDIR | 指定工做目錄 | WORKDIR /path/to/workdir |
對後續RUN、CMD、ENTRYPOINT指令生效 |
VOLUME | 建立掛載點 | VOLUME ["/data"] |
|
ONBUILD | 做爲基礎鏡像時的指令 | ONBUILD [INSTRUCTION] |
|
RUN* | 執行命令 | RUN <command> RUN ["executable", "param1", "param2"] |
前者爲/bin/sh -c 執行後者使用 exec 執行 命令較長時可用 \ 換行 |
ADD* | 複製文件到容器 | ADD <src> <dest> |
路徑或URL,tar文件自動解壓 |
COPY* | 複製文件到容器 | COPY <src> <dest> |
源目錄爲本地目錄時,推薦使用 |
ENTRYPOINT* | 容器啓動後執行的命令 | ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 |
不可被docker run的參數覆蓋 多條命令只有最後一條生效 |
CMD* | 容器啓動執行的命令 | CMD ["executable","param1","param2"] CMD command param1 param2 CMD ["param1","param2"] |
第一種使用exec執行,推薦使用 第二種在/bin/sh中執行,支持交互 第三種是ENTRYPOINT的默認參數 多條CMD命令只有最後一條生效 |
EXPOSE* | 指定暴露的端口號 | EXPOSE <port> [<port>...] |
能夠經過幾個知名項目中的Dockerfile文件來學習一下各個指令的應用:
編寫一個能編譯運行並輸出Hello Docker!
的Dockerfile:
[tabalt@dev ~]$ cd ~/docker/hello-docker/ [tabalt@dev ~/docker/hello-docker]$ cat Dockerfile FROM alpine:latest CMD echo "Hello World!"
將Dockerfile編譯成名爲hello-docker
的鏡像:
[tabalt@dev ~/docker/hello-docker]$ sudo docker build -t hello-docker:latest ./ Sending build context to Docker daemon 2.048kB Step 1/2 : FROM alpine:latest latest: Pulling from library/alpine 8e3ba11ec2a2: Already exists Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430 Status: Downloaded newer image for alpine:latest ---> 11cd0b38bc3c Step 2/2 : CMD echo "Hello World!" ---> Running in 28dc89adf3d5 Removing intermediate container 28dc89adf3d5 ---> 5614b1e6b7eb Successfully built 5614b1e6b7eb Successfully tagged hello-docker:latest [tabalt@dev ~/docker/hello-docker]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-docker latest 5614b1e6b7eb 22 seconds ago 4.41MB alpine latest 11cd0b38bc3c 7 weeks ago 4.41MB
運行名爲hello-docker
的鏡像:
[tabalt@dev ~/docker/hello-docker]$ sudo docker run -i -t --rm --net=host hello-docker:latest Hello World!
前面已經見識過Docker的一些客戶端命令及用法,接下來再看看一些經常使用命令的詳細介紹:
客戶端和服務端 版本信息
鏡像數、容器數、配置等系統信息
docker search
從Docker Hub中搜索符合條件的鏡像
docker search [OPTIONS] TERM Options: -f, --filter filter 根據提供的條件過濾輸出 --format string 用Go模板語法格式化打印的搜索結果 --limit int 搜索結果最大條數(默認 25) --no-trunc 顯示完整輸出
docker pull
從Docker Hub中拉取或者更新指定鏡像
docker pull [OPTIONS] NAME[:TAG|@DIGEST] Options: -a, --all-tags 下載倉庫中全部打TAG的鏡像 --disable-content-trust 跳過鏡像驗證(默認開啓) --platform string 如服務器具備多平臺功能,可設置平臺
登陸Docker Hub,須要輸入用戶名、密碼、郵箱
退出登陸
docker images
列出鏡像
docker images [OPTIONS] [REPOSITORY[:TAG]] Options: -a, --all 顯示全部鏡像(默認隱藏中間鏡像) --digests 顯示摘要 -f, --filter filter 根據提供的條件過濾輸出 --format string 用Go模板語法格式化打印的搜索結果 --no-trunc 顯示完整輸出 -q, --quiet 只顯示數字ID
docker ps
列出容器
docker ps [OPTIONS] Options: -a, --all 顯示全部容器(默認只顯示運行中的) -f, --filter filter 根據提供的條件過濾輸出 --format string 用Go模板語法格式化打印的搜索結果 -n, --last int 顯示最新建立的n個容器(包含全部狀態)(默認爲-1) -l, --latest 顯示最新建立的容器(包含全部狀態) --no-trunc 顯示完整輸出 -q, --quiet 只顯示數字ID -s, --size 顯示文件總大小
docker rmi
刪除鏡像
docker rmi [OPTIONS] IMAGE [IMAGE...] Options: -f, --force 強制刪除鏡像 --no-prune 不要刪除未打Tag的父鏡像
docker rm
刪除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] Options: -f, --force 強制刪除運行中的容器(使用SIGKILL) -l, --link 刪除指定的連接 -v, --volumes 刪除與容器關聯的卷
docker history
查看鏡像建立歷史
docker history [OPTIONS] IMAGE Options: --format string 用Go模板語法格式化打印的搜索結果 -H, --human 以人類可讀格式打印尺寸和日期(默認爲true) --no-trunc 顯示完整輸出 -q, --quiet 只顯示數字ID
啓動、中止和重啓一個或多個指定容器
殺死一個或多個指定容器
從服務器拉取動態
將指定鏡像保存成 tar 歸檔文件
從 tar 鏡像歸檔中載入鏡像
將指定的容器保存成 tar 歸檔文件
從歸檔文件(支持遠程文件)建立一個鏡像
查看一個正在運行容器的進程,支持 ps 命令參數。
檢查鏡像或者容器的參數,默認返回 JSON 格式。
暫停某一容器的全部進程。
恢復某一容器的全部進程。
docker tag
標記本地鏡像,將其納入某一倉庫
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
將鏡像推送至遠程倉庫,默認爲 Docker Hub
獲取容器運行時的輸出日誌
docker run
啓動一個容器,在其中運行指定命令。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Options: -a stdin 指定標準輸入輸出內容類型,可選 STDIN、STDOUT、STDERR 三項 -d 後臺運行容器,並返回容器ID; -i 以交互模式運行容器,一般與 -t 同時使用; -t 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用; --name="nginx-lb" 爲容器指定一個名稱; --dns 8.8.8.8 指定容器使用的DNS服務器,默認和宿主一致; --dns-search example.com 指定容器DNS搜索域名,默認和宿主一致; -h "mars" 指定容器的hostname; -e username="ritchie" 設置環境變量; --env-file=[] 從指定文件讀入環境變量; --net="bridge" 指定容器的網絡鏈接類型,支持 bridge、host、none # 更多參數請查看 docker help run