Docker快速入門

王延領發表於2021-09-06

1.參考資料

官方文件:https://docs.docker.com/docker-for-windows/
倉庫地址:https://hub.docker.com/

2.Docker 的安裝

2.1.docker的組成部分

image-20210819174532504

  1. 映象(image):docker映象好比一個模板,可以通過這個模板來建立容器(container),一個映象可以建立多個容器,類似java中的Class

  2. 容器(container):類似java中通過Class建立的例項;容器可以理解為一個簡易的linux系統

  3. 倉庫(repository):存放映象的地方,

    分為共有倉庫和私有倉庫

    • Docker Hub:國外的

    • 阿里雲:配置映象加速

2.2.環境準備

我們要有一臺伺服器,並且可以操作它

  1. Linux命令基礎

  2. CentOS 7

  3. 使用Xshell連結遠端伺服器(免費版即可)

    image-20210819175245515

2.3. 安裝docker

https://docs.docker.com/engine/install/centos/
解除安裝舊的版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安裝基本的安裝包

$ sudo yum install -y yum-utils

image-20210903152542051

設定映象的倉庫

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 預設是國外的
    
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里雲映象

安裝docker引擎

yum makecache fast

安裝docker引擎

yum install docker-ce docker-ce-cli containerd.io # docker-ce 社群版 ee 企業版

CentOS 8中安裝Docker出現和Podman衝突

yum erase podman buildah

繼續執行安裝即可

image-20210820141207869

image-20210819182217338

2.4.啟動docker

systemctl start docker # 代表啟動成功

image-20210819182453373

docker version

image-20210819182627553

docker run hello-world

image-20210819183126098

docker images

image-20210819183003591

2.5.解除安裝Docker

# 解除安裝依賴
yum remove docker-ce docker-ce-cli containerd.io
# 刪除資源
rm -rf /var/lib/docker # docker 的預設工作路徑

3.docker 常用命令

以上已經用到了一些相關命名下面整體介紹一下。

命令參考地址:

https://docs.docker.com/engine/reference/commandline/docker/

image-20210820142951687

3.1. 全域性命令

docker version # 顯示docker的基本資訊
docker info # 系統資訊,映象和容器的數量
docker 命令 --help # 全部資訊

3.2.映象命令

3.2.1.docker images

docker images # 檢視所有本地主機上的映象
--all , -a		Show all images (default hides intermediate images) # 顯示所有
--digests		Show digests
--filter , -f		Filter output based on conditions provided
--format		Pretty-print images using a Go template
--no-trunc		Don’t truncate output
--quiet , -q		Only show numeric IDs # 只顯示id

image-20210820143814479

-f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

image-20210820143959955

3.2.3.docker pull

docker pull mysql # 下載mysql映象,default tag,預設最新版latest

image-20210820144647100

# 指定版本下載 
docker pull mysql:5.7

分層下載的好處是:不同的版本相同的部分不用重新下載。

3.2.4. docker rmi

# 刪除一個 可以通過名稱 也可以指定id -f表示刪除所有
docker rmi -f d1165f221234
# 刪除多個 用空格分隔id
docker rmi -f id id id
# 刪除所有 
docker rmi -f $(docker images -aq) # images -aq就是查所有映象id,從而遞迴刪除

3.2.容器命令

有了映象才能建立容器,linux,下載一個centos映象來測試學習

3.2.1.新建容器並啟動

docker run [可選引數] image
# 引數說明
# --name=“Name” # 容器名字,用於區分容器
# -it 使用互動方式執行,進入容器檢視內容
# -d 後臺執行
# -p 埠對映 主機埠::容器埠
# -v 卷掛載
# -e 配置
# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

image-20210904182919157

3.2.2.進入容器

docker exec -it 1de87c606832 /bin/bash

image-20210904184742854

# docker attach 1de87c606832

區別
docker exec # 進入容器後開啟一個新的終端,可以在裡面操作(常用)
docker attach 進入容器正在執行的終端,不會啟動新的程式

# 檢視目錄
ls

image-20210904184829645

3.2.3.檢視容器

# 檢視正在執行的容器
docker ps
# 檢視曾經執行的容器
docker ps -a
# 顯示最近建立的容器,設定顯示個數
docker ps -a - n=? 
# 只顯示容器的編號
docker ps -aq

image-20210904184911149

3.2.4.退出容器

# 容器停止退出
exit
# 容器不停止退出 注意必須在英文輸入法下,中文輸入法不行
Ctrl + P + Q

3.2.5.刪除容器

# 刪除指定容器 不能刪除正在執行的容器,如果強制刪除 rm -f
docker rm 容器id
# 刪除所有容器
docker rm -f $(docker ps -aq)
# 刪除所有容器
docker ps -a -q|xargs docker rm

3.2.6.匯入匯出

docker export $CONTAINER_ID > ubuntu.tar

image-20210904191302799

$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

3.2.7.自動重啟

docker run --restart=always 容器id(或者容器名稱)
#no - container:不重啟
#on-failure - container:退出狀態非0時重啟
#always:始終重啟
docker update --restart=always  容器id(或者容器名稱)

3.2.8.相關狀態

docker start $CONTAINER_ID
docker restart $CONTAINER_ID
docker stop $CONTAINER_ID
docker kill $CONTAINER_ID

3.3.常用其他命令

3.3.1.後臺啟動docker

docker run -d 映象名
# 用docker ps 檢視的時候 發現停止了

# 後臺執行,docker發現前臺沒有,容器啟動後,發現自己沒有提供服務,會立刻停止

3.3.2.檢視日誌

docker logs
docker logs -f --tail=20  $CONTAINER_ID #檢視最新20行

image-20210903164046849

3.3.3.檢視容器資訊

docker inspect $CONTAINER_ID 

image-20210903162732212

3.3.4.檔案copy

容器copy 到主機

docker cp $CONTAINER_ID:路徑 空格 主機路徑
docker cp 83b0be074d94:/etc/mysql /home

主機copy 到容器

docker cp 主機路徑 空格 $CONTAINER_ID:路徑

後面我們會遇到

3.3.5.工作管理員

docker stats

image-20210903170459968

4.容器資料卷

在Docker中,要想實現資料的持久化,資料就不應該在容器中,否則容器刪除,資料就會丟失。故容器之間要有一個資料共享技術,把Docker容器中產生的資料,同步到本地,這就是卷技術。

優點

  1. 容器的持久化和同步操作

  2. 容器間可以資料共享

image-20210903171643089

4.1.使用資料卷

目前Docker提供了三種不同的方式將資料從宿主機掛載到容器中:

  (1)volumes:Docker管理宿主機檔案系統的一部分,預設位於 /var/lib/docker/volumes 目錄中;(最常用的方式)

img(2)bind mounts:意為著可以儲存在宿主機系統的任意位置;(比較常用的方式)

  但是,bind mount在不同的宿主機系統時不可移植的,比如Windows和Linux的目錄結構是不一樣的,bind mount所指向的host目錄也不能一樣。這也是為什麼bind mount不能出現在Dockerfile中的原因,因為這樣Dockerfile就不可移植了。

  (3)tmpfs:掛載儲存在宿主機系統的記憶體中,而不會寫入宿主機的檔案系統;(一般都不會用的方式)

img

4.1.1.命令掛載

docker run -it -v -p  /宿主機絕對路徑:/容器內目錄:許可權   映象名
# -it 互動式進入
# -v volume卷技術
# -p 主機埠
# 掛載
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

-d 後臺執行
-p 埠對映
-v 卷掛載
-e 環境配置 安裝啟動mysql需要配置密碼
--name 容器名字

主機目錄/home/mysql/conf與/etc/mysql/conf容器目錄同步。

檢視其資訊

image-20210903172302584

soruce:主機地址

destination:容器地址

4.1.2.匿名與具名掛載

匿名掛載:卷掛載只寫容器裡面的路徑,不寫容器外的路徑。

# -v 容器內路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx

具名掛載:就是掛載的卷陪一個自己的名字,可以方便的查詢

# -v 卷名:/容器內路徑
docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx

image-20210905000343906

docker inspect 6d4a76d84a35

image-20210905000512455

4.1.3.檢視卷資訊

docker volume inspect wyl-nginx

image-20210905000602511

4.1.4.改變檔案的讀寫許可權

# ro: readonly
# rw: readwrite
# 指定容器對我們掛載出來的內容的讀寫許可權
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx

4.2.檢視所有的資料卷

docker volume ls

image-20210905001800959

4.3.共享卷

docker run -it --name nginx03 --volumes-from nginx02 nginx:latest

nginx03繼承nginx02的volumes

可以驗證,在nginx02下加一個資料,在nginx03下也會出現

刪除容器共享檔案不會刪除。

5.dockerFile

Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。

5.1.命令

FROM # 基礎映象 比如centos
MAINTAINER # 映象是誰寫的 姓名+郵箱
RUN # 映象構建時需要執行的命令
ADD # 新增,比如新增一個tomcat壓縮包
WORKDIR # 映象的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 指定暴露埠,跟-p一個道理
RUN # 最終要執行的
CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,而且可被替代
ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD # 當構建一個被繼承Dockerfile 這個時候執行ONBUILD指定,觸發指令
COPY # 將檔案拷貝到映象中
ENV # 構建的時候設定環境變數

image-20210904192846385

5.2.建立centos

5.2.1.建立dockerfile

# 進入home目錄
cd /home

# 建立一個目錄,之後的東西都儲存到這裡
mkdir dockerfile
# 進入這個目錄
cd dockerfile/
# 建立一個dockerfile,名字叫mydockerfile
vim mydockerfile-centos
FROM centos
MAINTAINER wyl<1714404171@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 8088

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

image-20210904195608613

5.2.2.docker build

cd /home/docerfile
docker build -t mycentos -f mydockerfile-centos .

後面的不要忘記

image-20210904205531218

image-20210904205704837

6.Docker Compose

前面我們使用 Docker 的時候,定義 Dockerfile 檔案,然後使用 docker build、docker run 等命令操作容器。然而微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個例項,如果每個微服務都要手動啟停,那麼效率之低,維護量之大可想而知.對此我們就可以來學習一下docker compose

它是一個用於定義和執行多容器 Docker 的應用程式工具

6.1. compose安裝

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
or
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

image-20210904212608930

pip安裝

sudo pip install docker-compose

6.2.許可權

sudo chmod +x /usr/local/bin/docker-compose

image-20210904225302027

6.3.Compose 使用

三個步驟:

  • 使用 Dockerfile 定義應用程式的環境。

    FROM java:8
    VOLUME /tmp
    ADD docker-demo.jar app.jar
    RUN bash -c 'touch /app.jar'
    EXPOSE 9000
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
    
  • 使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起執行。

    Compose和Docker相容性:
        Compose 檔案格式有3個版本,分別為1, 2.x 和 3.x
        目前主流的為 3.x 其支援 docker 1.13.0 及其以上的版本
    
    常用引數:
        version           # 指定 compose 檔案的版本
        services          # 定義所有的 service 資訊, services 下面的第一級別的 key 既是一個 service 的名稱
    
            build                 # 指定包含構建上下文的路徑, 或作為一個物件,該物件具有 context 和指定的 dockerfile 檔案以及 args 引數值
                context               # context: 指定 Dockerfile 檔案所在的路徑
                dockerfile            # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(預設為 Dockerfile)
                args                  # args: Dockerfile 在 build 過程中需要的引數 (等同於 docker container build --build-arg 的作用)
                cache_from            # v3.2中新增的引數, 指定快取的映象列表 (等同於 docker container build --cache_from 的作用)
                labels                # v3.3中新增的引數, 設定映象的後設資料 (等同於 docker container build --labels 的作用)
                shm_size              # v3.5中新增的引數, 設定容器 /dev/shm 分割槽的大小 (等同於 docker container build --shm-size 的作用)
    
            command               # 覆蓋容器啟動後預設執行的命令, 支援 shell 格式和 [] 格式
    
            configs               # 
    
            cgroup_parent         # 
    
            container_name        # 指定容器的名稱 (等同於 docker run --name 的作用)
    
            credential_spec       # 
    
            deploy                # v3 版本以上, 指定與部署和執行服務相關的配置, deploy 部分是 docker stack 使用的, docker stack 依賴 docker swarm
                endpoint_mode         # v3.3 版本中新增的功能, 指定服務暴露的方式
                    vip                   # Docker 為該服務分配了一個虛擬 IP(VIP), 作為客戶端的訪問服務的地址
                    dnsrr                 # DNS輪詢, Docker 為該服務設定 DNS 條目, 使得服務名稱的 DNS 查詢返回一個 IP 地址列表, 客戶端直接訪問其中的一個地址
                labels                # 指定服務的標籤,這些標籤僅在服務上設定
                mode                  # 指定 deploy 的模式
                    global                # 每個叢集節點都只有一個容器
                    replicated            # 使用者可以指定叢集中容器的數量(預設)
                placement             # 
                replicas              # deploy 的 mode 為 replicated 時, 指定容器副本的數量
                resources             # 資源限制
                    limits                # 設定容器的資源限制
                        cpus: "0.5"           # 設定該容器最多隻能使用 50% 的 CPU 
                        memory: 50M           # 設定該容器最多隻能使用 50M 的記憶體空間 
                    reservations          # 設定為容器預留的系統資源(隨時可用)
                        cpus: "0.2"           # 為該容器保留 20% 的 CPU
                        memory: 20M           # 為該容器保留 20M 的記憶體空間
                restart_policy        # 定義容器重啟策略, 用於代替 restart 引數
                    condition             # 定義容器重啟策略(接受三個引數)
                        none                  # 不嘗試重啟
                        on-failure            # 只有當容器內部應用程式出現問題才會重啟
                        any                   # 無論如何都會嘗試重啟(預設)
                    delay                 # 嘗試重啟的間隔時間(預設為 0s)
                    max_attempts          # 嘗試重啟次數(預設一直嘗試重啟)
                    window                # 檢查重啟是否成功之前的等待時間(即如果容器啟動了, 隔多少秒之後去檢測容器是否正常, 預設 0s)
                update_config         # 用於配置滾動更新配置
                    parallelism           # 一次性更新的容器數量
                    delay                 # 更新一組容器之間的間隔時間
                    failure_action        # 定義更新失敗的策略
                        continue              # 繼續更新
                        rollback              # 回滾更新
                        pause                 # 暫停更新(預設)
                    monitor               # 每次更新後的持續時間以監視更新是否失敗(單位: ns|us|ms|s|m|h) (預設為0)
                    max_failure_ratio     # 回滾期間容忍的失敗率(預設值為0)
                    order                 # v3.4 版本中新增的引數, 回滾期間的操作順序
                        stop-first            #舊任務在啟動新任務之前停止(預設)
                        start-first           #首先啟動新任務, 並且正在執行的任務暫時重疊
                rollback_config       # v3.7 版本中新增的引數, 用於定義在 update_config 更新失敗的回滾策略
                    parallelism           # 一次回滾的容器數, 如果設定為0, 則所有容器同時回滾
                    delay                 # 每個組回滾之間的時間間隔(預設為0)
                    failure_action        # 定義回滾失敗的策略
                        continue              # 繼續回滾
                        pause                 # 暫停回滾
                    monitor               # 每次回滾任務後的持續時間以監視失敗(單位: ns|us|ms|s|m|h) (預設為0)
                    max_failure_ratio     # 回滾期間容忍的失敗率(預設值0)
                    order                 # 回滾期間的操作順序
                        stop-first            # 舊任務在啟動新任務之前停止(預設)
                        start-first           # 首先啟動新任務, 並且正在執行的任務暫時重疊
    
                注意:
                    支援 docker-compose up 和 docker-compose run 但不支援 docker stack deploy 的子選項
                    security_opt  container_name  devices  tmpfs  stop_signal  links    cgroup_parent
                    network_mode  external_links  restart  build  userns_mode  sysctls
    
            devices               # 指定裝置對映列表 (等同於 docker run --device 的作用)
    
            depends_on            # 定義容器啟動順序 (此選項解決了容器之間的依賴關係, 此選項在 v3 版本中 使用 swarm 部署時將忽略該選項)
    
  • 最後,執行 docker-compose up 命令來啟動並執行整個應用程式。

    docker-compose up
    docker-compose up -d  // 後臺啟動並執行容器
    

    6.3.解除安裝

# pip解除安裝
pip uninstall docker-compose

6.4.常用命令

image-20210904231917066

7.docker network

預設情況下容器與容器、容器與宿主機的網路是隔離開來的,

當你安裝docker的時候,docker會建立一個橋接器docker0,通過它才讓容器與容器、容器與宿主機之間通訊。

Docker安裝的時候預設會建立三個不同的網路,你可以通過命令檢視這些網路。

docker network ls

image-20210905204545744

#幫助命令後顯示下面資訊
[root@vultrguest ~]# docker network --help

Usage:	docker network COMMAND

Manage networks

Options:
      --help   Print usage

Commands:
    connect 將某個容器連線到一個docker網路
    create 建立一個docker區域網路
    disconnect 將某個容器退出某個區域網路
    inspect 顯示某個區域網路資訊
    ls 顯示所有docker區域網路
    prune 刪除所有未引用的docker區域網路
    rm 刪除docker網路

Run 'docker network COMMAND --help' for more information on a command.

7.1.預設網路

7.1.1.None Network

網路模式為none的,即不會為容器建立任何的網路環境。

一旦Docker Container採用了none網路模式,那麼容器內部就只能使用loopback網路裝置,不會再有其他的網路資源。

7.1.2.Host Network

如果你在建立容器的時候使用--network=host選項,那麼容器會使用宿主機的網路,容器與宿主機的網路並沒有隔離。

使用這種網路型別的好處就是網路效能很好,基本上跟宿主機的網路一樣,它很大的弊端就是不安全

你可以在容器中更改宿主機的網路,如果你的程式是用root使用者執行的,有可能會通過Docker容器來控制宿主機的網路。

當我們在容器中執行類似ifconfig命令檢視網路環境是,看到的都是宿主機上的資訊。

7.1.3.Bridge Network

橋接網路是預設的網路型別,我們可以使用下面的命令來檢視預設的網路配置資訊。

這兒橋接的網路名為docker0。當我們啟動一個容器的時候,每個容器會有它自己的虛擬網路介面連線到docker0,並獲得一個IP地址。

image-20210905205007741

7.2.自定義網路

7.2.1建立網路

docker network create mynet

image-20210905205325275

7.2.2.把容器加入區域網

#執行redis容器
docker run -itd --name redis  --network mynet --network-alias redis -p 6379:6379 redis
#執行nginx容器
docker run -d --name nginx -p 8081:8081 --network mynet --network-alias nginx --privileged=true   -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs  nginx

image-20210905205748631

7.2.3.檢視mynet 資訊

image-20210905205917495

7.2.4.docker network connect

也可以不指定網路,直接啟動容器,然後使用docker network connect接入網路

docker network connect mynet nginx
docker network connect mynet redis

7.2.5.移除區域網

docker network disconnect mynet nginx

相關文章