Docker 小記 — Docker Engine

前言

用了 Docker 方纔以爲生產環境終於有了他該有的樣子,就像集裝箱普及以後大型貨輪的價值才逐漸體現出來,Docker 詳細說明可查閱「官方文檔」。本篇爲 Docker Engine 的筆記,也就是咱們一般說的 Docker,他包含了提供容器技術實現的 Docker daemon 及終端控制 Docker CLI 的應用程序。後續會繼續發佈 Docker Compose 和 Docker Swarm 的操做筆記,因爲個人絕大部分應用案例都是雲服務器,所以 Docker Machine 就略過了。
html

1. Docker 安裝 & 配置鏡像加速器

a:

# step 1:安裝必要的一些系統工具
apt update
apt -y install apt-transport-https ca-certificates curl software-properties-common

# step 2:安裝 GPG 證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

# Step 3:寫入軟件源信息
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4:更新並安裝 Docker-CE
apt -y update
apt -y install docker-ce

b:

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jrzzvzok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

2. Dockerfile 詳解

Docker 的架構頗有魅力,他擁有相似於虛擬機性質的隔離機制,但並非嚴格意義上的虛擬機。我仍是喜歡拿貨輪舉例,之前咱們是一條小船運一個集裝箱的貨物,如今能夠把 N 個集裝箱扔到一條大貨輪上。每一個容器(集裝箱)共用宿主機(貨輪)的內核(運載力),Dockerfile 就像是每一個集裝箱中的貨物清單和說明書,通常由如下五部分構成:java

2.1 基礎指令

  • FROM: 指定基礎鏡像,且必須位於第一行,使用格式以下:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>

Docker 的原理基於 Linux 內核的隔離技術,且 Linux From Scratch,所以 FROM scratch 是 docker 中最基礎的鏡像,debian、ubuntu 和 centos 等都基於 scratch 之上。在實際的運用中,若是必須從零開始搭建鏡像的通常都選擇 FROM debian 做爲基礎鏡像,不過大多數狀況下通常都會以以下:FROM pythonFROM nginxFROM java 等爲基礎鏡像。python

  • MAINTAINER:指定維護者信息,例:MAINTAINER user user@mail.com

2.2 控制指令

  • RUN: 在構建的過程當中指定須要被執行的命令,使用格式以下:
RUN command param1 param2 # 更推薦
RUN ["executable","param1","param2"]
  • WORKDIR: 用於切換構建過程當中的工做目錄,例:WORKDIR project。可配合環境變量使用,例:
ENV BASEDIR /project
WORKDIR $BASEDIR/test
  • ONBUILD: 在當前鏡像被當作基礎鏡像時,執行其攜帶指令,例:
ONBUILD RUN echo "hello world"

「hello world」會在子鏡像被構建的過程當中輸出。linux

2.3 引入指令

  • COPY: 拷貝文件或目錄,格式:
COPY <src> <dest>
COPY ["<src>","<dest>"]
  • ADD: 在COPY的基礎之上,ADD可識別壓縮文件,例:ADD rootfs.tar.xz /。理論上也可添加網絡地址,但仍是建議在 RUN 指令中執行 wget 或 curl 命令,感受這樣更加可控。實際應用中我喜歡將 COPY 用於文件,ADD 用於目錄(僅我我的的使用習慣)。

2.4 執行指令

  • CMD: 容器啓動時須要執行的命令,格式:
CMD ["executable","param1","param2"] # 更推薦
CMD ["param1","param2"]
CMD command param1 param2

若在 docker run 中指定啓動命令,則 CMD 將被覆蓋。nginx

  • ENTRYPOINT:主程序啓動前的準備指令,用於啓動主程序所依賴的服務,格式同CMD(基本上沒用過就不介紹了,並且容易出錯,不推薦使用)。

2.5 配置指令

  • EXPOSE: 暴露容器端口,格式:EXPOSE <port> [<port>...],注意此處的暴露端口和docker run 中-p指定的映射端口是兩個概念。
  • ENV: 聲明環境變量,格式:ENV <key>=<value> ...
  • LABEL: 標記,格式:LABEL <key>=<value>...
  • USER: 設置啓動容器的用戶,格式:USER daemo
  • ARG: 設置變量,格式同ENV。
  • STOPSIGNAL: 容器中止時給應用程序發出的信號,例:STOPSIGNAL SIGKELL
  • SHELL: 指定shell,例:SHELL ["bash","-c"]

3. Docker 命令詳解

爲了不喧賓奪主,此處僅摘錄我我的操做中較爲經常使用的命令。docker

3.1 生命週期管理

  • run: 建立並運行容器,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...],參數說明:
-d , --detach            # 後臺運行
-it, --interactive tty   # 交互終端形式運行
-p , --publish list      # 指定端口
-v , --volume list       # 掛載存儲卷
         --name string       # 定義名字
         --rm                # 容器終止後自動刪除(不支持在後臺運行的容器)
         --restart string    # no、on-failure(非正常退出時重啓,on-failure:3 最多重啓三次)、always、unless-stopped

docker run 的參數甚多,可經過 --help 查詢,後續這些複雜的配置都會移交給 Docker Compose,以上幾個足以應用70%~80%的場景,例:shell

# 相似 ubuntu 這類容器必須以 -it 交互終端形式運行,不然沒法在後臺保留
docker run -it -d --name my-ubuntu ubuntu
# 端口映射和掛載數據卷
docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html\
--name my-nginx nginx
  • start/stop/restart:docker start/stop/restart my-container
  • rm:移除容器,格式:docker rm [OPTIONS] CONTAINER [CONTAINER...],參數說明:
-f, --force     Force the removal of a running container
-l, --link      Remove the specified link
-v, --volumes   Remove the volumes associated with the container
  • exec:在運行的容器中執行命令,不過更經常使用的仍是先進入容器再執行命令,例子:docker exec -it my-nginx bash

3.2 容器操做

  • ps: 列出容器,經常使用:docker ps -anq,參數說明:all、n last(最新 n 個容器)、quiet(只顯示容器編號)。
  • top: 查看容器中的進程信息,例:docker top my-container
  • logs: 查看容器日誌,經常使用:docker logs -f --tail,參數說明:follow、--tail n(最新條日誌)。
  • port:查看端口映射狀況,例:docker port my-container

3.3 鏡像倉庫

  • login/logout: 鏡像倉庫的登陸和退出,格式:
docker login [OPTIONS] [SERVER]
docker logout  [SERVER]

若是是Docker Hub,則示例以下:json

docker login -u username -p passward
docker logout

在生產環境中,咱們通常會選擇使用雲廠商的鏡像倉庫,例:ubuntu

docker login -u yo****@qq.com -p ****** registry-vpc.cn-hangzhou.aliyuncs.com
docker logout registry-vpc.cn-hangzhou.aliyuncs.com
  • pull: 拉取鏡像,最經常使用的命令之一,格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • push: 上傳鏡像,格式:docker push [OPTIONS] NAME[:TAG]

3.4 本地鏡像管理

  • images: 列出本地鏡像,經常使用 docker images -q,參數說明:quiet(只顯示image Id)。
  • rmi: 刪除本地鏡像,經常使用 docker rmi -f,參數說明:force。
  • tag: 標記鏡像,納入倉庫,格式:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG],例:docker tag ubuntu youclk/my-ubuntu:v1
  • build: 使用Dockerfile建立鏡像,格式:docker build [OPTIONS] PATH | URL | -,參數說明:-t tag 例:docker build -t youclk/my-ubuntu:v1 .

結語

靜夜聽鍾卻念念不安,舉首相望,恐知者惟燈而~ 哀哉!整理至此,小弟拙筆盼君悅之。centos


個人公衆號《捷義》
qrcode_for_gh_c1a4cd5ae0fe_430.jpg

相關文章
相關標籤/搜索