用了 Docker 方纔以爲生產環境終於有了他該有的樣子,就像集裝箱普及以後大型貨輪的價值才逐漸體現出來,Docker 詳細說明可查閱「官方文檔」。本篇爲 Docker Engine 的筆記,也就是咱們一般說的 Docker,他包含了提供容器技術實現的 Docker daemon 及終端控制 Docker CLI 的應用程序。後續會繼續發佈 Docker Compose 和 Docker Swarm 的操做筆記,因爲個人絕大部分應用案例都是雲服務器,所以 Docker Machine 就略過了。
html
# 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
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://jrzzvzok.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
Docker 的架構頗有魅力,他擁有相似於虛擬機性質的隔離機制,但並非嚴格意義上的虛擬機。我仍是喜歡拿貨輪舉例,之前咱們是一條小船運一個集裝箱的貨物,如今能夠把 N 個集裝箱扔到一條大貨輪上。每一個容器(集裝箱)共用宿主機(貨輪)的內核(運載力),Dockerfile 就像是每一個集裝箱中的貨物清單和說明書,通常由如下五部分構成:java
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
等爲基礎鏡像。python
MAINTAINER user user@mail.com
。RUN command param1 param2 # 更推薦 RUN ["executable","param1","param2"]
WORKDIR project
。可配合環境變量使用,例:ENV BASEDIR /project WORKDIR $BASEDIR/test
ONBUILD RUN echo "hello world"
「hello world」會在子鏡像被構建的過程當中輸出。linux
COPY <src> <dest> COPY ["<src>","<dest>"]
ADD rootfs.tar.xz /
。理論上也可添加網絡地址,但仍是建議在 RUN 指令中執行 wget 或 curl 命令,感受這樣更加可控。實際應用中我喜歡將 COPY 用於文件,ADD 用於目錄(僅我我的的使用習慣)。CMD ["executable","param1","param2"] # 更推薦 CMD ["param1","param2"] CMD command param1 param2
若在 docker run 中指定啓動命令,則 CMD 將被覆蓋。nginx
EXPOSE <port> [<port>...]
,注意此處的暴露端口和docker run 中-p指定的映射端口是兩個概念。ENV <key>=<value> ...
。LABEL <key>=<value>...
。USER daemo
。STOPSIGNAL SIGKELL
。SHELL ["bash","-c"]
。爲了不喧賓奪主,此處僅摘錄我我的操做中較爲經常使用的命令。docker
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
docker start/stop/restart my-container
。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
docker exec -it my-nginx bash
。docker ps -anq
,參數說明:all、n last(最新 n 個容器)、quiet(只顯示容器編號)。docker top my-container
。docker logs -f --tail
,參數說明:follow、--tail n(最新條日誌)。docker port my-container
。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
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
。docker push [OPTIONS] NAME[:TAG]
。docker images -q
,參數說明:quiet(只顯示image Id)。docker rmi -f
,參數說明:force。docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
,例:docker tag ubuntu youclk/my-ubuntu:v1
。docker build [OPTIONS] PATH | URL | -
,參數說明:-t tag 例:docker build -t youclk/my-ubuntu:v1 .
。靜夜聽鍾卻念念不安,舉首相望,恐知者惟燈而~ 哀哉!整理至此,小弟拙筆盼君悅之。centos
個人公衆號《捷義》