docker狂神筆記
技術標籤:docker
一、架構
客戶端 - 伺服器 - 倉庫
映象(image)
模板,可以通過模板建立容器服務。 映象 =》run =》 容器,可以執行多個容器
容器(container)
獨立執行一個或一組應用,通過映象建立
基本命令:啟動,停止,刪除
理解為一個簡易的linux系統
倉庫(repository)
存放映象的地方
分為公有倉庫和私有倉庫
公有倉庫
官方:Docker Hub
阿里雲…都有容器伺服器(配置映象加速)
二、作業
-
部署nginx
Search
Pull
Run -p 3344:80 埠對映
-
Tomcat
Docker run -it --rm tomcat:9.0
--rm用完即刪,用於測試
-
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服務)
修改配置檔案中的目錄位置,然後儲存退出
"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的硬連結,刪一個容器其他的還有資料
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映象的檔案,命令引數指令碼
構建步驟:
- 編寫一個dockerfile檔案
- docker build構建成為一個映象
- docker run執行映象
- 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構建過程
基礎知識
- 每個保留關鍵字(指令)都是大寫字母
- 執行從上到下順序執行
- #表示註釋
- 每一個指令都會建立提交一個新的映象層,並提交
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映象
-
準備映象檔案tomcat壓縮包,jdk壓縮包
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UzB5XWXH-1609146485036)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118111730541.png)]
-
編寫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
- 構建映象
docker build -t diytomcat .
- 建立容器
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
- 訪問測試
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GM3tsCeK-1609146485045)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118112853026.png)]
- 釋出專案(由於做了卷掛載,直接在本地編寫專案就可以釋出了)
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>
釋出自己的映象
- 地址https://hub.docker.com/ 註冊自己的賬號
- 確定這個賬號可以應用
- 在伺服器上提交自己的映象
# 登入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
- 登入完畢,push映象
# push前要用tag命令修改為規範的映象,名字對應賬號名稱
docker tag 映象id swordsj/tomcat:1.0
docker push swordsj/diytomcat:1.0
釋出到阿里雲映象服務
- 登入阿里雲
- 找到容器映象服務
- 建立名稱空間,映象倉庫,選公有或私有,本地倉庫
- 建立容器映象
- 瀏覽阿里雲 官方文件
九、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通容器內部
原理
-
我們每啟動一個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
-
再啟動一個容器測試,發現又多了一對網絡卡
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-krBhV1PG-1609146485049)(D:\CourseAndLearn\md學習筆記\SwordSJ\typora-user-images\image-20201118162846503.png)]
# 我們發現這個容器帶來的網絡卡,都是一對一對的 # veth-pair 就是一對的虛擬裝置介面,他們都是成對出現的,一端連著協議,一端彼此相連 # 正因為有這個特性,veth-pair 充當一個橋樑 # OpenStac,Docker容器之間的連線,OVS的連線,都是使用veth-pair技術
-
我們來測試一下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,00000000 | 00000000,00000000,00000000,00000000 |
255,255,255,255 | 255,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映象
-
構建springboot專案
-
打包應用
-
編寫dockerfile(在idea載入docker外掛,可以又dockerfile高亮和提示)
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
-
構建映象
docker build -t swordsj .
-
釋出執行
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:
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.- Dockerfile 保證專案在任何地方可以執行
- 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這個檔案怎麼寫?
- 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
出現
安裝成功
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
入門
基礎語法
高階物件
如何操作資料庫
框架