由docker菜鳥教程整理筆記
我認爲筆記的意義在於有的放矢,而不是像字典一樣的詳細。所以我後期的筆記風格都會以言簡意賅爲主,如果有什麼不懂得地方,直接百度。
Docker 容器的使用
獲取鏡像
docker pull ubuntu
啓動容器
docker run -it ubuntu /bin/bash
查看所有的容器
docker ps -a
啓動已停止的容器
docker start 容器id
後臺運行
docker run -itd --name ubuntu-test ubuntu /bin/bash
停止一個容器
docker stop 容器id
docker restart 容器id
進入容器
docker attach 1e560fca3906
docker exec -it 243c32535da7 /bin/bash
導出容器
docker export 1e560fca3906 > ubuntu.tar
導入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker import http://example.com/exampleimage.tgz example/imagerepo
刪除容器
docker rm -f 1e560fca3906
清理掉所有處於終止狀態的容器。
docker container prune
Docker 鏡像使用
列出鏡像列表
docker images
查找鏡像
docker search 鏡像名稱
拉取鏡像
docker pull 鏡像名稱
刪除鏡像
docker rmi 鏡像名稱
創建鏡像
- 更新鏡像
- 創建容器 :docker run -t -i ubuntu:15.10 /bin/bash
- 在容器內執行:apt-get update
- 構建鏡像
- 創建一個 Dockerfile 文件
設置鏡像標籤
docker tag 860c279d2fec runoob/centos:dev
這裏是 860c279d2fec ,用戶名稱、鏡像源名(repository name)和新的標籤名(tag)
Docker 容器連接
網絡端口映射
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port 容器名稱 5000 查看端口的綁定情況
容器互聯
- 新建網絡 docker network create -d bridge/overlay 網絡名稱
- 連接容器
- docker run -itd --name test1 --network 網絡名稱 ubuntu /bin/bash
- docker run -itd --name test2 --network test-net ubuntu /bin/bash
- ping命令: docker exec -it test1 /bin/bash
- 推薦使用 Docker Compose
配置 DNS
-
主機的 /etc/docker/daemon.json
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
-
查看容器的 DNS 是否生效 docker run -it --rm ubuntu cat etc/resolv.conf
-
手動指定容器的配置 docker run -it --rm host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
Docker 倉庫管理
docker hub
- 網址:https://hub.docker.com
- 註冊:
- 登錄與退出:docker login/logout
搜索鏡像
docker search 鏡像名稱
拉取鏡像
docker pull 鏡像名稱
推送鏡像
- 打標籤:docker tag 鏡像名稱 用戶賬號/鏡像名稱
- 用戶賬號就是上文註冊的賬號
- docker push darkangel1228/鏡像名稱
Docker Dockerfile
什麼是 Dockerfile?
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
使用 Dockerfile 定製鏡像
-
From
後續的操作都是基於 nginx -
Run
用於執行後面跟着的命令行命令- shell 格式:RUN <命令行命令>
- RUN [“可執行文件”, “參數1”, “參數2”]
-
Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上執行會創建 3 層鏡像。可簡化爲以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
開始構建鏡像
docker build -t nginx:test .
- . 上下文路徑,
- 是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包
- 如果未說明最後一個參數,那麼默認上下文路徑就是 Dockerfile 所在的位置。
- 注意:上下文路徑下不要放無用的文件,因爲會一起打包發送給 docker 引擎,如果文件過多會造成過程緩慢。
指令詳解
-
copy 複製指令,從上下文目錄中複製文件或者目錄到容器裏指定路徑。
- 格式:COPY [–chown=:] <源路徑1>… <目標路徑>
- 源文件或者源目錄,這裏可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則
- <目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。
-
ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
- ADD 的優點:在執行 <源文件> 爲 tar 壓縮文件的話,壓縮格式爲 gzip, bzip2 以及 xz 的情況下,會自動複製並解壓到 <目標路徑>。
- ADD 的缺點:在不解壓的前提下,無法複製 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
-
CMD 類似於 RUN 指令,用於運行程序,但二者運行的時間點不同:
-
CMD 在docker run 時運行。
-
RUN 是在 docker build。
-
作用:爲啓動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。
-
注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。
-
-
ENTRYPOINT 類似於 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。
- 優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運行所需的參數。
- 注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
-
ENV 設置環境變量
-
ARG 與 ENV 作用一至。不過作用域不一樣
-
VOLUME 定義匿名數據卷。在啓動容器時忘記掛載數據卷,會自動掛載到匿名卷。
-
EXPOSE 僅僅只是聲明端口
-
WORKDIR 指定工作目錄
-
USER 用於指定執行後續命令的用戶和用戶組
-
HEALTHCHECK 用於指定某個程序或者指令來監控 docker 容器服務的運行狀態。
-
ONBUILD 用於延遲構建命令的執行。
Docker Compose
Compose 簡介
Compose 是用於定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啓動所有服務。
Compose 安裝
使用
- Dockerfile
- docker-compose.yml
Docker Machine
Docker Machine 是一種可以讓您在虛擬主機上安裝 Docker 的工具,並可以使用 docker-machine 命令來管理主機。
Docker Machine 也可以集中管理所有的 docker 主機,比如快速的給 100 臺服務器安裝上 docker。
Swarm 集羣管理
Docker Swarm 是 Docker 的集羣管理工具。它將 Docker 主機池轉變爲單個虛擬 Docker 主機。 Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕鬆地擴展到多個主機。