1. 程式人生 > 實用技巧 >C# 介面持有結構體會導致裝箱問題

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

訪問測試:http://ip:8088/,通過他來訪問

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

自定義網路

網路連通

實戰:部署redis叢集

SpringBoot微服務打包Docker映象

1、構建springboot專案

2、打包應用

3、編寫dockerfile

4、構建映象

5、釋出執行

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

Docker Compose

Docker Swarm

企業實戰

Docker Compose

Docker Swarm

CI/CD jenkins