Docker小記 — Docker Engine
前言
用了Docker方才覺得生產環境終於有了他該有的樣子,就像集裝箱普及之後大型貨輪的價值才逐漸體現出來,Docker詳細說明可查閱“官方文檔”。本篇為Docker Engine的筆記,也就是我們通常說的Docker,他包含了提供容器技術實現的Docker daemon及終端控制Docker CLI的應用程序。後續會繼續發布Docker Compose和Docker Swarm的操作筆記,由於我的絕大部分應用案例都是雲服務器,因此Docker Machine就略過了。
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就像是每個集裝箱中的貨物清單和說明書,一般由以下五部分構成:
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 python
、FROM nginx
、FROM java
等為基礎鏡像。MAINTAINER:指定維護者信息,例:
MAINTAINER user [email protected]
。
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”會在子鏡像被構建的過程中輸出。
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將被覆蓋。
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 命令詳解
為了避免喧賓奪主,此處僅摘錄我個人操作中較為常用的命令。
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%的場景,例:# 類似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,則示例如下:
docker login -u username -p passward docker logout
在生產環境中,我們一般會選擇使用雲廠商的鏡像倉庫,例:
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
。
結語
靜夜聽鐘卻念念不安,舉首相望,恐知者唯燈而~哀哉!整理至此,小弟拙筆盼君悅之。
Docker小記 — Docker Engine