Docker實戰

阿輝ya發表於2023-03-02

docker實戰筆記

一、安裝docker

下面以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容器的區別

映象的一個例項稱為容器。 你有一個映象,這是你描述的一組圖層。 如果你開始這個映象,你有一個執行這個映象的容器。 您可以擁有許多相同映象的正在執行的容器。

# 檢視所有映象
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 <twang2218@gmail.com>" \
    --message "修改了預設網頁" \
    webserver \
    nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內容。這點和 git 版本控制相似,不過這裡這些資訊可以省略留空。

三、使用dockerfile製作映象

​ 從剛才的 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 就是指定 基礎映象,因此一個 DockerfileFROM 是必備的指令,並且必須是第一條指令。

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

3.1、dockerfile指令詳解【重要】

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 / 容器名]

相關文章