下面以ubuntu系統舉例:
解除安裝已有的舊版本docker
$ sudo apt-get remove docker \
docker-engine \
docker.io
使用apt安裝最新版docker
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
更新apt軟體包快取
$ sudo apt-get update
# 安裝docker-ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
啟動docker
# 使用系統命令啟動docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
建立docker使用者組
預設情況下,docker
命令會使用 Unix socket 與 Docker 引擎通訊。而只有 root
使用者和 docker
組的使用者才可以存取 Docker 引擎的 Unix socket。出於安全考慮,一般 Linux 系統上不會直接使用 root
使用者。因此,更好地做法是將需要使用 docker
的使用者加入 docker
使用者組
# 建立docker使用者組
$ sudo groupadd docker
# 將使用者加入到docker使用者組中
$ sudo usermod -aG docker [$USER 使用者名稱]
映象是 Docker 的三大元件之一。
Docker 執行容器前需要本地存在對應的映象,如果本地不存在該映象,Docker 會從映象倉庫下載該映象。
【重點】
docker映象與docker容器的區別
映象的一個範例稱為容器。 你有一個映象,這是你描述的一組圖層。 如果你開始這個映象,你有一個執行這個映象的容器。 您可以擁有許多相同映象的正在執行的容器。
# 檢視所有映象
docker images
# 檢視正在執行的容器
docker ps -a
獲取映象
$ docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]
# 指定ubuntu版本下載
docker pull ubuntu:18.04
# 下載Ubuntu所有映象
docker pull -a ubuntu
# 下載centos所有映象
docker pull -a centos
docker互動式
// 進入docker互動式 用法和linux命令類似
docker run -it --rm ubuntu bash
列出映象
docker image ls
檢視映象檔案大小
docker system df
刪除本地映象
$ docker image rm [選項] <映象1> [<映象2> ...]
使用commit理解映象
docker commit
命令除了學習之外,還有一些特殊的應用場合,比如被入侵後儲存現場等。但是,不要使用 docker commit
客製化映象,客製化映象應該使用 Dockerfile
來完成,
簡單來說docker commit就是在原來的映象上面進行copy然後形成新的映象
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]
# 栗子:
$ docker commit \
--author "Tao Wang <[email protected]>" \
--message "修改了預設網頁" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
其中 --author
是指定修改的作者,而 --message
則是記錄本次修改的內容。這點和 git
版本控制相似,不過這裡這些資訊可以省略留空。
從剛才的 docker commit
的學習中,我們可以瞭解到,映象的客製化實際上就是客製化每一層所新增的設定、檔案。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個指令碼,用這個指令碼來構建、客製化映象,那麼之前提及的無法重複的問題、映象構建透明性的問題、體積的問題就都會解決。這個指令碼就是 Dockerfile
Dockerfile 是一個文字檔案,其內包含了一條條的 指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
建立dockerfile
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
# 寫入指令碼
FROM nginx // 指定映象
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM命令
所謂客製化映象,那一定是以一個映象為基礎,在其上進行客製化。就像我們之前執行了一個 nginx
映象的容器,再進行修改一樣,基礎映象是必須指定的。而 FROM
就是指定 基礎映象,因此一個 Dockerfile
中 FROM
是必備的指令,並且必須是第一條指令。
RUN命令
RUN
指令是用來執行命令列命令的。由於命令列的強大能力,RUN
指令在客製化映象時是最常用的指令之一。其格式有兩種
shell 格式:RUN <命令>
,就像直接在命令列中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN
指令就是這種格式。
# 執行指令碼 單個
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式:RUN ["可執行檔案", "引數1", "引數2"]
,這更像是函數呼叫中的格式。
FROM debian:stretch
# 批次執行指令碼
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
exec格式雖然是批次執行指令碼,但是上面指令碼建立了七層映象,是不合適的,那麼正確的寫法是: 使用&&符號進行連線,把原來建立七層映象變成了一層
FROM debian:stretch
# '\'是shell指令碼的末尾換行符
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
FORM指令
FROM 系統[:映象版本號]
# 指定基礎映象,也是必須的!!!
FROM ubuntu
EXPOSE指令
EXPOSE
指令是宣告容器執行時提供服務的埠,這只是一個宣告,在容器執行時並不會因為這個宣告應用就會開啟這個埠的服務。在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助映象使用者理解這個映象服務的守護埠,以方便設定對映;另一個用處則是在執行時使用隨機埠對映時,也就是 docker run -P
時,會自動隨機對映 EXPOSE
的埠。
# 指定 80埠命令
EXPOSE 80
RUN指令
# 指定下載安裝包並更新軟體包快取
RUN apt-get -qq update
COPY複製檔案
COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
# 複製/home/test資料夾下所有檔案到當前目錄
COPY /home/test/** .
CMD指令
CMD 指令的格式和 RUN 相似,也是兩種格式:
shell 格式:CMD <命令>
# 栗子:
CMD echo 'hello world!'
CMD service nginx start
exec 格式:CMD ["可執行檔案", "引數1", "引數2"...]
參數列格式:CMD ["引數1", "引數2"...]。在指定了 ENTRYPOINT 指令後,用 CMD 指定具體的引數。
ENV指令
格式有兩種:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 栗子:
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
ADD複製檔案(高階用法)
# 與COPY指令類似,複製某個資料夾下所有檔案到/mydir
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/
總結:
# FROM:作為基礎映象
FROM ubuntu
# 使用RUN指令下載安裝包等等,連線使用&&
RUN apt-get -qq update \
&& COPY /home/test/** . \
# EXPOST 8080
&& RUN echo 'hello, dockerfile'
那麼映象製作完成了,就應該進行構建映象
# docker build -t=【tag資訊】 【dockerfile路徑】
docker build [選項] <上下文路徑/URL/->
# 栗子:
docker build -t nginx:v3 .
新建並啟動一個容器
# 使用docker run命令攜帶指令碼
$ docker run ubuntu /bin/echo 'Hello world'
Hello world
檢視正在執行的docker容器資訊
# 檢視容器資訊
docker container ls
檢視容器紀錄檔【重要】
# 檢視正在執行的容器
docker ps -a
# 拿到對應的容器id,使用docker logs 檢視紀錄檔
docker container logs [container ID or NAMES]
# 檢視實時紀錄檔
docker logs -f [container ID or NAMES]
操作容器(停止、啟動、重啟)
# 1.檢視正在執行的容器
docker ps -a
# 2.停止正在執行的容器
docker container stop [容器id]
# 3.啟動正在執行的容器
docker container start [容器id]
# 4.重啟正在執行的容器
docker container restart [容器id]
進入容器
# 命令
docker attach [容器id] / docker exec [容器id]
# 進入容器並啟用偽裝終端
docker exec -it [容器id] bash
匯入匯出容器
# 1.檢視容器
docker container ls -a
# 2.匯出容器到本地檔案
docker export [容器id] > ubuntu.tar
# 3.匯入容器
docker import [目錄/http連結]
刪除容器
# 1.檢視所有容器
docker container ls
# 2.停止對應容器
docker container stop [容器id]
# 3. 刪除對應容器
docker container rm [容器id / 容器名]