柚子快報激活碼778899分享:微服務中的Docker詳細學習
柚子快報激活碼778899分享:微服務中的Docker詳細學習
Docker的個人理解
? ? ? ? 首先我對于Docker的理解分為兩部分,第一是對名字上的理解,我們都知道docker的英文翻譯是“碼頭工人”的意思,所以我們也可以理解為docker是碼頭上的一個個集裝箱的使用。這也與他的圖標很相似。其次我是對于其功能上的理解,他跟我們電腦上的虛擬機很相似,但又不同,相似的是他也同虛擬機一樣,把每個項目都部署在了一個包里面,但不同的地方是Docker他是直接把這個項目的系統(tǒng)函數(shù)庫、依賴、配置和環(huán)境都給打包了起來。這與JVM虛擬機不同,JVM虛擬機還需要通過Hypervisor來再一次部署。
從這里不難看出,Docker給我們的項目部署提供了比較好的方案,也可以簡單的來說docker相當于在操作系統(tǒng)上的軟件,而虛擬機搞出來的相當于是在操作系統(tǒng)里面又搞了一個操作系統(tǒng)
Docker的架構
? ? ? ? Docker的架構,在這里面我們需要明白Docker兩個最重要的東西,一個是鏡像(Image)另一個是容器(container)。
鏡像(image)相當于是一個可讀性光盤,我們可以從里面復制出很多個容器但不能對光盤本身進行一個修改
容器(container)相當于是我們拿出來的項目,我們需要在這個項目里面進行我們自己需要的邏輯操作。
我們在實現(xiàn)Docker的架構的時候,我們把它分成兩個部分:客戶端——Docker Server(docker daemon)——Docker鏡像倉庫(registry)
Docker的基本使用
? ? ? ? 在Docker中,我們需要使用它,往往在Linux系統(tǒng)中去使用
docker的安裝
首先:安裝Docker之前為了避免安裝錯誤,我們先把之前可能安裝過的docker進行一個卸載操作
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
然后我們需要聯(lián)網下載yum-utils工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地的鏡像源(這里我使用了阿里的鏡像源)?
# 設置docker鏡像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
最后我們開始安裝我們的docker:
yum install -y docker-ce?
?等待安裝好了之后我們還需要做的事情就是把防火墻給關閉
# 關閉 systemctl stop firewalld # 禁止開機啟動防火墻 systemctl disable firewalld
然后使用docker -v查看Docker的版本信息,查到了證明我們安裝成功了
其實到了這一步我們還沒有完全結束Docker的安裝,在安裝完這些之后我們還需要安裝相應的鏡像加速器-參考阿里云的鏡像加速文檔:阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計算服務平臺
docker的使用
鏡像的基本操作指令如上訴圖片
操作指令遇到不會的我們可以使用類似于docker save --help的操作來查找自己想要的操作
除了鏡像的基本操作之外我們更需要學習的還有容器的基本操作,容器的基本操作就會涉及到數(shù)據卷(volume)的概念
其實我們在有了docker容器之后我們雖然可以在容器中進行一個操作,但是有很多其他的基本操作我們還是實現(xiàn)不了,所以這個時候我們就很自然的引出了卷的概念?
通過volume的映射來達到操作容器內文件的效果,其基本語法為:
????????數(shù)據卷的重點(掛載的使用)
docker run \ ? --name mn \ ? -v html:/root/html \ ? -p 8080:80 ? nginx \
通過上面哪個代碼我們可以實現(xiàn)在創(chuàng)建nginx容器的時候把html文件數(shù)據掛載在/root/html文件里面
之后我們通過Linux的操作就可以實現(xiàn)對容器內文件的操作了
# 查看html數(shù)據卷的位置 docker volume inspect html # 進入該目錄 cd /var/lib/docker/volumes/html/_data # 修改文件 vi index.html
這樣我們就成功的掛載數(shù)據卷了,我們在Linux系統(tǒng)中操作html文件,容器中的html目錄下的html文件也會相應的改變
除了掛載數(shù)據卷,我們還可以進行數(shù)據目錄的掛載
以MySQL數(shù)據掛載為例子:
我們在tmp文件目錄下進行操作,把mysql.tar文件加載進來之后我們執(zhí)行:
docker load -i mysql.tar 進行鏡像導入
然后我們再在tmp目錄下創(chuàng)建兩個目錄/mysql/conf和/mysql/data兩個目錄
在進入mysql目錄后上傳conf文件到conf目錄下
去DockerHub查閱資料,創(chuàng)建并運行MySQL容器
兩種方式的比較:
一個是自動處理,一個是手動處理,但是自己知道在什么位置
docker鏡像的結構
docker的鏡像結構可以分為三個類別:Entrypoint(入口)、Layer(層:可以有很多)、BaseImage(基礎鏡像)
更新詳細語法說明,請參考官網文檔: https://docs.docker.com/engine/reference/builder
我們需要建立一個自定義java運行鏡像的流程大致是這樣的:
第一:首先把jdk跟項目jar包給拉到一個自己創(chuàng)建的目錄下,然后編寫一個dockerfile文件也拉進來然后運行(最后那個點很重要,他表示在當前目錄下創(chuàng)建鏡像)
dockerfile文件:
# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環(huán)境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local
# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
# 安裝JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置環(huán)境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
COPY ./docker-demo.jar /tmp/app.jar
#這行代碼才是真正的Java運行其他的都可以使用FROM java:8-alpine(版本號)來實現(xiàn)
# 暴露端口
EXPOSE 8090
# 入口,java項目的啟動命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t 名字:版本 .
然后我們跑起來:
docker run --name 隨便取 -p 端口映射:實際端口 -d 名字:版本???
Docker部署微服務集群
? ? ? ? 部署集群:Docker-Compose
? ? ? ? ? ? ? ? 對于dockerCompose的理解:用來部署分布式的一個幫手(要基于compose文件實現(xiàn))
compose文件就是n個docker run命令的集合,但是它用語法替代掉了run,具體是一個yml文件:?
version:?"3.8" #版本號
services:
??mysql: #服務名就是mysql
????image:?mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
????volumes:
?????-?"/tmp/mysql/data:/var/lib/mysql"
?????-?"/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
??web:
????build:?.
????ports:
?????- "8090:8090"
DockerCompose的詳細語法參考官網:https://docs.docker.com/compose/compose-file/ ?
DockerCompose的安裝
不過我們在使用DockerCompose的時候我們需要先對dockerCompose進行一個安裝
安裝:
# 安裝 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改權限 chmod +x /usr/local/bin/docker-compose
# 補全命令 curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果這里有錯誤需要修改host文件
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
如何使用dockerCompose去部署一個服務集群:
首先我們需要一個跟你的Java項目相對應的一個服務包,然后再父工程下面要有一個yml配置文件,然后再每個服務里面還需要又相應的dockerfile文件
#父工程下的yml文件
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql: #并沒有端口,因為不對外訪問
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql" #PWD是當前的意思,方便掛載
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
#dockerfile完成當前構建(這句話的意思是在yml當前文件下找到gateway文件里面的dockerfile文件)
ports:
- "10010:10010" #只對外提供10010端口
然后我們在去自己的Java項目中修改相對應的配置(如之前的localhost要改成相應的服務名字,比如mysql中url的localhost就需要改成mysql,其他服務也類似nacos地址要改成nacos),并且打包后的名字改成dockerfile的內容寫名字
最后準備就緒之后我們使用docker-compose up -d即可后臺運行項目
然后我們使用docker-compose logs -f 來查看日志
結束
Docker的私有鏡像倉庫
? ? ? ? 個人理解:當我們進入公司工作的時候,我么不可能把公司的鏡像放在比如阿里啊
什么的公共鏡像倉庫里面,所以我們就有了私有鏡像倉庫。
搭建鏡像倉庫可以基于Docker官方提供的DockerRegistry來實現(xiàn)。
官網地址:https://hub.docker.com/_/registry
我們有兩個版本:一個是簡化版另一個是帶圖形化界面的版本
使用DockerCompose部署帶有圖象界面的DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=自己取一個自定義名字
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
我們的私服采用的是http協(xié)議,默認不被Docker信任,所以需要做一個配置:
# 打開要修改的文件
vi /etc/docker/daemon.json
# 添加內容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加載
systemctl daemon-reload
# 重啟docker
systemctl restart docker
操作之后我們還需要再去新建一個文件夾用來存儲鏡像mkdir registry-ui
之后我們在去執(zhí)行touch docker-composer.yml 建立一個文件用來編寫compose文件內容
編寫好了之后我們就可以基于compose文件內容創(chuàng)建自己的鏡像docker-compose up -d
結束~~
我們可以在自己定義的網址里面看到自己的私有的鏡像倉庫有些什么內容了。
====================下面是個人感悟============================
學習了docker之后我想更多的是對集群部署有了更多的辦法,比如我們在創(chuàng)建java項目的時候,可以想著我們在虛擬機上進行部署的時候我們需要先做哪些工作。我想這也是docker最大的貢獻吧,可以在不同的環(huán)境下進行程序的部署以及微服務集群的部署,總之很強大的一個功能吧。
柚子快報激活碼778899分享:微服務中的Docker詳細學習
參考文章
本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。