Docker快速入門


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM