1. 程式人生 > 其它 >docker狂神筆記

docker狂神筆記

技術標籤:docker

一、架構

客戶端 - 伺服器 - 倉庫

映象(image)

模板,可以通過模板建立容器服務。 映象 =》run =》 容器,可以執行多個容器

容器(container

獨立執行一個或一組應用,通過映象建立

基本命令:啟動,停止,刪除

理解為一個簡易的linux系統

倉庫(repository)

存放映象的地方

分為公有倉庫和私有倉庫

公有倉庫

官方:Docker Hub

阿里雲…都有容器伺服器(配置映象加速)

二、作業

  1. 部署nginx

    ​ Search

    ​ Pull

    ​ Run -p 3344:80 埠對映

  2. Tomcat

    ​ Docker run -it --rm tomcat:9.0

    ​ --rm用完即刪,用於測試

  3. ES + Kibana

三、視覺化

四、docker映象載入原理

聯合檔案系統,一層一層載入,底層可以複用。加快docker載入速度

五、映象分層原理

pull的時候分層下載,已有的層不再下載。加速下載

六、如何提交自己的映象

Docker commit 提交容器成為一個新的副本

Docker commit -m=“提交的描述資訊” -a=“作者” 容器id:[tag]

七、容器資料卷

什麼是容器資料卷

需求:資料持久化,資料可以存在本地

不會發生刪了docker,資料也沒了的情況

方式:目錄掛載,資料同步機制

ps:容器間也可以資料共享

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

docker run -it -v 主機目錄:容器目錄

即使容器停止了,同步也是進行的

好處:修改配置只要再本地就可以,不用進入容器

實戰:安裝MySQL

https://hub.docker.com/_/mysql

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d  mysql

方式二:已有容器掛載

法一:修改配置檔案(需停止docker服務)
1、停止docker服務
systemctl stop docker.service(關鍵,修改之前必須停止docker服務)

2、vim /var/lib/docker/containers/container-ID/config.v2.json
修改配置檔案中的目錄位置,然後儲存退出

 "MountPoints":{"/home":{"Source":"/docker","Destination":"/home","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"//docker/","Target":"/home"}}}
1

3、啟動docker服務
systemctl start docker.service
4、啟動docker容器
docker start <container-name/ID>
法二:提交現有容器為新映象,然後重新執行它

$ docker ps  -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                          PORTS               NAMES
   5a3422adeead        ubuntu:14.04          "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       agitated_newton
$ docker commit 5a3422adeead newimagename
$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
12345

然後停止舊容器,並使用這個新容器,如果由於某種原因需要新容器使用舊名稱,請在刪除舊容器後使用docker rename。
法三:export容器為映象,然後import為新映象

$docker container export -o ./myimage.docker 容器ID
$docker import ./myimage.docker newimagename
$docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
123

然後停止舊容器,並使用這個新容器,如果由於某種原因需要新容器使用舊名稱,請在刪除舊容器後使用docker rename。

方式三:dockerfile掛載

用來構建docker映象的構建檔案:命令指令碼

# 建立一個dockerfile檔案
# 檔案中的內容 指令大寫 一層一層
FROM centos

# 生成映象的方式掛載
# 匿名掛載,掛載到一個隨機目錄去了,一般在docker的volume中,用docker inspect看
VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

方式四:資料卷容器

容器之間資料同步:linux的硬連結,刪一個容器其他的還有資料

image-20201117192824036
docker run -it -d --name docker01 kuangshen/centos:1.0

docker run -it -d --name docker02 --volumes-from docker 01 kuangshen/centos:1.0

結論:

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

八、DockerFile

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

構建步驟:

  1. 編寫一個dockerfile檔案
  2. docker build構建成為一個映象
  3. docker run執行映象
  4. docker push釋出映象(dockerhub、阿里雲映象倉庫)

centos7官方dockerfile

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="20201113" \
    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-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

Dockerfile構建過程

基礎知識

  1. 每個保留關鍵字(指令)都是大寫字母
  2. 執行從上到下順序執行
  3. #表示註釋
  4. 每一個指令都會建立提交一個新的映象層,並提交
image-20201117194554610

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

docker映象逐漸成為企業交付的標準,微服務

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

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

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

DockerFile指令

FROM			# 基礎映象
MAINTAINER		# 映象是誰寫的,姓名郵箱
RUN				# 映象構建的時候需要執行的命令
ADD				# 步驟,tomcat映象,這個tomcat壓縮包,新增內容
WORKDIR			# 映象的工作目錄
VOLUME			# 掛載的目錄
EXPOSE			# 暴露埠配置

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

ONBUILD			# 當構建一個被繼承 DockerFile 這個時候就會執行 ONBUILD 的指令,觸發指令
COPY			# 類似add,將檔案拷貝到映象中
ENV				# 構建的時候設定環境變數

CMD和ENTRYPOINT的區別

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

測試

[[email protected] dockerfile]# cat testcmd 
FROM centos:7

CMD ["ls","-a"]

[[email protected] dockerfile]# docker build -f testcmd -t cmdtest .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 586c8704a6cb
Removing intermediate container 586c8704a6cb
 ---> 74aecdefe1f3
Successfully built 74aecdefe1f3
Successfully tagged cmdtest:latest

[[email protected] dockerfile]# docker run 74aecdefe1f3
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
。。。

# 想追加命令,是替換的關係,要加上完整的命令
[[email protected] dockerfile]# docker run 74aecdefe1f3 ls -al
total 12
drwxr-xr-x   1 root root     6 Nov 18 02:30 .
...
lrwxrwxrwx   1 root root     7 Nov 13 01:53 bin -> usr/bin
drwxr-xr-x   5 root root   340 Nov 18 02:30 dev
drwxr-xr-x   1 root root    66 Nov 18 02:30 etc
drwxr-xr-x   2 root root     6 Apr 11  2018 home
lrwxrwxrwx   1 root root     7 Nov 13 01:53 lib -> usr/lib

# 而ENTRYPOINT可以直接追加-l
[[email protected] dockerfile]# docker run 4cff74726897 -l
total 12
drwxr-xr-x   1 root root     6 Nov 18 02:33 .
drwxr-xr-x   1 root root     6 Nov 18 02:33 ..
-rwxr-xr-x   1 root root     0 Nov 18 02:33 .dockerenv
...
drwxr-xr-x  13 root root   155 Nov 13 01:53 usr
drwxr-xr-x  18 root root   238 Nov 13 01:54 var

實戰測試:Tomcat映象

  1. 準備映象檔案tomcat壓縮包,jdk壓縮包

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UzB5XWXH-1609146485036)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118111730541.png)]

  2. 編寫dockerfile檔案,官方命名Dockerfile,build會自動尋找這個檔案,就不需要-f指定了

FROM centos:7
MAINTAINER swordsj<[email protected]>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib;$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.39/bin/logs/catalina.out
  1. 構建映象
docker build -t diytomcat .
  1. 建立容器
docker run -d -p 9090:8080 --name sjtomcat -v /home/swordsj/build/tomcat/test:/usr/local/apache-tomcat-9.0.39/webapps/test -v /home/swordsj/build/tomcat/logs/:/usr/local/apache-tomcat-9.0.39/logs diytomcat
  1. 訪問測試

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GM3tsCeK-1609146485045)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118112853026.png)]

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

web.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<web-app 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 			xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 	
			xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
			id="WebApp_ID" 
			version="2.5">

</web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>首頁</title>
</head>
<body>
    <div class="header">
        <div class="logo">web實踐</div>
    </div>
</body>
</html>

釋出自己的映象

  1. 地址https://hub.docker.com/ 註冊自己的賬號
  2. 確定這個賬號可以應用
  3. 在伺服器上提交自己的映象
# 登入docker

[[email protected] test]# 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
  1. 登入完畢,push映象
# push前要用tag命令修改為規範的映象,名字對應賬號名稱
docker tag 映象id swordsj/tomcat:1.0

docker push swordsj/diytomcat:1.0

釋出到阿里雲映象服務

  1. 登入阿里雲
  2. 找到容器映象服務
  3. 建立名稱空間,映象倉庫,選公有或私有,本地倉庫
  4. 建立容器映象
  5. 瀏覽阿里雲 官方文件

九、docker全流程總結

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2R0c2mju-1609146485046)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118154649746.png)]

十、docker網路

理解Docker0

清空所有環境

[[email protected] ~]# ip addr

## 本機迴環地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
       
## 內網地址
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d9:58:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.174.12/24 brd 192.168.174.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::fbb9:7fc1:3ea6:605b/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::4f59:682b:a7c0:8077/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::452c:7ad9:a88d:11cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
       
## docker地址,172.17.0.1是docker閘道器地址
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:c3:77:d2:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

三個網路

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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-vFc2QnO7-1609146485048)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118161318162.png)]

docker run -d -P --name tomcat01 tomcat

# 檢視容器的內部網路地址  容器的 ip addr

[[email protected] ~]# docker exec -it d48 ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
       
# docker分配的ip地址
4: [email protected]: <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 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

# 思考linux能不能ping通這個eth0,如果能ping通就能互動
[[email protected] ~]# 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.134 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.083 ms

# linux 可以ping通容器內部

原理

  1. 我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝了docker,就會有一個網絡卡docker0

    橋接模式,使用的技術是veth-pair技術

    再次測試ip addr,發現多了一個網絡卡

    5: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 0e:08:32:0b:19:0f brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet6 fe80::c08:32ff:fe0b:190f/64 scope link 
           valid_lft forever preferred_lft forever
    
  2. 再啟動一個容器測試,發現又多了一對網絡卡

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-krBhV1PG-1609146485049)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118162846503.png)]

    # 我們發現這個容器帶來的網絡卡,都是一對一對的
    # veth-pair 就是一對的虛擬裝置介面,他們都是成對出現的,一端連著協議,一端彼此相連
    # 正因為有這個特性,veth-pair 充當一個橋樑
    # OpenStac,Docker容器之間的連線,OVS的連線,都是使用veth-pair技術
    
  3. 我們來測試一下tomcat01和tomcat02能不能互相ping通,可以ping通,是一樣的

    [[email protected] ~]# docker exec -it tomcat01 ping 172.17.0.3
    PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
    64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.100 ms
    64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.058 ms
    

網路模型原理圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-mOjQiiLr-1609146485050)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118163855819.png)]

結論:tomcat01和tomcat02共用一個路由器docker0

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

255.255.0.1/16 大的公司255.255.0.1/24 域 區域網 小教室
00000000,00000000,00000000,0000000000000000,00000000,00000000,00000000
255,255,255,255255,255,255,255
能放 255*255 - 0.0.0.0 - 255.255 = 65535能放 255 - 0.0.0.0 - 255.255 = 253

小結

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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UxN8MACW-1609146485051)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118164914092.png)]

Docker中所有的網路介面都是虛擬的

虛擬的轉發效率高(內網傳遞檔案)

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

–link

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

docker提供了 --link 來解決這個問題

# 用名字不能ping通
[[email protected] ~]# docker exec -it tomcat01 ping tomcat01
ping: tomcat01: Name or service not known

# 如何解決  通過 --link
[[email protected] ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
166999b991036e5bda28d201d6ff933da43a3cedd134a205ce9aad26f2793c7d

[[email protected] ~]# 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.144 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.090 ms

# 反向ping呢? tomcat02 ping tomcat03  ping不通
[[email protected] ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

探究

[[email protected] ~]# docker inspect tomcat03

...
"Links": [
                "/tomcat02:/tomcat03/tomcat02"
            ],
...


# 而tomcat02 ping 不到 tomcat03 原因:單向繫結
[[email protected] ~]# docker inspect tomcat02

...
"Links": null,
...

# 原理:link直接再tomcat03的/etc/hosts檔案裡綁定了tomcat02的內網地址
[email protected]:/etc# cat /etc/hosts

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	tomcat02 f98b8581b4e9
172.17.0.4	166999b99103

# 所以要雙向繫結的話只要改tomcat02的hosts檔案,新增tomcat03的對映就可以了

我們現在玩Docker已經不建議使用–link了

自定義網路,不適用docker0

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

自定義網路

檢視所有的docker網路

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb13300e74b0        bridge              bridge              local
eeafa2335fe6        host                host                local
32c302a596c0        none                null                local  

網路模式

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

none:不配置網路

host:和宿主機共享網路

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

測試

# 自定義網路
# --driver bridge 			橋接
# --subnet 192.168.0.0/24 	子網   最大支援 192.168.0.2 - 192.168.0.255
# --gateway 192.168.0.1 	閘道器
[[email protected] ~]# docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet
4d0de2d1b9ee851d7c951793e0392f75a4d59e5eb03ac36159762760cb455d6d

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb13300e74b0        bridge              bridge              local
eeafa2335fe6        host                host                local
4d0de2d1b9ee        mynet               bridge              local
32c302a596c0        none                null                local

我們自己的網路就建立好了

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ePSs6pwK-1609146485051)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118194832403.png)]

[[email protected] ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "4d0de2d1b9ee851d7c951793e0392f75a4d59e5eb03ac36159762760cb455d6d",
        "Created": "2020-10-22T22:37:42.976495365+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "a1b0900ed55d6343ec8a03b00bc3bb342154e04f95fd135690066cfb3e433307": {
                "Name": "tomcat-net-01",
                "EndpointID": "1771fd8a151cd4142bb5afa4ad3f797982ee729830c22a3d0c05488e11123634",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/24",
                "IPv6Address": ""
            },
            "c915c5e53e472142b92d93d9cca8840e887609f158c3143b78ccf00458a32232": {
                "Name": "tomcat-net-02",
                "EndpointID": "89e045c5167ee40c8512b6ec36e2ac17522f828512f250894aab11b486e3b086",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 這時候就支援container互相ping了,docker0沒有這個功能

[[email protected] ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.054 ms

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

好處:不同的叢集使用不同的網路,保證叢集是安全和健康的

網路聯通

# 把在docker0網路下的tomcat01 連線到mynet
[[email protected] ~]# docker network connect mynet tomcat01

[[email protected] ~]# docker network  inspect mynet
[
    {
        "Name": "mynet",
        "Id": "4d0de2d1b9ee851d7c951793e0392f75a4d59e5eb03ac36159762760cb455d6d",
        "Created": "2020-10-22T22:37:42.976495365+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "291533f225f79e1a714cc2de7e5590795b876eea7eadc3078024d9ac8ff9c61f": {
                "Name": "tomcat01",
                "EndpointID": "0400e3cef0fb9b62a81330ae8b5c503accdab37f11b74095575e598feb4499c3",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/24",
                "IPv6Address": ""
            },
            "a1b0900ed55d6343ec8a03b00bc3bb342154e04f95fd135690066cfb3e433307": {
                "Name": "tomcat-net-01",
                "EndpointID": "1771fd8a151cd4142bb5afa4ad3f797982ee729830c22a3d0c05488e11123634",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/24",
                "IPv6Address": ""
            },
            "c915c5e53e472142b92d93d9cca8840e887609f158c3143b78ccf00458a32232": {
                "Name": "tomcat-net-02",
                "EndpointID": "89e045c5167ee40c8512b6ec36e2ac17522f828512f250894aab11b486e3b086",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 結果:tomcat01可以ping通 tomcat-net-01
[[email protected] ~]# docker exec -it tomcat01 ping tomcat-net-01

PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.077 ms

一個容器兩個ip

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-dhlnthXS-1609146485052)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118202144108.png)]

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

實戰:部署Redis叢集

分片 + 高可用 + 負載均衡

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-pYSlkG2J-1609146485053)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118202500653.png)]

shell指令碼啟動

# 網絡卡
docker network create redis --subnet 172.38.0.0/16

# shell指令碼建立redis叢集
[[email protected] ~]# 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-enabledro 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

# 啟動容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

十一、SpringBoot微服務打包Docker映象

  1. 構建springboot專案

  2. 打包應用

  3. 編寫dockerfile(在idea載入docker外掛,可以又dockerfile高亮和提示)

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

    docker build -t swordsj .
    
  5. 釋出執行

    docker docker run -d -P --name sword-springboot-web swordsj
    

    發給別人的時候上傳到映象倉庫即可

十二、企業實戰

如果有很多映象 100個,分別啟動,維護很麻煩

Docker Compose


簡介

100個微服務,依賴關係

不能手動執行,通過Docker Compose來高效管理,定義執行多個容器

官方介紹

定義、執行多個容器

YAML file配置檔案

single command。命令有哪些?

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
    • Dockerfile 保證專案在任何地方可以執行
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
    • services是什麼服務?
    • docker-compose.yml這個檔案怎麼寫?
  3. Run docker-compose up and Compose starts and runs your entire app.
    • 啟動專案

作用:批量容器編排

自己的理解

Compose是Docker官方的開源專案,需要安裝!

Dockerfile讓程式在任何地方執行

compose

version: "3.8"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose up

Compose:重要的概念

  • 服務services,容器。應用。(web、redis、mysql…)

  • 專案project。一組關聯的容器。部落格:web、mysql、wp

安裝

1、下載

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 國內映象
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/dock

路徑:/usr/local/bin

2、授權

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

3、檢視版本

docker-compose version

出現

image-20201123193952729

安裝成功

ldblk

Docker Swarm

簡單版的k8s

叢集方式的部署、4臺阿里雲伺服器、2核4g

實戰

1、編寫專案微服務 jar包

2、dockerfile構建映象

3、docker-compose.yml 編排專案

4、放到伺服器 docker-compose up

假設專案要重新打包部署

# 重新構建
docker-compose up --build

總結

工程、服務、容器

專案 compose:三層

  • 工程 Project
  • 服務
  • 容器 執行例項 docker k8s 容器

Docker Stack

4臺伺服器搭建叢集:阿里雲、mobaxterm(免費)、虛擬機器

docker-compose 單機部署專案

docker stack部署,叢集部署

# 單機
docker-compose up -d wordpress.yaml
# 叢集
docker-stack up -d wordpress.yaml

yaml例子

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    
    # 叢集
    deploy:
    
      # 副本數
      replicas: 2
      
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

Docker Secret

安全! 配置密碼、證書

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ulW92F6v-1609146485054)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201207203300747.png)]

Docker Config

配置

網上找案例,跑起來試試 // 檢視命令,幫助文件

CI/CD之Jenkins

拓展到K8S

趨勢:雲原生

雲應用 => 下載 => 配置 => 你的網站

Go語言

Docker、K8S是Go開發的

併發語言,語法與C相近,但功能上有:記憶體安全,GC,結構形態及CSP-style併發計算

效率接近於C

入門

基礎語法

高階物件

如何操作資料庫

框架