C# 介面持有結構體會導致裝箱問題
Docker的常用命令
docker version #顯示docker的版本資訊
docker info #顯示docker的系統資訊,包括映象和容器的數量
docker --help #docker幫助命令
映象命令
docker images 檢視所有本地主機上的映象 docker search mysql 搜尋映象 docker pull mysql 下載映象 docker pull mysql:5.7 指定版本下載 docker rmi -f ID/name 刪除映象 docker rmi -f 容器id 刪除指定的映象 docker rmi -f 映象id 映象id 映象id 映象id 刪除多個映象 docker rmi -f $(docker images -aq) #刪除全部映象
容器命令
說明:有了映象才可以建立容器,liunx,下載一個centos來測試學習
docker pull centos
新建容器並啟動
docker run [可選引數] image #引數說明 --name="Name" 容器名字 tomcat01 tomcat02 tomcat03,用來區分容器 -d 後臺方式執行 -it 使用互動方式執行,進入容器檢視內容 -p 制定容器的埠 -p 8080:8080 -p ip:主機埠:容器埠 -p 主機埠:容器埠 -p 容器埠 容器埠 -p 隨機指定埠 #測試,啟動並進入容器 docker run -it centos /bin/bash
列出所有執行的容器
docker ps 命令
-a #列出當前正在執行的容器+帶出歷史執行中的容器
-n=? #顯示最近建立的容器
-q #只顯示容器的編號
刪除容器
docker rm 容器id #刪除指定的容器,不能刪除在執行的容器,如果要強制刪除 rm -f
docker rm -f $(docker ps -aq) #刪除所有的容器
docker ps -a -q|xargs docker rm #刪除所有的容器
退出容器
exit #直接容器停止並退出
ctrl + P + Q #容器不停止退出
啟動和停止容器的操作
docker start 容器id #啟動容器 docker restart 容器id #重啟容器 docker stop 容器id #停止當前正在執行的容器 docker kill 容器id #停止當前容器
常用其他命令
後臺啟動容器
命令 docker run -d 映象名
docker run -d centos
#問題docker ps,發現centos停止了
#常見的坑,docker容器使用後臺執行,就必須要有一個前臺程序,docker發現沒有應用,就會自動停止
#nginx,容器啟動後,發現自己沒有提供服務,就會立即停止,就沒有程式了。
檢視日誌
docker logs -f -t --tail 容器
#顯示日誌
-tf #顯示日誌
-tail number #顯示日誌條數
docker logs -tf --tail 10 容器id
檢視容器中的程序資訊ps
docker top 容器id
檢視映象的元資料
#命令
docker inspect 容器id
進入當前正在執行的容器
#我們通常都是使用後臺的方式執行的,需要進入容器,修改一些配置
#命令
#方法一:
docker exec -it 容器id bashshell
eg:docker exec -it 容器id /bin/bash
ls
ps -ef
#方法二:
docker attach 容器id
docker exec #進入容器後開啟一個新的終端,可以在裡面操作(常用)
docker attach #進入容器正在執行的終端,不會啟動新的程序
從容器內拷貝檔案到主機上
docker cp 容器id:容器內路徑 目的主機路徑
docker cp 容器id:/home/test.java /home
#拷貝是一個手動過程,未來我們使用 -v卷的技術,可以實現
作業練習
docker安裝nginx
#1.搜尋映象search 建議大家去docker搜尋,可以看到幫助文件
#2.下載映象 pull
#3.執行測試
docker images
-d 後臺執行
--name 給容器命名
-p 宿主機埠:容器內部埠
docker run -d --name nginx01 -p 3344:80 nginx
docker ps
curl localhost:3344
#進入容器
docker exec -it nginx01 /bin/bash
whereis nginx
cd /etc/nginx ls
docker安裝tomcat
docker run -it -rm tomcat:9.0
#我們之前的啟動是後臺,停止了容器之後,容器還是可以查到
docker run -it --rm,一般用來測試,用完之後就刪除
#下載在啟動
docker pull tomcat:9.0
#啟動執行
docker run -d -p 3355:8080 --name tomcat01 tomcat
#測試訪問沒有問題
#進入容器
docker exec -it tomcat01 /bin/bash
#發現問題
1、linux命令少了
2、沒有webapps 阿里雲映象的原因,預設是最小映象,所有不必要的都剔除掉
#保證最小的可執行環境
思考:如果我們每次都要部署專案,每次進入容器是不是十分麻煩?我要是可以在容器外部提供一個對映路徑,webapps,我們在外部部署專案,自動同步就好了!
部署es+kibana
#es暴露的埠很多
#es十分的消耗記憶體
#es的資料一般需要放置到安全目錄,需要掛載
$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#增加記憶體的限制,修改配置檔案 -e 環境配置修改
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="Xms64m -Xmx512m" elasticsearch:7.6.2
視覺化
portainer
Rancher(CI/CD再用)
什麼是portainer?
Docker圖形化介面管理工具,提供一個後臺面板供我們操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
commit映象
docker commit 提交容器成為一個新的副本
#命令和git類似
docker commit -m "提交的描述資訊" -a="作者" 容器id 目標映象名:[tag]
實戰測試
#啟動一個預設的tomcat
#發現這個預設的webapps是沒有webapps應用的 映象的原因,官方的映象預設webapps是沒有檔案的
#自己拷貝進去了基本的檔案
#將我們操作後的容器提交為一個映象!我們以後就使用我們修改過後的映象即可,這就是我們自己修改的一個映象
學習方式說明:理解概念,但是一定要實踐,最後理論和實踐結合一次性搞定這個知識。
如果你想要儲存當前容器的狀態,就可以通過commit提交,獲得一個映象
就好比我們學習VM時候的快照
到這裡才算是入門Docker!
容器資料卷
什麼是容器資料卷?
docker理念回顧
將應用和環境打包成一個映象
資料?如果資料都在容器中,那麼我們刪除容器,資料就會丟失! 需求:資料可以持久化
MySQL,容器刪了,刪庫跑路 需求:MySQL資料可以儲存在本地!
容器之間可以有一個數據共享的技術!Docker容器中產生的資料,同步到本地!
這就是卷技術!目錄的掛載,將我們容器裡面的目錄,掛載到Linux上面
總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的
使用資料卷
方式一:直接用命令來掛載 -v
docker run -it -v 主機目錄:容器內端目錄
#測試
docker run -it -v /home/ceshi:/home centos /bin/bash
#啟動起來之後我們可以通過docker inspect 容器id
1、停止容器
2、宿主機上修改檔案
3、啟動容器
4、容器內的資料依舊是同步的
好處:我們以後修改只需要在本地修改,容器內會自動同步!
實戰:安裝MySQL
思考:MySQL的資料持久化問題
#獲取映象
docker pull mysql
#執行容器,需要做資料掛載: #安裝啟動mysql,需要配置密碼,這是要注意的!
官方測試: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 mysql01 -d mysql:5.7
假設我們將容器刪除
docker rm -f mysql01
發現我們掛載到本地的資料依舊沒有丟失,這就實現了容器持久化的功能
具名和匿名掛載
#匿名掛載
-v 容器內路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx
#檢視所有的volume情況
docker volume ls
#這裡發現,這種就是匿名掛載,我們在-v只寫了容器內的路徑,沒有寫容器外的路徑
#具名掛載
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
#通過 -v 卷名:容器內路徑
#檢視一下這個卷
docker volume inspect juming-nginx
所有的docker容器內的卷,沒有指定目錄的情況下都在/var/lib/docker/volumes/xxxx/_data
我們通過具名掛載可以方便的找到我們的一個卷,大多數情況使用具名掛載
如何確定是具名掛載路徑,還是指定路徑掛載!
-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 #具名掛載
-v /宿主機路徑::容器內路徑 #指定路徑掛載
拓展:
#通過 -v 容器內路徑:ro rw改變讀寫許可權
ro readonly #只讀
rw readwrite #讀寫
#一旦設定了容器許可權,容器對我們掛在出來的內容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內不無法操作
初識Dockerfile
就是用來構建docker映象的構建檔案!命令指令碼
通過這個指令碼可以生成映象,映象是一層一層的,指令碼一個個的命令,每個命令都是一層!
#建立一個dockerfile檔案,名字可以隨機 建議Dockerfile
#檔案中的內容 指令大寫 引數
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
#這裡的每個命令,就是映象的一層
這個卷和外部一定有一個同步的目錄!
檢視一下卷掛載的路徑
測試一下剛才的檔案是否同步出去了!
這種方式我們以後用的會十分的多,因為通常我們自己構建映象
假設構建映象的時候沒有掛載卷,要手動映象掛載 -v 卷名 容器內路徑!
資料卷容器
多個mysql同步資料!
docker run -it --name docker01 kuangshen/centos:1.0
ls
ls -l
docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0
ls -l
結論:
容器之間配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。
但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的!
DockerFile
構建步驟:
1、編寫一個dockerfile檔案
2、docker build 構建成為一個映象
3、docker run 執行映象
4、docker push 釋出映象(DockerHub、阿里雲映象倉庫)
DockerFile構建過程
基礎知識:
1、每個保留關鍵字(指令)都必須是大寫字母
2、執行從上到下順序執行
3、#表示註釋
4、每一個指令都會建立提交一個新的映象層,並提交!
dockerfile是面向開發的,我們以後要釋出專案,做映象,就要編寫dockerfile檔案,這個檔案十分簡單!
Docker映象逐漸成為企業交付的標準,必須要掌握!
步驟:開發、部署、運維。。。
DockerFile:構建檔案,定義了一切的步驟,原始碼
Dockerimages:通過DockerFile構建生成的映象,最終釋出和執行的產品,原來是jar war
Docker容器:容器就是映象執行起來提供服務的
DockerFile的命令
FROM #基礎映象,一切從這裡開始構建
MAINTAINER #映象是誰寫的,姓名+郵箱
RUN #映象構建時候需要執行的命令
ADD #步驟,tomcat映象,這個tomcat壓縮包!新增內容
WORKDIR #映象的工作目錄
VOLUME #掛載的目錄
EXPOSE #保留埠配置
CMD #指定這個容器啟動時候執行的命令,只有最後一個會生效,可被代替
ENTRYPOINT #指定這個容器啟動時候執行的命令,可以追加命令
ONBUILD #當構建一個被繼承的Dockerfile 這個時候就會執行ONBUILD的指令,觸發指令
COPY #將檔案拷貝到映象中
ENV #構建的時候設定環境變數
#通過這個檔案構建映象
docker build -f dockerfile檔案路徑 -t 映象名:[tag]
可以列出本地進行的變更歷史
docker history 容器id
我們平時拿到一個映象,可以研究一下他是怎麼做的了
釋出自己的映象
DockerHub
1、地址https://hub.docker.com/註冊自己的賬號
2、確定這個賬號可以登入
3、在我們自己的伺服器上提交映象
docker login --help
docker login -u xiaowang
4、登陸成功之後就可以提交映象了
docker images
docker push xiaowang/divtomcat:1.0
阿里雲映象服務
1、登入阿里雲
2、找到容器映象服務
3、建立名稱空間
4、建立容器映象
5、瀏覽阿里雲
1. 登入阿里雲Docker Registry
$ sudo docker login --username=郭靖1767164 registry.cn-hangzhou.aliyuncs.com
用於登入的使用者名稱為阿里雲賬號全名,密碼為開通服務時設定的密碼。
您可以在訪問憑證頁面修改憑證密碼。
2. 從Registry中拉取映象
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/guojingtest/guojingtest:[映象版本號]
3. 將映象推送到Registry
$ sudo docker login --username=郭靖1767164 registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/guojingtest/guojingtest:[映象版本號]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/guojingtest/guojingtest:[映象版本號]
請根據實際映象資訊替換示例中的[ImageId]和[映象版本號]引數。
4. 選擇合適的映象倉庫地址
從ECS推送映象時,可以選擇使用映象倉庫內網地址。推送速度將得到提升並且將不會損耗您的公網流量。
如果您使用的機器位於VPC網路,請使用 registry-vpc.cn-hangzhou.aliyuncs.com 作為Registry的域名登入,並作為映象名稱空間字首。
5. 示例
使用"docker tag"命令重新命名映象,並將它通過專有網路地址推送至Registry。
$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令將該映象推送至遠端。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
Docker網路
理解Docker
--link
自定義網路
網路連通
實戰:部署redis叢集
SpringBoot微服務打包Docker映象
1、構建springboot專案
2、打包應用
3、編寫dockerfile
4、構建映象
5、釋出執行
以後我們使用了docker之後,給別人交付一個映象即可!