天天看點

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

1. 鏡像和容器

  • 鏡像(Image):Docker将應用程式及其所需的依賴、函數庫、環境、配置等檔案打包在一起,稱為鏡像。
  • 容器(Container):鏡像中的應用程式運作後形成的程序就是容器,隻是Docker會給容器做隔離,對外不可見。

2. Docker和DockerHub

  • DockerHub:DockerHub是一個Docker鏡像的托管平台。這樣的平台稱為Docker Registry。
  • 國内也有類似于DockerHub 的公開服務,比如 網易雲鏡像服務、阿裡雲鏡像庫等。

3. docker架構

  • Docker是一個CS架構的程式,由兩部分組成:

    1、服務端(server):Docker守護程序,負責處理Docker指令,管理鏡像、容器等

    2、用戶端(client):通過指令或RestAPI向Docker服務端發送指令。可以在本地或遠端向服務端發送指令。

    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 鏡像:

    将應用程式及其依賴、環境、配置打包在一起

  • 容器:

    鏡像運作起來就是容器,一個鏡像可以運作多個容器

  • Docker結構:

    服務端:接收指令或遠端請求,操作鏡像或容器

    用戶端:發送指令或者請求到Docker服務端

  • DockerHub:

    一個鏡像托管的伺服器,類似的還有阿裡雲鏡像服務,統稱為DockerRegistry

4. 鏡像相關指令

  • 鏡像名稱一般分兩部分組成:[repository]:[tag]。
  • 在沒有指定tag時,預設是latest,代表最新版本的鏡像
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

5. 鏡像操作指令

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 從DockerHub中拉取一個nginx鏡像并檢視

1、首先去鏡像倉庫搜尋nginx鏡像,比如DockerHub

2、根據檢視到的鏡像名稱,拉取自己需要的鏡像,通過指令:

docker pull nginx

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

3、通過指令:

docker images

檢視拉取到的鏡像

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 利用

    docker save

    nginx

    鏡像導出磁盤,然後再通過

    load

    加載回來

1、利用

docker xx --help

指令檢視

docker save

docker load

的文法

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

2、使用

docker save

導出鏡像到磁盤

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

3、使用

docker load

加載鏡像

删除 nginx 鏡像

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

6. 容器相關指令

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

6.1 建立運作一個Nginx容器

步驟一:去docker hub檢視Nginx的容器運作指令

docker run --name containerName -p 80:80 -d nginx
           

指令解讀:

1、

docker run

:建立并運作一個容器

2、

--name

: 給容器起一個名字,比如叫做

nx

3、

-p

:将主控端端口與容器端口映射,冒号左側是主控端端口,右側是容器

4、

nginx

:鏡像名稱,例如nginx,不寫版本預設最新版

  • 運作後:
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 檢視 ip的 8080 端口
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 檢視通路容器的日志資訊:

    docker logs 容器名稱

    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 跟蹤日志持續輸出:
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • docker run指令的常見參數有哪些

    --name

    :指定容器名稱

    -p

    :指定端口映射

    -d

    :讓容器背景運作
  • 檢視容器日志的指令:

    docker logs 容器名或id

  • 添加

    -f

    參數可以持續檢視日志:

    docker logs -f 容器名或id

  • 檢視容器狀态:

    docker ps

6.2 進入Nginx容器,修改HTML檔案内容

  • 步驟一:進入容器。進入我們剛剛建立的nginx容器的指令為:
docker exec -it nx bash 
           
  • 指令解讀:

    docker exec

    :進入容器内部,執行一個指令

    -it

    : 給目前進入的容器建立一個标準輸入、輸出終端,允許我們與容器互動

    nx

    :要進入的容器的名稱,如:nginx 别名 nx

    bash

    :進入容器後執行的指令,bash是一個linux終端互動指令
  • 步驟二:進入nginx的HTML所在目錄

    /usr/share/nginx/html

cd /usr/share/nginx/html
           
  • 步驟三:修改index.html的内容
sed -i 's#Welcome to nginx#兮動人#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 檢視容器狀态:

    docker ps

  • 添加

    -a

    參數檢視所有狀态的容器
  • 删除容器:

    docker rm

  • 不能删除運作中的容器,除非添加

    -f

    參數
  • 進入容器:

    指令

    docker exec -it [容器名] [要執行的指令]

    exec指令可以進入容器修改檔案,但是在容器内修改檔案是不推薦的

7. 資料卷

  • 資料卷(

    volume

    )是一個虛拟目錄,指向主控端檔案系統中的某個目錄。
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 操作資料卷
  • 資料卷操作的基本文法如下:
docker volume [COMMAND]
           
  • docker volume

    指令是資料卷操作,根據指令後跟随的

    command

    來确定下一步的操作:

    1、

    create

    建立一個volume

    2、

    inspect

    顯示一個或多個volume的資訊

    3、

    ls

    列出所有的volume

    4、

    prune

    删除未使用的volume

    5、

    rm

    删除一個或多個指定的volume

7.1 建立一個資料卷,并檢視資料卷在主控端的目錄位置

1、建立資料卷

docker volume create html
           

2、檢視所有資料

docker volume ls
           

3、檢視資料卷詳細資訊卷

docker volume inspect html
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

4、删除未使用的volume

docker volume prune 
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

5、删除一個或多個指定的volume

docker volume rm html
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 資料卷的作用:

    将容器與資料分離,解耦合,友善操作容器内資料,保證資料安全

  • 資料卷操作:
docker volume create
docker volume ls
docker volume inspect
docker volume rm
docker volume prune
           

8. 挂載資料卷

在建立容器時,可以通過

-v

參數來挂載一個資料卷到某個容器目錄

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 建立一個nginx容器,修改容器内的html目錄内的index.html内容
  • 需求說明:nginx的html目錄所在位置/usr/share/nginx/html ,需要把這個目錄挂載到html這個資料卷上,友善操作其中的内容。
  • 提示:運作容器時使用 -v 參數挂載資料卷
  • 步驟:

1、建立容器并挂載資料卷到容器内的HTML目錄

docker run --name nginx1 -v html:/usr/share/nginx/html -p 8080:80 -d nginx
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

2、進入

html

資料卷所在位置,并修改HTML内容

# 檢視html資料卷的位置
docker volume inspect html
# 進入該目錄
cd /var/lib/docker/volumes/html/_data
# 修改檔案
vim	 index.html
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 資料卷挂載方式:
-v volumeName: /targetContainerPath
           
  • 如果容器運作時volume不存在,會自動被建立出來

9. Dockerfile自定義鏡像

  • 常見的鏡像在DockerHub就能找到,但是如果自己寫的項目就必須自己建構鏡像了。
  • 而要自定義鏡像,就必須先了解鏡像的結構。
  • 鏡像是将應用程式及其需要的系統函數庫、環境、配置、依賴打包而成。
  • 以MySQL為例,來看看鏡像的組成結構:
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 鏡像是分層結構,每一層稱為一個Layer
  • BaseImage層:包含基本的系統函數庫、環境變量、檔案系統
  • Entrypoint:入口,是鏡像中應用啟動的指令
  • 其它:在BaseImage基礎上添加依賴、安裝程式、完成整個應用的安裝和配置
  • 簡單來說,鏡像就是在系統函數庫、運作環境基礎上,添加應用程式檔案、配置檔案、依賴檔案等組合,然後編寫好啟動腳本打包在一起形成的檔案。
  • 要建構鏡像,其實就是實作上述打包的過程。

10. DockerFile

  • Dockerfile就是一個文本檔案,其中包含一個個的指令(Instruction),用指令來說明要執行什麼操作來建構鏡像。每一個指令都會形成一層Layer。
    Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 更新詳細文法說明,請參考官網文檔: https://docs.docker.com/engine/reference/builder

1、基于Ubuntu鏡像建構一個新鏡像,運作一個java項目

步驟1:建立一個空檔案夾docker-demo

步驟2:上傳docker-demo.jar檔案到docker-demo目錄

步驟3:上傳jdk8.tar.gz檔案到docker-demo目錄

Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component

步驟4:上傳Dockerfile到docker-demo目錄,dockerfile 檔案如下:

# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local

# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安裝JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置環境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java項目的啟動指令
ENTRYPOINT java -jar /tmp/app.jar
           

步驟5:進入docker-demo目錄下

步驟6:運作指令:

docker build -t javaweb:1.0 .
           
  • -t

    :表示 tag,鏡像的名稱由兩部分組成:

    repository:tag

    ,如:

    javaweb:1.0

  • .

    :表示 dockerfile 所在的目錄
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 啟動項目:
docker run --name web -p 8090:8090 -d javaweb:1.0
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
如果要運作多個 jar 包,上述建構項目的指令好多都是重複的,大部分名稱都是在安裝jdk的環境等
雖然可以基于Ubuntu基礎鏡像,添加任意自己需要的安裝包,建構鏡像,但是卻比較麻煩。是以大多數情況下,都可以在一些安裝了部分軟體的基礎鏡像上做改造。
例如,建構java項目的鏡像,可以在已經準備了JDK的基礎鏡像基礎上建構。
下面就介紹下直接在搭建好的java環境鏡像中進行操作

2、基于

java:8-alpine

鏡像,将一個Java項目建構為鏡像

  • 建立一個空的目錄,然後在目錄中建立一個檔案,命名為

    Dockerfile

  • 上傳所需的 docker-demo.jar 到目錄中
  • 編寫Dockerfile檔案:
    • 基于java:8-alpine作為基礎鏡像
    • 将app.jar拷貝到鏡像中
    • 暴露端口
    • 編寫入口ENTRYPOINT,内容如下:
# 指定基礎鏡像
FROM java:8-alpine
# 配置環境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local

COPY ./docker-demo.jar /tmp/app.jar

# 暴露端口
EXPOSE 8090

# 入口,java項目的啟動指令
ENTRYPOINT java -jar /tmp/app.jar
           
  • 使用docker build指令建構鏡像
docker build -t javaweb:2.0 .
           
Docker基本使用1. 鏡像和容器2. Docker和DockerHub3. docker架構4. 鏡像相關指令5. 鏡像操作指令6. 容器相關指令7. 資料卷8. 挂載資料卷9. Dockerfile自定義鏡像10. DockerFile11. Docker-Component
  • 使用docker run建立容器并運作
docker run --name web1 -p 8091:8091 -d javaweb:2.0
           
  • 小結:
  1. Dockerfile的本質是一個檔案,通過指令描述鏡像的建構過程
  2. Dockerfile的第一行必須是

    FROM

    ,從一個基礎鏡像來建構
  3. 基礎鏡像可以是基本作業系統,如:Ubuntu。也可以是其他人制作好的鏡像,例如:

    java:8-alpine

11. Docker-Component

  • Docker Compose可以基于Compose檔案快速的部署分布式應用,而無需手動一個個建立和運作容器。
  • Compose檔案是一個文本檔案,通過指令定義叢集中的每個容器如何運作。
version: "3.8"
 services:
  mysql:
    image: mysql:5.7.25
    environment:
     MYSQL_ROOT_PASSWORD: 123 
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"
           
  • 上面的Compose檔案就描述一個項目,其中包含兩個容器:

    1、mysql:一個基于

    mysql:5.7.25

    鏡像建構的容器,并且挂載了兩個目錄

    2、 web:一個基于

    docker build

    臨時建構的鏡像容器,映射端口時8090