1. 程式人生 > 資訊 >一圖看懂新冠德爾塔變異毒株:體內複製快,早期發燒症狀不明顯

一圖看懂新冠德爾塔變異毒株:體內複製快,早期發燒症狀不明顯

Docker


docker的安裝

一、如果之前安裝過docker,解除安裝

yum remove docker docker-common docker-selinux docker-engine -y

二、更新yum源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

三、如果是新安裝的系統,可以更新作業系統和核心

yum update -y

四、新增docker-ce yum源

wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo# 清除rpm包及headeryum clean all# 重新快取遠端伺服器rpm包資訊yum makecache

五、新增阿里雲映象加速器



mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://qi3pe2qe.mirror.aliyuncs.com"]}EOFsystemctl daemon-reload

六、安裝Docker

yum install docker-ce -y

七、啟動並設定開機自啟

[root@docker01 ~]# systemctl start docker[root@docker01 ~]# systemctl enable docker

八、檢查docker是否啟動成功

[root@docker01 ~]# docker info[root@docker01 ~]# docker version

tips:建議按照官方文件安裝,阿里雲內部映象:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


Docker的常用命令

docker映象命令

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

一、常用映象倉庫
官方倉庫:hub.docker.com自己的私有倉庫:Harbor阿里雲私有倉庫:registry.cn-hangzhou.aliyuncs.com
二、docker映象常用命令
    1、docker search [映象名稱]                     #搜尋映象, 優先選官方,stars數量多
    2、docker pull [映象名稱]                     #拉取映象(下載映象),注意版本
    3、docker push [映象標籤]                     #推送映象(上傳映象)
    4、docker load < [包名稱]                      #將包匯入映象
       例子: docker load  -i  docker_nginx.tar.gz
    5、docker save [映象名稱|映象ID] > [包名稱]    #將包匯出映象匯出映象
       例子:docker save centos:7 -o docker_centos7.tar.gz
    6、docker image  ls                           #檢視映象列表
    7、docker rmi [映象名稱或者映象ID]            #刪除映象
    8、docker tag [映象ID]  映象標籤                 #給映象打標籤
三、docker映象命令使用及進階
1、搜尋映象search
    格式
        docker search [映象名稱]
    #引數
        -f 篩選
    #搜尋收藏大於等於600
    [root@docker01 ~]# docker search mysql -f stars=600
    #搜尋官方映象
    [root@docker01 ~]# docker search -f is-official=true mysql
2、拉取映象pull
    格式
        docker pull [映象名稱]

    例項
    [root@docker01 ~]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    #映象層:
    a076a628af6f: Pull complete 
    f40dd07fe7be: Pull complete 
    ce21c8a3dbee: Pull complete 
    ee99c35818f8: Pull complete 
    56b9a72e68ff: Pull complete 
    3f703e7f380f: Pull complete 
    #映象ID號,全球唯一
    Digest: sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
    #映象下載狀態
    Status: Downloaded newer image for redis:latest
    #映象的全稱(映象的tag)
    docker.io/library/redis:latest
3、檢視當前映象列表images
    # 格式
        docker images 或者 docker image ls
    # 引數
        -q : 只顯示映象ID
        [root@docker01 ~]# docker images -q
        621ceef7494a
4、獲取映象詳細資訊inspect
    # 格式
        docker inspect [映象名稱或映象ID]
    # 引數
    -f : 格式化輸出
    [root@Centos7 ~]# docker inspect -f '{ {.Id} }' 621ceef7494a
    sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
    [root@Centos7 ~]# docker inspect -f '{ {.ContainerConfig.Hostname} }' redis
    16535cfaf84a
5、登入映象倉庫login
    # 格式
        docker login 
        注: 預設情況下,docker login登入的是官方倉庫,如果登入其他映象倉庫則需要指定映象倉庫的URL連線。
    # 引數
    --username|-u : 指定使用者名稱
    --password|-p : 指定密碼
    [root@docker01 ~]# docker login -u 1426115933
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    [root@docker01 ~]# docker login --username=武宜帥 registry.cn-hangzhou.aliyuncs.com
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    [root@docker01 ~]# cat .docker/config.json 
    {
        "auths": {
            "https://index.docker.io/v1/": {
                "auth": "MTQyNjExNTkzMzpXdTE1NTg4MTk4OTA5LjA="
            },
            "registry.cn-hangzhou.aliyuncs.com": {
                "auth": "5q2m5a6c5biFOld1MTU1ODgxOTg5MDkuMA=="
            }
        }
    }[root@docker01 ~]#
6、映象標籤tag
    # 映象標籤的構成
    docker.io/library/redis:latest
    docker.io  : 映象倉庫的URL
    library    :映象倉庫名稱空間
    redis       : 映象名稱
    latest       : 映象版本號
    # 打標籤
        # 格式
            docker tag [映象ID]  映象標籤
    # 例項
    [root@docker01 ~]# docker tag 621ceef7494a registry.cn-hangzhou.aliyuncs.com/wxyuan/test/redis:v1
    [root@docker01 ~]# docker images -a
    REPOSITORY                                            TAG       IMAGE ID       CREATED        SIZE
    redis                                                 latest    621ceef7494a   2 months ago   104MB
    registry.cn-hangzhou.aliyuncs.com/wxyuan/test/redis   v1        621ceef7494a   2 months ago   104MB
7、映象上傳push
    # 格式
        docker push [映象標籤]
    # 注:要想上傳映象,首先得登入映象倉庫,其次設定對應映象倉庫的tag
    [root@docker01 ~]# docker push registry.cn-hangzhou.aliyuncs.com/wxyuan/test/redis:v1 
    The push refers to repository [registry.cn-hangzhou.aliyuncs.com/wxyuan/test/redis]
    3480f9cdd491: Pushed 
    a24a292d0184: Pushed 
    f927192cc30c: Pushed 
    1450b8f0019c: Pushed 
    8e14cb7841fa: Pushed 
    cb42413394c4: Pushed 
    v1: digest: sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892 size: 1572
8、映象刪除 rmi
    # 格式
        docker rmi [映象名稱或者映象ID]
    # 例項
        [root@docker01 ~]# docker rmi redis
        Untagged: redis:latest
        Untagged: redis@sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
    # 引數
        -f  : 強制刪除
    # 例項
        [root@docker01 ~]# docker rmi -f 621ceef7494a
9、清空映象image prune
    docker image prune命令用於刪除未使用的映像。 如果指定了-a,還將刪除任何容器未引用的所有映像。
# 格式
    docker image prune
 # 引數
 -a : 刪除所有映象
# 例項
[root@docker01 ~]# docker image prune 
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
docker rmi -f $( docker images -q )
oot@docker01 ~]# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: nginx:latest
untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
deleted: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
deleted: sha256:4dfe71c4470c5920135f00af483556b09911b72547113512d36dc29bfc5f7445
deleted: sha256:3c90a0917c79b758d74b7040f62d17a7680cd14077f734330b1994a2985283b8
deleted: sha256:a1c538085c6f891424160d8db120ea093d4dda393e94cd4713e3fff3c82299b5
deleted: sha256:a3ee2510dcf02c980d7aff635909612006fd1662084d6225e52e769b984abeb5
untagged: redis:latest
untagged: redis@sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
deleted: sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
deleted: sha256:de66cfbf4712b8ba9ef292e08ef7487be26d9d21b350548e400ae351405d820e
deleted: sha256:79b2381e35429e8fc04d31b3445f069c22d288bf5c4cba7b7c10004ff78ae201
deleted: sha256:1d047d19be363b00139990d4d7f392dabdb0809dbc9d0fbe67c1f15b8caed27a
deleted: sha256:8c41f4e708c37059df28ae1cabc200a6db2fee45bd3a2cadcf70f2765bb68730
deleted: sha256:b51317bef36fe1900be48402c8a41fcd9cdb6b8950c10209f764473cb8323371
deleted: sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864
Total reclaimed space: 168MB
10、檢視映象構建歷史 history
    # 格式
        docker history [映象ID或映象名稱]
    # 例項
    [root@docker01 ~]# docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    596ba82af5aa: Pull complete 
    Digest: sha256:d9a7354e3845ea8466bb00b22224d9116b183e594527fb5b6c3d30bc01a20378
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    [root@docker01 ~]# docker history alpine:latest 
    IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
    7731472c3f2a   2 months ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B        
    <missing>      2 months ago   /bin/sh -c #(nop) ADD file:edbe213ae0c825a5b…   5.61MB
11、儲存容器為映象commit
    # 儲存正在執行的容器直接為映象
    # 格式:
        docker commit [容器ID|容器名稱] 儲存名稱:版本
    # 引數
        -a 映象作者
        -p 提交期間暫停容器
        -m 容器說明
    # 例項
        [root@docker01 ~]# docker ps
        CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
        ebb852aefe0a   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:49153->80/tcp   wizardly_shamir
        [root@docker01 ~]# docker commit -a "xiaowu" -m "小武的容器" -p ebb852aefe0a test:v1
        sha256:a9297902755a4ede3ce38c2717515626c678b6deae50206071a0a29ebcd208a9
        [root@docker01 ~]# docker images
        REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
        test         v1        a9297902755a   4 seconds ago   133MB
        alpine       latest    7731472c3f2a   2 months ago    5.61MB
        nginx        latest    f6d0b4767a6c   2 months ago    133MB
12、儲存容器為映象包(export/import)
    # export儲存正在執行的容器為映象包
    ## 儲存容器為映象
        docker export [容器的ID] > [包名稱]
    # 例項
        [root@docker01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
    ebb852aefe0a   nginx     "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   0.0.0.0:49153->80/tcp   wizardly_shamir
    [root@docker01 ~]# docker export ebb852aefe0a > nginx:v1.tar
    [root@docker01 ~]# ll
    -rw-r--r--  1 root root 135403008 Mar 18 21:05 nginx:v1.tar

    # import 將映象包解為映象
    ## docker import [包名稱] [自定義映象名稱]
        # 例項
        [root@docker01 ~]# docker import nginx\:v1.tar  nginx:v2
        sha256:59bde51898fa443281782320b194d5e139c37ece32528843bb26d444800265ab
        [root@docker01 ~]# docker images
        REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
        nginx        v2        59bde51898fa   10 seconds ago   131MB
        test         v1        a9297902755a   6 minutes ago    133MB
        alpine       latest    7731472c3f2a   2 months ago     5.61MB
        nginx        latest    f6d0b4767a6c   2 months ago     133MB
13、儲存映象為映象包(save/load)
# save儲存映象為映象包
# 儲存映象的格式:
    docker save [映象名稱|映象ID] > [包名稱]
# 例項
    [root@docker01 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    nginx        v2        59bde51898fa   About a minute ago   131MB
    test         v1        a9297902755a   8 minutes ago        133MB
    alpine       latest    7731472c3f2a   2 months ago         5.61MB
    nginx        latest    f6d0b4767a6c   2 months ago         133MB
    [root@docker01 ~]# docker save alpine > alpine.tar
    [root@docker01 ~]# ll
    -rw-r--r--  1 root root   5889024 Mar 18 21:10 alpine.tar
    -rw-r--r--  1 root root 135403008 Mar 18 21:05 nginx:v1.tar
# load 將映象包匯入為映象
    docker load < [包名稱]
# 例項
    [root@docker01 ~]# ll
    -rw-r--r--  1 root root   5889024 Mar 18 21:10 alpine.tar
    -rw-------. 1 root root      1718 Nov 17 20:34 anaconda-ks.cfg
    -rw-r--r--  1 root root 135403008 Mar 18 21:05 nginx:v1.tar
    [root@docker01 ~]# docker load < alpine.tar 
    Loaded image: alpine:latest
    [root@docker01 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    nginx        v2        59bde51898fa   5 minutes ago    131MB
    test         v1        a9297902755a   12 minutes ago   133MB
    alpine       latest    7731472c3f2a   2 months ago     5.61MB
    nginx        latest    f6d0b4767a6c   2 months ago     133MB
# 注:save/load儲存映象無法自定義映象名稱,save儲存映象時如果使用ID儲存則load匯入映象無名稱,使用名稱匯入時才有名稱。

以上三種儲存映象的區別

1、export儲存的映象體積要小於save(save儲存更完全,export儲存會丟掉一些不必要的資料)
2、export可以重新命名映象名稱而save則不行
3、save可以同時儲存多個映象而export則不行

docker容器命令

一、容器介紹

1、容器就是對外提供服務的一個例項。2、容器啟動的必要條件:容器內至少有一個程序執行在前臺

二、容器命令

1、docker ps檢視容器列表2、docker run建立容器

三、容器命令的使用及進階

1、docker ps檢視容器列表
    # 格式    
        docker ps [引數]
    # 預設
        docker ps         # 檢視正在執行的容器列表
    # 引數
        -a : 檢視系統中所有的容器。
        -q : 僅顯示容器的ID
    # 例項
2、docker run建立容器
# 格式    docker run [引數] [映象名稱] [執行容器的啟動命令]
引數
1)-d 守護程序方式執行
    # 格式
        docker run -d [映象名稱] [cmd]
     #如果沒有前臺應用,j
    # 例項
        docker run -d nginx
2)—name指定容器名稱
    # 格式
        docker run -d --name [容器名稱] [映象的名稱] [cmd]
    # 例項
        docker run -d --name nginx nginx
3)-p指定埠對映
    # 格式
        docker run -d -p 宿主機IP:宿主主機埠:容器內埠 [映象的名稱] [cmd]
        不使用宿主機IP預設本機全網段埠開放
    # 例項
        埠對映
        docker run -d -p 80:80 nginx
        docker run -d -p 10.0.0.210:81:80 nginx
        埠範圍對映
        docker run -d -p 81-89:81-89 nginx
        使用UDP協議做埠對映
        docker run -d -p 90:80/udp nginx
        使用UDP協議做埠隨機對映
        docker run -d -p ::80/udp nginx
        隨機埠對映
        docker run -d -p ::80 nginx
4)-P隨機埠對映
    # 格式
        docker run -d -P [映象名稱] [cmd]
    # 例項
        docker run -d -P nginx
5)-it以互動式方式開啟一個偽終端
    -i        #以互動式執行容器
    -d        #建立一個為終端
    # 格式
        docker run -it [映象名稱] [cmd]
    # 例項
        以互動式方式開啟一個偽終端
        docker run -it nginx bash
        以互動式方式開啟一個終端在後臺執行
        docker run -dit centos
6)-v 給容器掛載資料卷
    # 格式
        docker run -v 宿主主機絕對目錄:容器內目錄  [映象名稱] [cmd]
        在宿主機建立一個固定名字的目錄,來持久化容器的目錄下的資料
        docker run -v 宿主主機絕對目錄:容器內目錄  [映象名稱] [cmd]
    # 例項
        docker run -dit -v /root/test:/root centos7
        docker run -dit -v /root/test1:/root centos7
7)—rm容器生命週期結束立即刪除
    # 格式
        docker run --rm [映象名稱] [cmd]
    # 例項
        docker run -d --rm nginx
8)-e在容器中建立一個環境變數
    #格式
        docker run -e 環境變數 -d [映象名稱] [cmd]
    # 例項
        [root@docker01 ~]# docker run -it -e NAME=abc centos:7
        [root@5288ff59ea57 /]# printenv
        NAME=abc
9)—link連上一個容器,實現網路互通
    # 格式
        docker run --link 被連線的容器的名稱:連線別名 [映象名稱] [cmd]
    # 例項
        [root@docker01 ~]# docker run -it --link dc1dab96297a:nginx centos
        [root@6044ef9f8bbe /]# ping nginx
        64 bytes from nginx (172.17.0.5): icmp_seq=1 ttl=64 time=0.158 ms
10)-h設定容器主機名
    # 格式
        docker run -h "主機名"  [映象名稱] [cmd]
    # 例項
        [root@docker01 ~]# docker run -it -h "xiaowu" nginx bash
    root@xiaowu:/#

補充

    容器想要放在後臺一直執行的化,那麼容器的初始命令,必須夯住(前臺執行),否則容器就會退出.
    前臺執行
    nginx -g 'daemon off;'
    /usr/sbin/php-fpm --nodaemonize
    /usr/sbin/sshd -D
3、docker create建立容器不啟動
    docker create [引數] [映象名稱] [執行容器的啟動命令]
    #引數
    大部分引數與docker run相同
    區別:
    1、無-d引數
    # docker run和docker create執行流程
    1、檢查本地是否用指定映象,如果沒有則去對應的倉庫下載映象
    2、啟動容器,如果指定了命令則使用指定的命令,如果沒有則使用預設的命令
    3、返回容器ID
4、start/stop啟停容器
    # 啟動(該容器必須是系統已經存在的容器)
        docker start [容器的ID|名稱]
    # 停止
        docker stop [容器的ID|名稱]
5、docker rm刪除容器
    # 格式
        docker rm [容器名稱|ID]
    # 引數
        -f : 強制刪除
        docker rm -f [容器名稱|ID]
    # 清空容器
        正在執行的不會刪除
        docker rm $(docker ps -a -q)
        正在執行的也會被刪除
        docker rm -f $(docker ps -a -q)
6、docker inspect檢視容器資訊
    # 格式
        docker inspect [容器名稱|ID]
    #檢視容器執行狀態
        #格式
        docker inspect -f '{ {資訊名稱} }' [容器名稱|ID]
        #例項
        docker inspect -f '{ {.State.Running} }' nginx
7、docker cp複製命令
    #宿主機檔案複製到容器內
        docker cp [宿主主機檔案路徑]  容器ID:容器內路徑
    2、複製到容器外
        docker cp 容器ID:容器內路徑 [宿主主機檔案路徑]
8、docker exec/attach進入容器
    1. exec : 進入正在執行的容器(分配一個新終端)(官方推薦)
        docker exec [引數] [容器的名稱|ID] [cmd]
        #例項
            docker exec -it nginx bash
    2. attach : 進入正在執行的容器(使用相同的終端)
        docker attach [容器ID|名稱]
        直接離開會關掉容器
        偷偷離開的快捷鍵ctrl +p,ctrl +q
9、其他進入容器的方法
    3、nsenter : 建立一個管道連線上容器主ID
        nsenter --target $( docker inspect -f { {.State.Pid} } [容器名|ID]) --mount --uts --ipc --net --pid
    4、ssh : 通過ssh連線  (麻煩不推薦)
10、儲存容器為映象commit
    # 儲存正在執行的容器直接為映象
    # 格式:
        docker commit [容器ID|容器名稱] 儲存名稱:版本
    # 引數
        -a 映象作者
        -p 提交期間暫停容器
        -m 容器說明
    # 例項
        [root@docker01 ~]# docker ps
        CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
        ebb852aefe0a   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:49153->80/tcp   wizardly_shamir
        [root@docker01 ~]# docker commit -a "xiaowu" -m "小武的容器" -p ebb852aefe0a test:v1
        sha256:a9297902755a4ede3ce38c2717515626c678b6deae50206071a0a29ebcd208a9
        [root@docker01 ~]# docker images
        REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
        test         v1        a9297902755a   4 seconds ago   133MB
        alpine       latest    7731472c3f2a   2 months ago    5.61MB
        nginx        latest    f6d0b4767a6c   2 months ago    133MB
11、儲存容器為映象包(export/import)
    # export儲存正在執行的容器為映象包
    ## 儲存容器為映象
        docker export [容器的ID] > [包名稱]
    # 例項
        [root@docker01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
    ebb852aefe0a   nginx     "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   0.0.0.0:49153->80/tcp   wizardly_shamir
    [root@docker01 ~]# docker export ebb852aefe0a > nginx:v1.tar
    [root@docker01 ~]# ll
    -rw-r--r--  1 root root 135403008 Mar 18 21:05 nginx:v1.tar

    # import 將映象包解為映象
    ## docker import [包名稱] [自定義映象名稱]
        # 例項
        [root@docker01 ~]# docker import nginx\:v1.tar  nginx:v2
        sha256:59bde51898fa443281782320b194d5e139c37ece32528843bb26d444800265ab
        [root@docker01 ~]# docker images
        REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
        nginx        v2        59bde51898fa   10 seconds ago   131MB
        test         v1        a9297902755a   6 minutes ago    133MB
        alpine       latest    7731472c3f2a   2 months ago     5.61MB
        nginx        latest    f6d0b4767a6c   2 months ago     133MB

Docker映象講解

映象是什麼

映象是一種輕量級、 可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內
容,包括程式碼、執行時、庫、環境變數和配置檔案。 所有應用,直接打包docker映象,就可以跑起來!!

如何得到映象

  • 從遠端倉庫下載
  • 朋友拷貝給你
  • 自己製作一個映象 DockerFile

Docker映象載入原理

UnionFS (聯合檔案系統)

下載的時候看到的一層層就是這個

Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem)。Union 檔案系統是 Docker 映象的基礎。映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象。

特性:一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄

Docker映象載入原理

docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。


平時我們安裝進虛擬機器的CentOS都是好幾個G,為什麼docker這裡才200M??

對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程式庫就可以了,因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。 虛擬機器是分鐘級別,容器時秒級

分層的映象

以我們的pull為例,在下載的過程中我們可以看到docker的映象好像是在一層一層的在下載

為什麼 Docker 映象要採用這種分層結構呢

最大的一個好處就是 - 共享資源

比如:有多個映象都從相同的 base 映象構建而來,那麼宿主機只需在磁碟上儲存一份base映象,
同時記憶體中也只需載入一份 base 映象,就可以為所有容器服務了。而且映象的每一層都可以被共享。

 "Layers": [                "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7",                "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871",                "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54",                "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1",                "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3",                "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"            ]

如何提交自己的映象 commit映象

docker commit 提交容器成為一個新的副本#命令和git原理類似docker commit -m=“提交的描述資訊" -a="作者" 容器id 目標映象名:[TAG]

實戰測試

#1.啟動tomcat發現沒有頁面顯示,因為官方的webapps裡面是沒有檔案的所以說我們要從webapps.dist檔案裡面拷貝進去#但是自己是很難受的#2.拷貝 操作root@ed8e9ece8550:/usr/local/tomcat/# cp -r webapps.dist/* webapps/#3.看下是否進去root@ed8e9ece8550:/usr/local/tomcat/webapps# lsROOT  docs  examples  host-manager  manager#4.把他放進到映象中去 用commit操作將容器提交成為一個映象  我們以後可以使用修改後的即可# -m -a 位置隨便 docker commit -m=“提交的描述資訊" -a="作者" 容器id 目標映象名:[TAG][root@bogon ~]# docker commit -a="SxrTj" -m="webapps app" ed8e9ece8550 tomcat01:1.0
映象:就是從docker下載的相當於一個模板而容器它會在所有的映象層之上增加一個可寫層 這個可寫層有執行在CPU上的程序 而且有兩個不同的狀態:執行態(Running)和退出態(Exited)。這就是Docker容器。

容器資料卷

將容器中的資料持久化在本地,不會因為容器的刪除而丟失。也可以當作容器之間的資料共享作用。卷技術,目錄的掛載,將我們容器內的目錄,掛載到Linux上面。總結:容器的持久化和同步操作,可以用作容器間資料共享

使用資料卷

方式一:直接使用命令來掛載 -v
docker run -it -v 【主機目錄】:【容器內目錄】  

在容器內對應的資料變化會同步到掛載的主機目錄之中,同時對主機中的檔案進行修改變化也會同步到容器中。

方式二:匿名掛載
docker run -d -p --name [NAME] -v [容器內目錄]
方法三:具名掛載
docker run -d -p --name [NAME] -v [卷名]:[容器內路徑]

tips:沒有指定宿主機中的目錄位置,會預設放至/var/lib/docker/volumes/xxx/_data中


參考進階:https://blog.csdn.net/weixin_43591980/article/details/106316094


初始Dockerfile

Dockerfile就是用來構建docker映象的構建檔案!命令指令碼!通過這個指令碼可以生成映象,映象是一層一層的,指令碼一個個的命令,每個命令都是一層!

# 建立一個dockerfile檔案,名字可以隨便 建議Dockerfile
# 檔案中的內容: 指令(大寫) + 引數
$ vim dockerfile1
    FROM centos 					# 當前這個映象是以centos為基礎的

    VOLUME ["volume01","volume02"] 	# 掛載卷的卷目錄列表(多個目錄)

    CMD echo "-----end-----"		# 輸出一下用於測試
    CMD /bin/bash					# 預設走bash控制檯

# 這裡的每個命令,就是映象的一層!
# 構建出這個映象 
-f dockerfile1 			# f代表file,指這個當前檔案的地址(這裡是當前目錄下的dockerfile1)
-t caoshipeng/centos 	# t就代表target,指目標目錄(注意caoshipeng映象名前不能加斜槓‘/’)
. 						# 表示生成在當前目錄下
$ docker build -f dockerfile1 -t caoshipeng/centos .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
8a29a15cefae: Already exists 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"] 			# 卷名列表
 ---> Running in c18eefc2c233
Removing intermediate container c18eefc2c233
 ---> 623ae1d40fb8
Step 3/4 : CMD echo "-----end-----"					# 輸出 指令碼命令
 ---> Running in 70e403669f3c
Removing intermediate container 70e403669f3c
 ---> 0eba1989c4e6
Step 4/4 : CMD /bin/bash
 ---> Running in 4342feb3a05b
Removing intermediate container 4342feb3a05b
 ---> f4a6b0d4d948
Successfully built f4a6b0d4d948
Successfully tagged caoshipeng/centos:latest

# 檢視自己構建的映象
$ docker images
REPOSITORY          TAG          IMAGE ID            CREATED              SIZE
caoshipeng/centos   latest       f4a6b0d4d948        About a minute ago   237MB

啟動自己寫的容器映象

$ docker run -it f4a6b0d4d948 /bin/bash	# 執行自己寫的映象
$ ls -l 								# 檢視目錄

這個卷和外部一定有一個同步的目錄

檢視一下卷掛載

# docker inspect 容器id
$ docker inspect ca3b45913df5

測試一下剛才的檔案是否同步出去了!

這種方式使用的十分多,因為我們通常會構建自己的映象!

假設構建映象時候沒有掛載卷,要手動映象掛載 -v 卷名:容器內路徑!


資料卷容器

多個MySQL同步資料

命名的容器掛載資料卷!

# 測試 啟動3個容器,通過剛才自己寫的映象啟動
# 建立docker01:因為我本機是最新版,故這裡用latest,狂神老師用的是1.0如下圖
$ docker run -it --name docker01 caoshipeng/centos:latest

# 檢視容器docekr01內容
$ ls
bin  home   lost+found	opt   run   sys  var
dev  lib    media	proc  sbin  tmp  volume01
etc  lib64  mnt		root  srv   usr  volume02

# 不關閉該容器退出
CTRL + Q + P  

# 建立docker02: 並且讓docker02 繼承 docker01
$ docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest

# 檢視容器docker02內容
$ ls
bin  home   lost+found	opt   run   sys  var
dev  lib    media	proc  sbin  tmp  volume01
etc  lib64  mnt		root  srv   usr  volume02

# 再新建一個docker03同樣繼承docker01
$ docker run -it --name docker03 --volumes-from docker01 caoshipeng/centos:latest
$ cd volume01	#進入volume01 檢視是否也同步docker01的資料
$ ls 
docker01.txt

# 測試:可以刪除docker01,檢視一下docker02和docker03是否可以訪問這個檔案
# 測試發現:資料依舊保留在docker02和docker03中沒有被刪除

多個mysql實現資料共享

$ 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:5.7

$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7

# 這個時候,可以實現兩個容器資料同步!

結論:

容器之間的配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止

所有容器的掛載卷都是通過Linux硬連線的方式,將同步檔案都連線到宿主機的本地檔案中。

但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的


DockerFile

DockerFile介紹

dockerfile是用來構建docker映象的檔案!命令引數指令碼!

構建步驟:

1、 編寫一個dockerfile檔案

2、 docker build 構建稱為一個映象

3、 docker run執行映象

4、 docker push釋出映象(DockerHub 、阿里雲倉庫)

點選後跳到一個Dockerfile

很多官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!

官方既然可以製作映象,那我們也可以!

DockerFile構建過程

基礎知識:

1、每個保留關鍵字(指令)都是必須是大寫字母

2、執行從上到下順序

3、#表示註釋

4、每一個指令都會建立提交一個新的映象曾,並提交!

Dockerfile是面向開發的,我們以後要釋出專案,做映象,就需要編寫dockerfile檔案,這個檔案十分簡單!

Docker映象逐漸成企業交付的標準,必須要掌握!

DockerFile:構建檔案,定義了一切的步驟,原始碼

DockerImages:通過DockerFile構建生成的映象,最終釋出和執行產品。

Docker容器:容器就是映象執行起來提供服務。

DockerFile的指令

FROM				# from:基礎映象,一切從這裡開始構建
MAINTAINER			# maintainer:映象是誰寫的, 姓名+郵箱
RUN					# run:映象構建的時候需要執行的命令
ADD					# add:步驟,tomcat映象,這個tomcat壓縮包!新增內容 新增同目錄
WORKDIR				# workdir:映象的工作目錄
VOLUME				# volume:掛載的目錄
EXPOSE				# expose:保留埠配置
CMD					# cmd:指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代
ENTRYPOINT			# entrypoint:指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD				# onbuild:當構建一個被繼承DockerFile這個時候就會執行onbuild的指令,觸發指令
COPY				# copy:類似ADD,將我們檔案拷貝到映象中
ENV					# env:構建的時候設定環境變數!

實戰測試

scratch 映象

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200504" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-05-04 00:00:00+01:00"

CMD ["/bin/bash"]

Docker Hub 中 99%的映象都是從這個基礎映象過來的 FROM scratch,然後配置需要的軟體和配置來進行構建。

建立一個自己的centos

# 1./home下新建dockerfile目錄
$ mkdir dockerfile

# 2. dockerfile目錄下新建mydockerfile-centos檔案
$ vim mydockerfile-centos

# 3.編寫Dockerfile配置檔案
FROM centos							# 基礎映象是官方原生的centos
MAINTAINER yangchen<[email protected]> 	# 作者

ENV MYPATH /usr/local				# 配置環境變數的目錄 
WORKDIR $MYPATH						# 將工作目錄設定為 MYPATH

RUN yum -y install vim				# 給官方原生的centos 增加 vim指令
RUN yum -y install net-tools		# 給官方原生的centos 增加 ifconfig命令

EXPOSE 80							# 暴露埠號為80

CMD echo $MYPATH					# 輸出下 MYPATH 路徑
CMD echo "-----end----"				
CMD /bin/bash						# 啟動後進入 /bin/bash

# 4.通過這個檔案構建映象
# 命令: docker build -f 檔案路徑 -t 映象名:[tag] .
$ docker build -f mydockerfile-centos -t mycentos:0.1 .

# 5.出現下圖後則構建成功

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            0.1                 cbf5110a646d        2 minutes ago       311MB

# 6.測試執行
$ docker run -it mycentos:0.1 		# 注意帶上版本號,否則每次都回去找最新版latest

$ pwd	
/usr/local							# 與Dockerfile檔案中 WORKDIR 設定的 MYPATH 一致
$ vim								# vim 指令可以使用
$ ifconfig     						# ifconfig 指令可以使用

# docker history 映象id 檢視映象構建歷史步驟
$ docker history 映象id

我們可以列出本地進行的變更歷史

我們平時拿到一個映象,可以用 “docker history 映象id” 研究一下是什麼做的

CMD 和 ENTRYPOINT區別

CMD					# 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT			# 指定這個容器啟動的時候要執行的命令,可以追加命令
測試cmd
# 編寫dockerfile檔案
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]					# 啟動後執行 ls -a 命令

# 構建映象
$ docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .

# 執行映象
$ docker run cmd-test:0.1		# 由結果可得,執行後就執行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home

# 想追加一個命令  -l 成為ls -al:展示列表詳細資料
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

# cmd的情況下 -l 替換了CMD["ls","-l"] 而 -l  不是命令所以報錯
測試ENTRYPOINT
# 編寫dockerfile檔案
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

# 構建映象
$ docker build  -f dockerfile-test-entrypoint -t cmd-test:0.1 .

# 執行映象
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...

# 我們的命令,是直接拼接在我們得ENTRYPOINT命令後面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....

Dockerfile中很多命令都十分的相似,我們需要了解它們的區別,我們最好的學習就是對比他們然後測試效果!

實戰:Tomcat映象

1、準備映象檔案
準備tomcat 和 jdk 到當前目錄,編寫好README
1
2、編寫dokerfile
$ vim dockerfile
FROM centos 										# 基礎映象centos
MAINTAINER cao<[email protected]>					# 作者
COPY README /usr/local/README 						# 複製README檔案
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ 			# 新增jdk,ADD 命令會自動解壓
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ 		# 新增tomcat,ADD 命令會自動解壓
RUN yum -y install vim								# 安裝 vim 命令
ENV MYPATH /usr/local 								# 環境變數設定 工作目錄
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_231 				# 環境變數: JAVA_HOME環境變數
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 	# 環境變數: tomcat環境變數
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35

# 設定環境變數 分隔符是:
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin 	

EXPOSE 8080 										# 設定暴露的埠

CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out 					# 設定預設命令

3、構建映象
# 因為dockerfile命名使用預設命名 因此不用使用-f 指定檔案
$ docker build -t mytomcat:0.1 .
4、run映象
# -d:後臺執行 -p:暴露埠 --name:別名 -v:繫結路徑 
$ docker run -d -p 8080:8080 --name tomcat01 
-v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test 
-v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/l
5、訪問測試
$ docker exec -it 自定義容器的id /bin/bash

$ cul localhost:8080
6、釋出專案

(由於做了卷掛載,我們直接在本地編寫專案就可以釋出了!)

發現:專案部署成功,可以直接訪問!

我們以後開發的步驟:需要掌握Dockerfile的編寫!我們之後的一切都是使用docker映象來發布執行!

釋出自己的映象

釋出到 Docker Hub

1、地址 https://hub.docker.com/

2、確定這個賬號可以登入

3、登入

$ docker login --help
Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

$ docker login -u 你的使用者名稱 -p 你的密碼

4、提交 push映象

# 會發現push不上去,因為如果沒有字首的話預設是push到 官方的library
# 解決方法:
# 第一種 build的時候新增你的dockerhub使用者名稱,然後在push就可以放到自己的倉庫了
$ docker build -t kuangshen/mytomcat:0.1 .

# 第二種 使用docker tag #然後再次push
$ docker tag 容器id kuangshen/mytomcat:1.0 #然後再次push
$ docker push kuangshen/mytomcat:1.0

釋出到 阿里雲映象服務上,看官網 很詳細https://cr.console.aliyun.com/repository/

$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]

# 修改id 和 版本
sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0
# 修改版本
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]

Docker網路

三個網路

問題: docker 是如果處理容器網路訪問的?

# 測試  執行一個tomcat
$ docker run -d -P --name tomcat01 tomcat

# 檢視容器內部網路地址
$ docker exec -it 容器id ip addr

# 發現容器啟動的時候會得到一個 eth0@if91 ip地址,docker分配!
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
261: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

       
# 思考? linux能不能ping通容器內部! 可以 容器內部可以ping通外界嗎? 可以!
$ ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.074 ms

原理

1、我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要按照了docker,就會有一個docker0橋接模式,使用的技術是veth-pair技術!

https://www.cnblogs.com/bakari/p/10613710.html

再次測試 ip addr

容器資料卷

什麼是容器資料卷

將應用和環境打包成一個映象!

資料?如果資料都在容器中,那麼我們容器刪除,資料就會丟失!需求:資料可以持久化

MySQL,容器刪除了,刪庫跑路!需求:MySQL資料可以儲存在本地!

容器之間可以有一個數據共享的技術!Docker容器中產生的資料,同步到本地!

這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linux上面!

總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的!

使用資料卷

方式一 :直接使用命令掛載 -v

-v, --volume list                    Bind mount a volume

docker run -it -v 主機目錄:容器內目錄  -p 主機埠:容器內埠
# /home/ceshi:主機home目錄下的ceshi資料夾  對映:centos容器中的/home
[root@iz2zeak7 home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#這時候主機的/home/ceshi資料夾就和容器的/home資料夾關聯了,二者可以實現檔案或資料同步了

#通過 docker inspect 容器id 檢視
[root@iz2zeak7sgj6i7hrb2g862z home]# docker inspect 6064c490c371
123456789

測試檔案的同步

再來測試!

1、停止容器

2、宿主機修改檔案

3、啟動容器

4、容器內的資料依舊是同步的

好處:我們以後修改只需要在本地修改即可,容器內會自動同步!

實戰:安裝MySQL

思考:MySQL的資料持久化的問題

# 獲取mysql映象
[root@iz2zeak7sgj6i7hrb2g862z home]# docker pull mysql:5.7

# 執行容器,需要做資料掛載 #安裝啟動mysql,需要配置密碼的,這是要注意點!
# 參考官網hub 
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#啟動我們得
-d 後臺執行
-p 埠對映
-v 卷掛載
-e 環境配置
-- name 容器名字
$ docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7

# 啟動成功之後,我們在本地使用sqlyog來測試一下
# sqlyog-連線到伺服器的3306--和容器內的3306對映 

# 在本地測試建立一個數據庫,檢視一下我們對映的路徑是否ok!
12345678910111213141516171819

測試連線:注意3310埠要在阿里雲伺服器的安全組中開啟,否則無法連線。

當我們在本地用SQLyog新建名稱為test的資料庫時候,容器容器也會建立

假設我們將包含mysql的容器刪除時,

發現,我們掛載到本地的資料卷依舊沒有丟失,這就實現了容器資料持久化功能

具名和匿名掛載

# 匿名掛載
-v 容器內路徑!
$ docker run -d -P --name nginx01 -v /etc/nginx nginx

# 檢視所有的volume(卷)的情況
$ docker volume ls    
DRIVER              VOLUME NAME # 容器內的卷名(匿名卷掛載)
local               21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0
local               b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c
         
# 這裡發現,這種就是匿名掛載,我們在 -v只寫了容器內的路徑,沒有寫容器外的路徑!

# 具名掛載 -P:表示隨機對映埠
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee

# 檢視所有的volume(卷)的情況
$ docker volume ls                  
DRIVER              VOLUME NAME
local               21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0
local               b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c
local               juming-nginx #多了一個名字


# 通過 -v 卷名:檢視容器內路徑
# 檢視一下這個卷
$ docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-05-23T13:55:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #預設目錄
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
1234567891011121314151617181920212223242526272829303132333435363738

所有的docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/自定義的卷名/_data下,
如果指定了目錄,docker volume ls 是檢視不到的

區分三種掛載方式

# 三種掛載: 匿名掛載、具名掛載、指定路徑掛載
-v 容器內路徑			#匿名掛載
-v 卷名:容器內路徑		  #具名掛載
-v /宿主機路徑:容器內路徑 #指定路徑掛載 docker volume ls 是檢視不到的
1234

拓展:

# 通過 -v 容器內路徑: ro rw 改變讀寫許可權
ro #readonly 只讀
rw #readwrite 可讀可寫
$ docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
$ docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!
1234567

初始Dockerfile

Dockerfile 就是用來構建docker映象的構建檔案!命令指令碼!先體驗一下!

通過這個指令碼可以生成映象,映象是一層一層的,指令碼是一個個的命令,每個命令都是一層!

# 建立一個dockerfile檔案,名字可以隨便 建議Dockerfile
# 檔案中的內容: 指令(大寫) + 引數
$ vim dockerfile1
    FROM centos 					# 當前這個映象是以centos為基礎的

    VOLUME ["volume01","volume02"] 	# 掛載卷的卷目錄列表(多個目錄)

    CMD echo "-----end-----"		# 輸出一下用於測試
    CMD /bin/bash					# 預設走bash控制檯

# 這裡的每個命令,就是映象的一層!
# 構建出這個映象 
-f dockerfile1 			# f代表file,指這個當前檔案的地址(這裡是當前目錄下的dockerfile1)
-t caoshipeng/centos 	# t就代表target,指目標目錄(注意caoshipeng映象名前不能加斜槓‘/’)
. 						# 表示生成在當前目錄下
$ docker build -f dockerfile1 -t caoshipeng/centos .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
8a29a15cefae: Already exists 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"] 			# 卷名列表
 ---> Running in c18eefc2c233
Removing intermediate container c18eefc2c233
 ---> 623ae1d40fb8
Step 3/4 : CMD echo "-----end-----"					# 輸出 指令碼命令
 ---> Running in 70e403669f3c
Removing intermediate container 70e403669f3c
 ---> 0eba1989c4e6
Step 4/4 : CMD /bin/bash
 ---> Running in 4342feb3a05b
Removing intermediate container 4342feb3a05b
 ---> f4a6b0d4d948
Successfully built f4a6b0d4d948
Successfully tagged caoshipeng/centos:latest

# 檢視自己構建的映象
$ docker images
REPOSITORY          TAG          IMAGE ID            CREATED              SIZE
caoshipeng/centos   latest       f4a6b0d4d948        About a minute ago   237MB
123456789101112131415161718192021222324252627282930313233343536373839404142

啟動自己寫的容器映象

$ docker run -it f4a6b0d4d948 /bin/bash	# 執行自己寫的映象
$ ls -l 								# 檢視目錄
12

這個卷和外部一定有一個同步的目錄

檢視一下卷掛載

# docker inspect 容器id
$ docker inspect ca3b45913df5
12

測試一下剛才的檔案是否同步出去了!

這種方式使用的十分多,因為我們通常會構建自己的映象!

假設構建映象時候沒有掛載卷,要手動映象掛載 -v 卷名:容器內路徑!

資料卷容器

多個MySQL同步資料

命名的容器掛載資料卷!

# 測試 啟動3個容器,通過剛才自己寫的映象啟動
# 建立docker01:因為我本機是最新版,故這裡用latest,狂神老師用的是1.0如下圖
$ docker run -it --name docker01 caoshipeng/centos:latest

# 檢視容器docekr01內容
$ ls
bin  home   lost+found	opt   run   sys  var
dev  lib    media	proc  sbin  tmp  volume01
etc  lib64  mnt		root  srv   usr  volume02

# 不關閉該容器退出
CTRL + Q + P  

# 建立docker02: 並且讓docker02 繼承 docker01
$ docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest

# 檢視容器docker02內容
$ ls
bin  home   lost+found	opt   run   sys  var
dev  lib    media	proc  sbin  tmp  volume01
etc  lib64  mnt		root  srv   usr  volume02
123456789101112131415161718192021
# 再新建一個docker03同樣繼承docker01
$ docker run -it --name docker03 --volumes-from docker01 caoshipeng/centos:latest
$ cd volume01	#進入volume01 檢視是否也同步docker01的資料
$ ls 
docker01.txt

# 測試:可以刪除docker01,檢視一下docker02和docker03是否可以訪問這個檔案
# 測試發現:資料依舊保留在docker02和docker03中沒有被刪除
12345678

多個mysql實現資料共享

$ 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:5.7

$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7

# 這個時候,可以實現兩個容器資料同步!
12345

結論:

容器之間的配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止

但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的

DockerFile

DockerFile介紹

dockerfile是用來構建docker映象的檔案!命令引數指令碼!

構建步驟:

1、 編寫一個dockerfile檔案

2、 docker build 構建稱為一個映象

3、 docker run執行映象

4、 docker push釋出映象(DockerHub 、阿里雲倉庫)

點選後跳到一個Dockerfile

很多官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!

官方既然可以製作映象,那我們也可以!

DockerFile構建過程

基礎知識

1、每個保留關鍵字(指令)都是必須是大寫字母

2、執行從上到下順序

3、#表示註釋

4、每一個指令都會建立提交一個新的映象層,並提交!

Dockerfile是面向開發的,我們以後要釋出專案,做映象,就需要編寫dockerfile檔案,這個檔案十分簡單!

Docker映象逐漸成企業交付的標準,必須要掌握!

DockerFile:構建檔案,定義了一切的步驟,原始碼

DockerImages:通過DockerFile構建生成的映象,最終釋出和執行產品。

Docker容器:容器就是映象執行起來提供服務。

DockerFile的指令

FROM				# from:基礎映象,一切從這裡開始構建
MAINTAINER			# maintainer:映象是誰寫的, 姓名+郵箱
RUN					# run:映象構建的時候需要執行的命令
ADD					# add:步驟,tomcat映象,這個tomcat壓縮包!新增內容 新增同目錄
WORKDIR				# workdir:映象的工作目錄
VOLUME				# volume:掛載的目錄
EXPOSE				# expose:保留埠配置
CMD					# cmd:指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代
ENTRYPOINT			# entrypoint:指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD				# onbuild:當構建一個被繼承DockerFile這個時候就會執行onbuild的指令,觸發指令
COPY				# copy:類似ADD,將我們檔案拷貝到映象中
ENV					# env:構建的時候設定環境變數!
123456789101112

實戰測試

scratch 映象

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200504" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-05-04 00:00:00+01:00"

CMD ["/bin/bash"]
123456789101112131415

Docker Hub 中 99%的映象都是從這個基礎映象過來的 FROM scratch,然後配置需要的軟體和配置來進行構建。

建立一個自己的centos

# 1./home下新建dockerfile目錄
$ mkdir dockerfile

# 2. dockerfile目錄下新建mydockerfile-centos檔案
$ vim mydockerfile-centos

# 3.編寫Dockerfile配置檔案
FROM centos							# 基礎映象是官方原生的centos
MAINTAINER cao<[email protected]> 	# 作者

ENV MYPATH /usr/local				# 配置環境變數的目錄 
WORKDIR $MYPATH						# 將工作目錄設定為 MYPATH

RUN yum -y install vim				# 給官方原生的centos 增加 vim指令
RUN yum -y install net-tools		# 給官方原生的centos 增加 ifconfig命令

EXPOSE 80							# 暴露埠號為80

CMD echo $MYPATH					# 輸出下 MYPATH 路徑
CMD echo "-----end----"				
CMD /bin/bash						# 啟動後進入 /bin/bash

# 4.通過這個檔案構建映象
# 命令: docker build -f 檔案路徑 -t 映象名:[tag] .
$ docker build -f mydockerfile-centos -t mycentos:0.1 .

# 5.出現下圖後則構建成功
123456789101112131415161718192021222324252627
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            0.1                 cbf5110a646d        2 minutes ago       311MB

# 6.測試執行
$ docker run -it mycentos:0.1 		# 注意帶上版本號,否則每次都回去找最新版latest

$ pwd	
/usr/local							# 與Dockerfile檔案中 WORKDIR 設定的 MYPATH 一致
$ vim								# vim 指令可以使用
$ ifconfig     						# ifconfig 指令可以使用

# docker history 映象id 檢視映象構建歷史步驟
$ docker history 映象id
1234567891011121314

我們可以列出本地進行的變更歷史

我們平時拿到一個映象,可以用 “docker history 映象id” 研究一下是什麼做的

CMD 和 ENTRYPOINT區別

CMD					# 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代。
ENTRYPOINT			# 指定這個容器啟動的時候要執行的命令,可以追加命令
12

測試cmd

# 編寫dockerfile檔案
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]					# 啟動後執行 ls -a 命令

# 構建映象
$ docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .

# 執行映象
$ docker run cmd-test:0.1		# 由結果可得,執行後就執行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home

# 想追加一個命令  -l 成為ls -al:展示列表詳細資料
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

# cmd的情況下 -l 替換了CMD["ls","-l"] 而 -l  不是命令所以報錯
12345678910111213141516171819202122232425

測試ENTRYPOINT

# 編寫dockerfile檔案
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

# 構建映象
$ docker build  -f dockerfile-test-entrypoint -t cmd-test:0.1 .

# 執行映象
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...

# 我們的命令,是直接拼接在我們得ENTRYPOINT命令後面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....

12345678910111213141516171819202122232425262728293031323334

Dockerfile中很多命令都十分的相似,我們需要了解它們的區別,我們最好的學習就是對比他們然後測試效果!

實戰:Tomcat映象

1、準備映象檔案
準備tomcat 和 jdk 到當前目錄,編寫好README
1
2、編寫dokerfile
$ vim dockerfile
FROM centos 										# 基礎映象centos
MAINTAINER cao<[email protected]>					# 作者
COPY README /usr/local/README 						# 複製README檔案
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ 			# 新增jdk,ADD 命令會自動解壓
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ 		# 新增tomcat,ADD 命令會自動解壓
RUN yum -y install vim								# 安裝 vim 命令
ENV MYPATH /usr/local 								# 環境變數設定 工作目錄
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_231 				# 環境變數: JAVA_HOME環境變數
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 	# 環境變數: tomcat環境變數
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35

# 設定環境變數 分隔符是:
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin 	

EXPOSE 8080 										# 設定暴露的埠

CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out 					# 設定預設命令

1234567891011121314151617181920212223
3、構建映象
# 因為dockerfile命名使用預設命名 因此不用使用-f 指定檔案
$ docker build -t mytomcat:0.1 .
12
4、run映象
# -d:後臺執行 -p:暴露埠 --name:別名 -v:繫結路徑 
$ docker run -d -p 8080:8080 --name tomcat01 
-v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test 
-v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
1234
5、訪問測試
$ docker exec -it 自定義容器的id /bin/bash

$ cul localhost:8080
123
6、釋出專案

(由於做了卷掛載,我們直接在本地編寫專案就可以釋出了!)

發現:專案部署成功,可以直接訪問!

我們以後開發的步驟:需要掌握Dockerfile的編寫!我們之後的一切都是使用docker映象來發布執行!

釋出自己的映象

釋出到 Docker Hub

1、地址 https://hub.docker.com/

2、確定這個賬號可以登入

3、登入

$ docker login --help
Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

$ docker login -u 你的使用者名稱 -p 你的密碼
123456789101112

4、提交 push映象

# 會發現push不上去,因為如果沒有字首的話預設是push到 官方的library
# 解決方法:
# 第一種 build的時候新增你的dockerhub使用者名稱,然後在push就可以放到自己的倉庫了
$ docker build -t kuangshen/mytomcat:0.1 .

# 第二種 使用docker tag #然後再次push
$ docker tag 容器id kuangshen/mytomcat:1.0 #然後再次push
$ docker push kuangshen/mytomcat:1.0
12345678

釋出到 阿里雲映象服務上

看官網 很詳細https://cr.console.aliyun.com/repository/

$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]

# 修改id 和 版本
sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0
# 修改版本
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[映象版本號]
1234567

小結


Docker 網路

理解Docker 0

學習之前清空下前面的docker 映象、容器

# 刪除全部容器
$ docker rm -f $(docker ps -aq)

# 刪除全部映象
$ docker rmi -f $(docker images -aq)
12345

測試

三個網路

問題: docker 是如果處理容器網路訪問的?

# 測試  執行一個tomcat
$ docker run -d -P --name tomcat01 tomcat

# 檢視容器內部網路地址
$ docker exec -it 容器id ip addr

# 發現容器啟動的時候會得到一個 eth0@if91 ip地址,docker分配!
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
261: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

       
# 思考? linux能不能ping通容器內部! 可以 容器內部可以ping通外界嗎? 可以!
$ ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.074 ms
1234567891011121314151617181920212223

原理

1、我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要按照了docker,就會有一個docker0橋接模式,使用的技術是veth-pair技術!

https://www.cnblogs.com/bakari/p/10613710.html

再次測試 ip addr

2 、再啟動一個容器測試,發現又多了一對網路

# 我們發現這個容器帶來網絡卡,都是一對對的
# veth-pair 就是一對的虛擬裝置介面,他們都是成對出現的,一端連著協議,一端彼此相連
# 正因為有這個特性 veth-pair 充當一個橋樑,連線各種虛擬網路裝置的
# OpenStack,Docker容器之間的連線,OVS的連線,都是使用veth-pair技術

3、我們來測試下tomcat01和tomcat02是否可以ping通

# 獲取tomcat01的ip 172.17.0.2
$ docker-tomcat docker exec -it tomcat01 ip addr  
550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
# 讓tomcat02 ping tomcat01       
$ docker-tomcat docker exec -it tomcat02 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.098 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms

# 結論:容器和容器之間是可以互相ping通

網路模型圖

結論:tomcat01和tomcat02公用一個路由器,docker0。

所有的容器不指定網路的情況下,都是docker0路由的,docker會給我們的容器分配一個預設的可用ip。

小結

Docker使用的是Linux的橋接,宿主機是一個Docker容器的網橋 docker0

Docker中所有網路介面都是虛擬的,虛擬的轉發效率高(內網傳遞檔案)

只要容器刪除,對應的網橋一對就沒了!

思考一個場景:我們編寫了一個微服務,database url=ip: 專案不重啟,資料ip換了,我們希望可以處理這個問題,可以通過名字來進行訪問容器?

$ docker exec -it tomcat02 ping tomca01   # ping不通
ping: tomca01: Name or service not known

# 執行一個tomcat03 --link tomcat02 
$ docker run -d -P --name tomcat03 --link tomcat02 tomcat
5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef

# 3連線2
# 用tomcat03 ping tomcat02 可以ping通
$ docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms

# 2連線3
# 用tomcat02 ping tomcat03 ping不通

探究:

docker network inspect 網路id 網段相同

docker inspect tomcat03

檢視tomcat03裡面的/etc/hosts發現有tomcat02的配置

–link 本質就是在hosts配置中新增對映

現在使用Docker已經不建議使用–link了!

自定義網路,不適用docker0!

docker0問題:不支援容器名連線訪問!

自定義網路

docker network
connect     -- Connect a container to a network
create      -- Creates a new network with a name specified by the
disconnect  -- Disconnects a container from a network
inspect     -- Displays detailed information on a network
ls          -- Lists all the networks created by the user
prune       -- Remove all unused networks
rm          -- Deletes one or more networks

檢視所有的docker網路

網路模式

bridge :橋接 docker(預設,自己建立也是用bridge模式)

none :不配置網路,一般不用

host :和所主機共享網路

container :容器網路連通(用得少!侷限很大)

測試

# 我們直接啟動的命令 --net bridge,而這個就是我們得docker0
# bridge就是docker0
$ docker run -d -P --name tomcat01 tomcat
等價於 => docker run -d -P --name tomcat01 --net bridge tomcat

# docker0,特點:預設,域名不能訪問。 --link可以打通連線,但是很麻煩!
# 我們可以 自定義一個網路
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.
$ docker network inspect mynet;

啟動兩個tomcat,再次檢視網路情況

在自定義的網路下,服務可以互相ping通,不用使用–link

我們自定義的網路docker當我們維護好了對應的關係,推薦我們平時這樣使用網路!

好處:

redis -不同的叢集使用不同的網路,保證叢集是安全和健康的

mysql-不同的叢集使用不同的網路,保證叢集是安全和健康的

網路連通

# 測試兩個不同的網路連通  再啟動兩個tomcat 使用預設網路,即docker0
$ docker run -d -P --name tomcat01 tomcat
$ docker run -d -P --name tomcat02 tomcat
# 此時ping不通
# 要將tomcat01 連通 tomcat—net-01 ,連通就是將 tomcat01加到 mynet網路
# 一個容器兩個ip(tomcat01)
# 01連通 ,加入後此時,已經可以tomcat01 和 tomcat-01-net ping通了
# 02是依舊不通的

結論:假設要跨網路操作別人,就需要使用docker network connect 連通!

實戰:部署Redis叢集

# 建立網絡卡
docker network create redis --subnet 172.38.0.0/16
# 通過指令碼建立六個redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

    # 通過指令碼執行六個redis
    for port in $(seq 1 6);\
    do
    docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \
    -v /mydata/redis/node-${port}/data:/data \
    -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    docker exec -it redis-1 /bin/sh #redis預設沒有bash
    done
docker exec -it redis-1 /bin/sh #redis預設沒有bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379  --cluster-replicas 1

docker搭建redis叢集完成!


SpringBoot微服務打包Docker映象

1、構建SpringBoot專案

2、打包執行

mvn package

3、編寫dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

4、構建映象

# 1.複製jar和DockerFIle到伺服器
# 2.構建映象
$ docker build -t xxxxx:xx  .

5、釋出執行

以後我們使用了Docker之後,給別人交付就是一個映象即可!