前言:
- 隨著全堆疊互聯網時代的發展,開發模式已經發生了質的飛躍,速度也提升至一個極大值點,對于現代化企業級全堆疊式開發,DevOps模式極大地節省了應用開發之后,服務的部署和上線的流程,
- 對于一般的應用運行在本地(localhost:port)和Linux/Ubuntu服務器(ip:port)上,由于環境不同,造成了前端與后端打架的問題,大一點的企業還會有中間件團隊和后端爭搶決策中間件的使用,以及DBA和后端爭執分庫分表的情況,資料丟了,快取雪崩,前端界面資料不良,都是后端的鍋,
- 那么容器技術解決了這一開發痛點:Docker是容器技術(VMContainer)技術的集大成者,把容器技術發揮到了極致;甚至就是說MySQL部署在服務器上,卻能達到一個云資料庫的效果,即使是服務腳本代碼丟了也能跑(因為容器一直都在),這些是鏡像容器技術的膩害之處......優點還有很多,如要體會,請學習!!!
- 然而,這可能只是個連入門都不到的學習筆記,只能部署一些玩具應用,什么集群,并發都沒有,學生機跑elasticsearch也跑不動,那么想要深入學習Docker請移步至Docker-Compose-Swarm
Docker 快速部署
Windows10安裝不了Docker
Windows10本地版本運行不了,因為必須是企業版或者專業版Windows,而我的Windows10是家庭版和學生版,沒有Hypter-V 無法安裝Docker
我們Windows裝不了,VMware虛擬機跑一下試試,卻發現掛載點磁區爆滿!
解決虛擬機Centos7 掛載點磁區爆滿問題
df -h #查看原因
- 移動快取
[root@localhost /]# mv /var/cache /home
[root@localhost /]# ln -s /home/cache /var
解決了掛載點問題
- 阿里云一鍵安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 清快取
yum makecache fast
- 安裝容器
yum install docker-ce docker-ce-cli containerd.io
- 啟動
systemctl start docker
- 查看
docker version
- 跑起來
sudo docker run hello-world

Docker 學習 MENU
Docker 基礎
Docker 概述
Docker 安裝
Docker 命令
- 鏡像命令
- 容器命令
- 操作命令
- .....
Docker 鏡像
容器資料卷
Dockerfile
Docker網路原理
IDEA整合Docker
Docker 進階
- Docker Compose
- Docker Swarm
- CI/CD Jekins
Docker概述
開發---上線 是兩種不同的環境 ! 需要應用環境和應用配置 !
Docker優點
用Docker發布專案 (Redis,MySQL,jdk,ES)的時候 ,專案帶著環境安裝打包成鏡像,然后再運行成單個的容器實體,單個的整體環境,而傳統服務器配置一個應用的環境,不可以跨平臺,Windows最后發布到Linux,全部作業由一人完成
- 傳統 : 后端開發service , 運維部署環境
- 現在:一套流程線式的解決方案 Java/Kotlin -- apk/iOS ----發布(應用商店) ---張三使用apk/iOS ---安裝即可使用
Docker 解決了所有的問題 !!!
- 核心思想:打包裝箱,沙箱機制,互相隔離
壓縮Linux服務器空間,可以部署更大的的mysql集群,redis集群,就是把一大堆MySQL部署到一個服務器上,傳統服務器是做不到的
- 本質:Docker解區域署上線問題
Docker歷史發展
2004年幾個有志的年輕人開辦了 dotCloud 公司 ,做云計算,虛擬化技術生意,
后因為經濟原因,100%開源,發展到今天已經成了,大前端,后端,中間件,運維都要學習的一套解決方案
Docker Hub 和GitHub 一樣 ,是個開源平臺,你可以把你的服務包鏡像push上去開源,也可以pull拉取別人的鏡像直接使用,但是比Github好,服務器安裝Docker直接使用,github拉取代碼包后還得配置環境,順便說一句:我認為DockerHub有一天會聯合Github的成為真正地開源神器,github放代碼可以梳理邏輯以及演算法實作程序,dockerhub看結果可以觀察這個代碼到底能不能實作應用,
Docker作用
基于虛擬機的技術
DevOps(開發,運維)
- 為了更快的交付和部署
- 更快速的升級和縮容
- 更簡單的系統運維
- 更高效的資源利用
Docker安裝
Docker架構圖

- 可以AliCloud鏡像加速
#查看Centos7 系統內核 uname -r查看主機配置
cat /etc/os-release
- 查看官方幫助檔案
https://docs.docker.com/engine/install/centos/
簡單安裝運行
# 1. 卸載舊版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine2. 下載安裝包
yum install -y yum-utils
3. 鏡像倉庫地址
#默認國外yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo#使用阿里云鏡像地址yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo4. 安裝docker docker-ce社區版 ee企業版 最新版
yum install docker-ce docker-ce-cli containerd.io
5. 安裝成功
docker version
6. 啟動docker
systemctl start docker
7. 嘗試啟動hello-world
docker run hello-world
8. 卸載docker 引擎-cli-包
yum remove docker-ce docker-ce-cli containerd.io
9.移除目錄
rm -rf /var/lib/docker
10.重啟docker
systemctl restart docker
阿里云鏡像加速器
僅僅限于有ESC服務器的
到控制臺側邊欄--產品與服務--容器鏡像服務
RAM授權--來到容器鏡像服務控制臺--鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bxerm4cn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker底層原理
先學習命令
Docker 常用命令
基礎命令
#docker 版本資訊 docker versiondocker 系統資訊 包括其中承載的服務資訊
docker info
幫助 不會就查
docker --help
官方檔案
/Docs/reference :https://docs.docker.com/reference/
鏡像命令

docker images docker images --help@intro
REPOSITORY 倉庫源
TAG 標簽
IMAGE ID id
CREATED 創建時間
SIZE 大小@opt
-a --all #所有
-q --quiet #只顯示id
操作鏡像
#搜索鏡像 docker search mysqldocker search --help
過濾3000以上starts的app
docker search mysql --filter=STARS=3000
拉取(下載)鏡像
docker 分層次下載 節省記憶體
docker pull mysql [:tag] #可選版本 默認最新 latest
TAG -> latest
一定要docker官方支持的版本 不支持,報錯
洗掉鏡像
docker 會按照層次洗掉
docker rmi [IMAGE ID] -f
遞回洗掉 全部洗掉
docker rmi -f $(docker images -aq)
docker pull(下載)門道很大,檔案系統會深入探索
容器命令
鏡像放在容器中運行,在docker里面裝一個centos7 來玩玩
docker run(運行)門道更大
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
--cidfile string Write the container ID to the file
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-d, --detach Run container in background and print container ID
--detach-keys string Override the key sequence for detaching a container
--device list Add a host device to the container
--device-cgroup-rule list Add a rule to the cgroup allowed devices list
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-read-iops list Limit read rate (IO per second) from a device (default [])
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
--device-write-iops list Limit write rate (IO per second) to a device (default [])
--disable-content-trust Skip image verification (default true)
--dns list Set custom DNS servers
--dns-option list Set DNS options
--dns-search list Set custom DNS search domains
--domainname string Container NIS domain name
--entrypoint string Overwrite the default ENTRYPOINT of the image
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
--expose list Expose a port or a range of ports
--gpus gpu-request GPU devices to add to the container ('all' to pass all GPUs)
--group-add list Add additional groups to join
--health-cmd string Command to run to check health
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
--health-retries int Consecutive failures needed to report unhealthy
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
--help Print usage
-h, --hostname string Container host name
--init Run an init inside the container that forwards signals and reaps processes
-i, --interactive Keep STDIN open even if not attached
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--ipc string IPC mode to use
--isolation string Container isolation technology
--kernel-memory bytes Kernel memory limit
-l, --label list Set meta data on a container
--label-file list Read in a line delimited file of labels
--link list Add link to another container
--link-local-ip list Container IPv4/IPv6 link-local addresses
--log-driver string Logging driver for the container
--log-opt list Log driver options
--mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
--mount mount Attach a filesystem mount to the container
--name string Assign a name to the container
--network network Connect a container to a network
--network-alias list Add network-scoped alias for the container
--no-healthcheck Disable any container-specified HEALTHCHECK
--oom-kill-disable Disable OOM Killer
--oom-score-adj int Tune host's OOM preferences (-1000 to 1000)
--pid string PID namespace to use
--pids-limit int Tune container pids limit (set -1 for unlimited)
--platform string Set platform if server is multi-platform capable
--privileged Give extended privileges to this container
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
--read-only Mount the container's root filesystem as read only
--restart string Restart policy to apply when a container exits (default "no")
--rm Automatically remove the container when it exits
--runtime string Runtime to use for this container
--security-opt list Security Options
--shm-size bytes Size of /dev/shm
--sig-proxy Proxy received signals to the process (default true)
--stop-signal string Signal to stop a container (default "SIGTERM")
--stop-timeout int Timeout (in seconds) to stop a container
--storage-opt list Storage driver options for the container
--sysctl map Sysctl options (default map[])
--tmpfs list Mount a tmpfs directory
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
--userns string User namespace to use
--uts string UTS namespace to use
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
-w, --workdir string Working directory inside the container
- 操作docker
docker pull centosdocker run [param(可選引數)] image
docker run --help
@param
--name "serviceName" # 自己給服務起個名
-d # 后臺運行
-it # 互動方式運行 進入容器查看
-p # -p 8080:8080
-p ip:主機埠:容器埠
-p 主機埠:容器埠
-p 容器埠
容器埠啟動centos鏡像 并且進入容器
docker run -it centos /bin/bash
正在run
docker ps
曾經有過run和現在run
docker ps -a
@DIY
docker ps -aq /<==>/ docker ps --quiet --all
- 退出容器
#容器停止并退出
exit
#容器不停止退出
CTRL + P + Q
- 洗掉容器
# 洗掉指定容器 docker rm [CONTAINER ID]遞回洗掉 方式1
docker rm -f $(docker ps -aq)
正在運行強制洗掉
docker rm -f [CONTAINER ID]
遞回洗掉 方式2
docker ps -a -q|xargs docker rm
- 啟動和停止
#啟動 docker start [CONTAINER ID]重啟
docker restart [CONTAINER ID]
停止
docker stop [CONTAINER ID]
殺死
docker kill [CONTAINER ID]
改名
docker rename [CONTAINER NAME] [CONTAINER NEW NAME]
其他常見命令
后臺啟動容器
docker run -d centos
后臺啟動的服務,前臺必須先啟動
查看日志
#查看日志幫助 docker logs --help查看某個容器最近100日志
docker logs -f -t --tail 100 [CONTAINER ID]
查看全部日志
docker logs -tf [CONTAINER ID]
-f format
-t timestamps寫一段shell腳本 向容器服務里面輸入日志
docker run -d centos /bin/sh -c "while true;do echo juminiy;sleep 1;done"
容器內部行程資訊
docker top --help
docker top [CONTAINER ID]容器內部配置資訊
docker inspect --help
@DIY 看到該服務配置資訊
docker inspect -s [CONTAINER ID|CONTAINER NAME]
進入當前運行的容器
容器可以通過ID或者NAME操作
進入容器方式1:
docker exec -it [CONTAINER ID|NAME] bash
docker exec -it mysqlserver bash
進入容器方式2 :
docker attach --help進入服務
docker attach [CONTAINER ID|NAME]
CTRL+P+Q # 保存 后臺運行
拷貝檔案:
再容器內部,從docker的centos容器上拷貝檔案到 linux主機中的目錄
docker cp centos8:/home/test.java /home
官方小結
Docker部署各種服務應用
Docker部署NGINX 
#拉取鏡像 docker pull nginx運行
docker run -d --name nginx -p 3344:80 nginx
https://where:443 http://where:80
本機發起請求
curl localhost:3344
埠暴露以及防火墻概念

后面我們采用資料卷技術 -v 直接打通外網與內網的連接,可以實作云端容器到本地互聯的功能
Docker部署Tomcat
#官方寫法 直接拉取 運行 用完即刻洗掉 docker run -it --rm tomcat:9.0直接拉取運行
docker run --dit --name "miky" -p 3355:8080 tomcat
- docker tomcat是被閹割版本 webapps 沒有網頁
docker exec -it miky bash
- 拷貝webapps.dist所有的目錄 到webapp 下就可以訪問
cp -r webapp.dist/* webapps
- 記得打開阿里云和bt埠映射要不然訪問不來
#查看docker 記憶體
docker stats
@ tip
Linux命令替換
#清屏 alias cl=clear在命令別名中,若有空格的話,建議使用雙引號將其括起來
alias pbaidu="ping http://www.baidu.com"
在shell中定義的別名僅僅在當前的shell生命周期中有效,即使是子shell也是無效的
當我們不想使用某一個命令別名的時候,我們只需要使用 unalias 別名 即可完成清除別名的效果
unalias cl
當我們使用alias定義了一些命令字符來完成其他命令的功能時,使用原來功能 \command轉義 沖突就轉義 不沖突的話使用那種方式都可以
永久設定別名 (不推薦)
將設定別名的命令保存到/etc/bash.bashrc檔案末尾中:
- 我已經alias的命令history總目錄
# 短暫存盤 重啟console失去,斷電失去 alias cl=clear設定過的別名串列
alias -p
既然常用 我們將他永久寫進bash
vim /etc/bash.bashrc
寫在 {#User specific aliases and functions}下
既然他都說了 ,可以有alias 和 function()
寫完后不能即可生效
還要組態檔
yum install libXScrnSaver
全域可用 解釋 rc run command
vim /root/.bashrc
添加命令后
source /root/.bashrc
- 我自己創造的命令@DIY
alias dk=docker alias da="docker ps -a" alias di="docker images" alias cl=clear alias pbd="ping www.baidu.com"進入容器
alias din="docker exec -it"
eg. docker exec -it [CONTAINER ID|NAME] bash
后臺運行
alias dr="docker run -dit"
eg. docker run -dit --name "setName" -p linuxPort :dockerPort [CONTAIN
ER NAME|ID]
Docker部署ES/Kibana 
個人主機 小主機慎重安裝 非常大 小主機跑起來非常非常卡 因為他是分布式全文搜索引擎
人家都說分布式 ,你心里沒數嗎,冒險試一下
dk run -d --name "es" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
@ linux point
查看Linux系統核心
參考博客
https://blog.csdn.net/qq_31278903/article/details/83146031
# 查看物理CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq
查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l
查看CPU資訊(型號)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
查看內 存資訊
cat /proc/meminfo
es操作成功后趕緊關閉 然后限制記憶體
dk run -d --name "es" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
這次好多了
我們看一看docker使用的記憶體流量和I/O
docker stats
埠9200所回傳的json

在一個服務開啟時 ,CPU流量波動幅度較大,經過一段時間(30s左右)會穩定
Kibana 連接es:9300
通過內網連接轉發:移步于Docker網路原理
可視化管理鏡像
portainer
Rancher (CI/CD持續集成,持續部署)
什么是portainer
Docker 圖形化界面管理 例如bt可以可視化管理linux
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker/sock --privileged=true portainer/portainer用來管理docker,可有可無,,,
一些問題tips:
1.埠映射問題
這個位置發現 0.0.0.0:3306->3306 本機的3306埠映射到 docker容器內的3306 所以外部的3306關閉不了
SpringBoot內嵌Tomcat 外部8080也關閉不了
在SpringBoot application.yaml組態檔中寫 的是 外部服務器埠 而內置沒有匹配mysql 外部埠 ,
所以docker 內部mysql映射到了 外部 外部關閉不了 雖然外部打不開....
這種配置有點糟糕......需要改進一下
修復前端一些bug后重新上線 2020.08.27
2.關于分布式的認識
我點擊這個按鈕,前端觸發事件,傳給后端路由,后端開始執行一段代碼,比如發送短信,郵件,那么這個服務在主機的CPU占用率立即到一個波峰,然后回落,在沒有事件時候,仍然是起落的,由于網路不可靠,連接不是常態,所以人多了,用戶多了就要并發,分布,執行緒,但我這個服務沒有分布式,并發,多執行緒,資料庫鎖,雖然是執行緒級別的,但不是多執行緒的,比較辣雞,可以說是個玩具服務,當然我們也不一定一上來就分布式,浪費資源,還沒錢.,當然用戶多了,高并發,分布式不是很重要,是必要的,一定的,網站訪問速度慢會流失客戶.
Docker部署MySQL 
這個比較復雜,重新配置MySQL,見于 /Docker精髓/容器資料卷/MySQL資料掛載
Docker 鏡像
Docker 鏡像獲得方式
- 遠程倉庫下載
docker search xxx
docker pull xxx
docker run ...
- 朋友拷貝給你
- 自己制作鏡像,寫Dockerfile檔案
Docker鏡像記載原理
UnionFS 聯合檔案系統
docker 檔案記載分層
下載分層,洗掉分層
docker 層次理解

可以看到已經存在的level
docker logs : Already exists
比如現在我們有一個服務,這個服務是在docker上的,我現在有加了一個新功能,難么docker會識別我的容器,把容器檔案重復部分舍去,只是留取需要的部分,按照層級累加
docker 鏡像都是只讀的,無法修改,就好比是你打jar后,發現原始碼寫錯了,再運行發現是錯的,無法修改了,只能修改原始碼,CI/CD會徹底解決這一個問題
我突然有一個大膽的想法,我們發現原始碼錯了,在容器運行時進入容器改原始碼,再停止服務,洗掉容器,重新build后會重新編譯,能否達到持續部署效果呢?
我們進入容器在容器里面加檔案,我們把運行好的容器重新commit到自己的本地鏡像倉庫里面 在執行這個容器 .
Commit自己的鏡像
@tips
# 遞回
-r
# 提交容器成為一個新的副本 docker commit [CONTAINER ID|NAME]和git類似
docker commit -m="commit info" -a="authorName" [BEING PUBLISHED CONTAINER ID|NAME] [TARGERT IMAGE NAME(eg. mytomcat)only have name]
發布自己的Tomcat,原生的docker tomcat 沒有web頁面和服務 我們把webapps.dist,放到 webapps下 然后commit我們自己的 鏡像里面
@BUG
發現了瀏覽器的一個驚奇BUG
3344明明是mytomcat 他卻顯示出nginx了瀏覽器快取重繪 再curl一下內網地址就好
不過我曾經是配置了3344為nginx 但是在關閉nginx之后 3344沒人用 我把mytomcat設定為3344 會有快取....
@Tips
Linux命令學習手冊
https://www.linuxcool.com/
Docker精髓
容器資料卷
--------卷的掛載原理
容器之間資料可以共享,將Docker某些容器的資料目錄掛載到主機目錄上,同步資料,即使容器沒了,本地資料還在
使用資料卷進行資料掛載
-v bash掛載 volumn
-v 和 -p 類似
dk run -it -v[localPath]:[dockerPath] -p [localPort]:[dockerPort]
本機可以沒有localPath
#掛載一個centos docker run -it -v /home/docker-centos:/home centos查看掛載資訊
docker inspect [CONTAINER ID|NAME]
雙向系結:容器同步本地,本地同步到容器,其實是一個位置,防止刪容器跑路,可以完成本地修改;同步容器
@ Tip
#進入運行容器
dk exec -it [CONTAINER ID|NAME] bash
dk attach [CONTAINER ID|NAME]
MySQL資料掛載
# 配置 -d 后臺運行 -p 埠映射 -v 卷掛載目錄映射 -e 環境配置 --name 容器名我們掛在一個組態檔/conf目錄,一個資料/data目錄
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 [setContainerName] [IMAGE ID|NAME]
我們將MySQL重新掛載
具名掛載和匿名
匿名掛載 /<==>/ 隨機掛載
# 極速匿名掛載 d run -d -P -v /ect/nginx [IMAGE ID|NAME]@Defi
-P 埠號 隨機映射
無--name 容器名 系統隨機取得
-v 資料卷只有容器內目錄 本地隨機
已經掛載歷史
# docker 掛載幫助 docker volume --help查看docker內已經掛載的目錄
docker volume ls
不要匿名掛載 不要匿名掛載 不要匿名掛載 誰都看不懂!!!
查看已經掛載的volume資訊
docker volume inspect [VOLUME NAME]
具名掛載
docker run -d -P --name [setName] -v [namedService]:/etc/xxx [IMAGE ID|NAME]
如何掛載
# 判斷掛載方式匿名掛載
-v [CONTAINER PATH]
具名掛載
-v [setName]??[CONTAINER PATH]
指定路徑掛載
-v /[LOCAL PATH]??[CONTAINER PATH]
小彩蛋
#改變讀寫權限 # 騷操作 不建議使用 ro 只讀 rw 讀寫一旦容器啟動設定權限 容器內部權限就定了
ro
docker run -d -P --name [setName] -v [named]:[CONTAINER PATH]:ro [IMAGE NAME|ID]
rw
docker run -d -P --name [setName] -v [named]:[CONTAINER PATH]:rw [IMAGE NAME|ID]
初識Dockerfile 進行掛載
Dockerfile是什么
- Dockerfile 是docker鏡像的構建檔案
- Dockerfile 是一個腳本,用來執行一段命令,生成一個鏡像
基于centos構建一個鏡像
dockerfile1
#從...鏡像 FROM centos掛載目錄
VOLUME ["v1","v2"]
CMD命令
CMD echo "----end----"
CMD /bin/bash
build構建鏡像
# docker 構建幫助 docker build --help
docker build -f dockerfile1 -t juminiy/centos:1.0 .
多個容器實作資料共享
# 多個容器用一個鏡像 docker run -it --name [another container setName] --volumes-from [prevoius container name] [IMAGE ID|NAME]:[TAG]@tip
容器啟動時可以沒有 [TAG] 默認是latest 不是lateset要標明
這樣實作了容器互聯,本地掛載,容器打通了,但又是相互隔離的,牛逼!
進入小型系統無映射埠
dk attach centos01
CTRL+P+Q
我們知道最開始 cenos01掛載到 local ,centos02 掛到centos01 ,centos03到02
先停掉centos01,向02里面寫東西 看01,local,03什么反應
無論停掉還是移除容器,都和Linux硬連接一樣,容器沒了,檔案依然在,符合檔案拷貝概念,
我的一個想法
一個服務器,Docker部署三個容器,mysql01,mysql02,mysql03
1庫只寫,2,3庫只讀,分庫分表,讀寫分離,先通過掛載打通本地和容器,再通過掛載將資料同步三個容器,還能容災(只限于容器),一個磁盤當然不能做兩個磁盤的事,容器限制mysql IO量
當然是耗記憶體,掛到本地后容器都沒本地檔案還在,容器互通后檔案就像病毒,最后一個沒,所有才沒
DockerFile
--------寫dockerfile檔案
Dockerfile介紹
自己發布鏡像檔案
- 寫dockerfile檔案
- build
- run
- push
看dockerhub版本資訊時候,點進去進入github,里面是完整的 dockerfile
我們看一下mysql8.0的 部分dockerfile

baseline :
- 指令的關鍵字都是大寫的
- 從檔案開始到檔案末尾
- 每一個命令都是一層鏡像
- 每一個鏡像都會提交一個新的鏡像層,并commit
這個dockerfile檔案也是不難寫的!
docker是面向開發的,發布的專案,需要一個dockerfiel檔案Docker 鏡像成為企業交付的必要!
Dockerfile構建
@Tips
- 學習方式增加了,百度圖片本身就是個搜索引擎,可以理解為網路爬蟲,提供你需要的圖片,
# 基礎鏡像,開始構建 FROM維護者資訊
MAINTAINER
跑起
RUN
添加內容
ADD
作業目錄
WORKDIR
掛載目錄位置
VOLUME
暴露埠
EXPOSE
指定容器啟動的命令 替換命令
CMD
只有最后一個會生效 追加命令
ENTRUPOINT
被某些Dockerfile繼承才會觸發運行
ONBUILD
拷貝
COPY
構建時候的環境變數
ENV
Dockerhub中99%鏡像都是從 scratch來的,如若不信,請看GitHub的dockerfile原始碼
創建自己的centos
mydockerfile
FROM centosMAINTAINER juminiy<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
- 制作鏡像
docker build -f mydockerfile -t mycentos:1.0 .
- 運行容器
dk run -dit -p 3888:8000 --name "mycentos01" -v /home/mycentos:/home mycentos:1.0
- 埠沒啥用關了...
dockerfile自己制作鏡像作用:官方的配置太低了,我們自己寫在dockerfile里面自己加一些腳本 來創造自己的鏡像
# 查看docker鏡像變更歷史
docker history [CONTAINER ID|NAME]
# 對于一個image/container來說 ID和name都可以分辨他們,因為他們都是unique的
CMD和ENTRYPOINT的區別
CMD構建鏡像后 啟動容器時開始命令
比如我打開了容器 然后運行cmd命令 xxx
把CMD命令寫進centos
在docker run時命令后可追加引數
CMD 只有最后一個有效,把全部的CMD替換
CMD ["lis","-a"]
ENTRYPOINT可無限追加
進階 : Docker構建自己的Tomcat
- 上傳 jdk安裝包和tomcat安裝包到linux服務器
撰寫dockerfile檔案 官方命名 Dockerfile build自動尋找
Dockerfile命名dockerfile檔案build程序自動尋找
原始
docker build -f [dockerfileName] -t [TARGET] ...命名Dockerfile
docker build -t [TARGET] ...與Dockerfile同級還要寫一個 readme.txt 來表明鏡像的使用方法 和 github 的README.txt一樣
# 為什么需要centos ? FROM centosMAINTAINER juminiy<[email protected]>
COPY readme.txt /usr/home/readme.txt
解壓jdk
ADD jdk-14.0.2_linux-x64_bin.tar.gz /usr/local
解壓tomcat
ADD apache-tomcat-9.0.37.tar.gz /usr/local
安裝vim編輯器
RUN yum -y install vim
運行環境
ENV MYPATH /usr/local
作業目錄
WORKDIR $MYPATH
設定環境變數
ENV JAVA_HOME /usr/local/jdk-14.0.2
ENV CLASSPATH $JAVA_HOME/bin
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin暴露埠
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.37/bin/logs/catalina.out
從 jdk9 開始環境變數配置就和 1.8不一樣了 沒有/jre了
build鏡像(ONE POINT EXISTS .)
dk build -t diytomcat (-f Dockerfile) .
啟動容器
docker run -d -p 8080:8080 --name "juminiytomcat" -v
/home/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v/home/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs diytomcat
成功!!!
Docker 網路原理
真實環境
Docker Compose
yaml檔案 幾百個幾千個微服務一鍵啟動
Docker Swam
集群部署
CI/CD Jekins : 流水線模式,企業級別開發上線
-------關于這部分會在Docker進階原理中記錄!!!敬請期待!!!
Docker實戰
Docker部署SpringBoot-Webapp 微服務上線
步驟
1.package 打成jar包
2.jar包放在Linux云服務器一個目錄下
3.和jar包同級創建目錄
vim Dockerfile
#獲取base 拉取jdk鏡像 image FROM adoptopenjdk/openjdk14:latest #類似于執行 linux指令 RUN mkdir /opt/app #類似于linux copy指令 COPY springsecurity.jar /opt/app/ #對外埠 EXPOSE 8000 #執行命令 java -jar /opt/app/demo-docker.jar CMD ["java", "-jar", "/opt/app/springsecurity.jar"]
- 創建dokcer鏡像
docker build -t springsecurity .
- 直接拉取jdk14
- 查看鏡像串列
- 生成容器
docker run -it -p 8000:8000 springsecurity
- 然后德魯伊 資料源,一直報錯???
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 修改本地改資料庫時間線
url: jdbc:mysql://cloud-ip:3306/security?&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
失敗原因
1.服務器上的mysql和docker上的mysql 不是一個mysql
進入docker 發現和服務器上MySQL資料庫不一樣
添加庫和表
2.更改Druid資料源時間線 serverTimezone=UTC 或者 Asia/Shanghai
失敗日志:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
create connection SQLException, url: jdbc:mysql://localhost:3306/security?&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8, errorCode 0, state 08S01
use mysql;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
特別注意:在步驟4中配置資料源時,有可能連接不上遠程的docker中的mysql資料庫,需要以下步驟賦權才可以:
安裝的mysql默認其他機器是沒有權限訪問的,需要賦權
1、 docker ps 查看mysql的容器id
2、docker exec -it xxx sh 進入容器終端
3、mysql –u root –p
4、通過navicat遠程連接不上,出現這個原因是mysql8 之前的版本中加密規則是mysql_native_password,而在mysql8之后,加密規則是caching_sha2_password.
解決問題方法有兩種,一種是升級navicat驅動,一種是把mysql用戶登錄密碼加密規則還原成mysql_native_password.
這里采用第二種方式 :修改加密規則
5、 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123';
其中:root為用戶名,%為允許所有機器訪問,123為新設定的密碼
6、 FLUSH PRIVILEGES;
Docker 洗掉操作
1)首先需要停止所有的容器
docker stop $(docker ps -a -q)
2)洗掉所有的容器(只洗掉單個時把后面的變數改為image id即可)
docker rm $(docker ps -a -q)
2、洗掉鏡像
1)查看host中的鏡像
docker images
2)洗掉指定id的鏡像
docker rmi
想要洗掉untagged images,也就是那些id為的image的話可以用
docker rmi $(docker images | grep "^" | awk "{print $3}")
3)洗掉全部的images
docker rmi $(docker images -q)
3、當要洗掉的iamges和其他的鏡像有關聯而無法洗掉時

可通過 -f 引數強制洗掉
docker rmi -f $(docker images -q)
移除容器
docker rm 容器id
dokcer容器互聯 url localhost代替為容器名字 ,把快取(docker的垃圾容器和廢棄容器,鏡象)清干凈再重啟mysql
docker容器互聯學習檔案
https://yeasy.gitbook.io/docker_practice/network/linking
窮人版SSH -LINUX部署
打開powershell
ssh -p [port] [username]@[ip]
輸入幾次看命
-root-qpmz111222@@@-
部署服務上線步驟(干貨版)
本地操作
本地測驗要求:介面全部正確,JUnit 全部通過 ,廢棄的標明@Deprecated,本地Windows服務正常
修改遠程服務埠號,修改檔案存盤目錄,修改資料庫名和資料庫時區,....,總之將Windows本機配置修改為遠程服務器配置
將JUnit @SpringBoot-Test 全部注掉 或者洗掉
maven - clean 后專案主目錄如下 ,沒有target目錄

build - artifact/all 專案主目錄出現 target

maven - package 專案結構

6.出現 **.jar.original 正確 否則重啟電腦,重復步驟 1-5
遠程服務器
上傳jar包到遠程Linux指定目錄 ,把jar包名字改成簡短點
同級目錄下存在 Dockerfile 檔案
#jdk版本 FROM adoptopenjdk/openjdk14:latest #虛擬運行目錄 存在 /opt 不存在/opt/aqq RUN mkdir /opt/aqq #拷貝到虛擬執行目錄下 COPY los.jar /opt/aqq/ #運行埠號 和los.jar服務組態檔application.yaml中一致 EXPOSE 8081 #虛擬運行命令 CMD ["java", "-jar", "/opt/aqq/los.jar"]
- 使用遠程工具連接Linux
我沒錢用的本機 powershell 其實沒啥區別 ,命令敲的好,用啥都一樣,我只是窮而已 !
ssh -p [port] [username]@[ip]
- 查看docker下的全部容器
docker ps -a
- 查看docker的全部鏡像
docker images
- 洗掉不需要的容器
docker rm [CONTAINER ID]
- 洗掉不要的鏡像
docker rmi [IMAGE ID]
發現洗掉不掉正在運行的服務,容器以及鏡像*
- 強制結束容器
docker rm -f [CONTAINER ID]
- 結束鏡像
dokcer rm -f [IMAGE ID]
成功!
- SQLScript資料庫腳本 建庫,建表,進入docker 沙箱(容器)內資料庫
docker exec -it mysqlserver bashsql -u[username] -p[password]
exit
exit
創建docker 服務鏡像 (末尾有一個點) 確定資料庫和docker容器,鏡像干凈后
到剛才Dockerfile 和jar包的父級目錄下
創建鏡像
docker build -t [serviceName] .
注冊服務
docker run -dit --name "resp" -p 8081:8081 [IMAGE NAME(serviceName)|ID]
# 后臺運行加引數 -d, --detach (Run container in background and print container ID)
# 就可以不用關閉后再重啟了
# 查看日志可以到達和看console一樣效果
啟動成功后 CTRL+C 關閉服務
找到 服務IMAGE ID
docker restart [CONTAINER ID]
再次查看所有
docker ps -a
發現 有兩個埠已經被持續占用
說明服務進行中,一個是MySQL 一個是你的微服務
Docker部署服務完成!!!
sytemctl restart docker
docker 重啟后發現已經部署的服務埠沒了

發現容器,鏡像都在,重啟重啟就好
#mysql
docker restart [MySQL CONTAINER ID]
#los
docker restart [service CONTAINER ID]

部署成功!!!
物聯網IOT
Docker部署emqx
一鍵啟動,服務器小,先關一些服務
docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx/emqx:latest
18083是個Dashboard后臺控制面板
Dashboard 忘記密碼
進入容器
# 創建 admin 賬號 admins add <Username> <Password> <Tags>重置 admin 密碼
admins passwd <Username> <Password>
洗掉 admin 賬號
admins del <Username>
默認賬戶
admin
public
配置emqx
官方檔案
The environment variables which with
EMQX_prefix are mapped to configuration file,.get replaced by__.Example:
EMQX_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors EMQX_MQTT__MAX_PACKET_SIZE <--> mqtt.max_packet_sizeAlso the environment variables which with
PLATFORM_prefix are mapped to template string in configuration file.PLATFORM_ETC_DIR <--> {{ platform_etc_dir }}Non mapped environment variables:
EMQX_NAME EMQX_HOSTThese environment variables will ignore for configuration file.
For example, set mqtt tcp port to 1883
docker run -d --name emqx -e EMQX_LISTENER__TCP__EXTERNAL=1883 -p 18083:18083 -p 1883:1883 emqx/emqx:latest
啟動emqx
emqx start
容器進不去方法
dk exec -it [CONTAINER ID (NOT NAME)] sh
docker run -dit --name emqx -e EMQX_LISTENER__TCP__EXTERNAL=1883 -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.0.0
由于是docker內部署所以外部啟動無效 以下命令對于docker內部都無效
Start EMQ X broker in the background$ emqx start
EMQ X Broker v4.0.0 is started successfully!systemctl start
$ sudo systemctl start emqx
EMQ X Broker v4.0.0 is started successfully!service start
$ sudo service emqx start
EMQ X Broker v4.0.0 is started successfully
status可檢測內部容器情況
emqx_ctl status

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/118201.html
標籤:其他
上一篇:lua、python對比學習
下一篇:怎么掃描不在同一個網段的IP地址
