官網地址:https://www.docker.com/html
文檔地址:https://docs.docker.com/java
#1.卸載舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #2.安裝存儲庫 sudo yum install -y yum-utils #3.設置鏡像倉庫 #默認是國外鏡像,比較慢 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #推薦使用國內的阿里雲鏡像 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4.安裝docker引擎(最新版本) sudo yum install docker-ce docker-ce-cli containerd.io #5.啓動docker sudo systemctl start docker #測試docker安裝成功 docker version #6.測試Helloword sudo docker run hello-world
#1.卸載 Docker Engine、CLI 和 Containerd 包: sudo yum remove docker-ce docker-ce-cli containerd.io #2.主機上的映像、容器、卷或自定義配置文件不會自動刪除。刪除全部鏡像、容器和卷: sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd #/var/lib/docker docker的默認工做路徑
登錄阿里雲官網找到容器鏡像服務mysql
鏡像加速地址linux
配置使用nginx
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://cvftrj14.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
docker version #顯示docker的版本信息 docker info # 顯示docker的系統信息 docker 命令 --help #幫助命令
幫助文檔地址:https://docs.docker.com/reference/git
docker images #查看全部本地的主機上的鏡像 docker search xx #搜索xx鏡像 docker pull xx #拉取下載xx鏡像 docker rmi -f 鏡像id #刪除指定的鏡像 docker rmi -f 鏡像id 鏡像id #刪除多個鏡像 docker rmi -f $(docker images -aq) #刪除所有的容器
#新建容器並啓動 dockers run [可選參數] 鏡像id或名字 docker run -d --name nagin01 -p 3344:80 nginx #參數說明 --name="Name" #容器名字 -d #後臺方式運行 -it #使用交互方式運行,進入容器查看內容 -p #指定容器的端口 -p 8080:8080 (主機端口:容器端口) -P #隨機指定端口 #啓動並進入容器 docker run -it centos /bin/bash #退出容器 exit#直接退出容器並中止 ctrl+Q+P #容器不中止退出 #列出全部的容器 docker ps [可選參數] #可選參數 -a #列出全部的容器 -n #顯示最講建立的容器 -q #只顯示容器的id #刪除容器 docker rm 容器id #刪除指定容器 docker rm -f $(docker ps -aq) #強制刪除全部的容器 #啓動和中止容器 docker start 容器id #啓動指定的容器 docker restart 容器id #重啓指定的容器 docker stop 容器id #中止指定的正在運行容器 docker kill 容器id #強制中止指定的容器
#查看日誌、 docker logs #查看容器中的進程信息 docker top 容器id #查看鏡像元數據 docker inspect 容器id #進入正在運行的容器 docker exec -it 容器id /bin/bash docker attach 容器id #這兩種方式的區別 #docker exec 進入容器開啓一個新的終端,能夠在裏面操做 #docker attach 進入容器正在執行的終端,不會啓動新的線程 #從容器內拷貝文件到主機上 docker cp 容器id:容器內路徑 目的地主機路徑 #查看cpu的狀態 docker stats
docker run -it --rm tomcat:9.0 #咱們以前的啓動都是後臺,中止了容器後,容器還能夠查看,這個命令是用完後就刪除容器,通常用於測試
portainer(暫時先用)github
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Rancher(CI/CD再用)web
Portainer是一個可視化的容器鏡像的圖形管理工具,利用Portainer能夠輕鬆構建,管理和維護Docker環境。 並且徹底免費,基於容器化的安裝方式,方便高效部署。redis
官方站點:https://www.portainer.io/spring
#1.下載並啓動 docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce #2.開放端口並外網訪問測試 www.enora.com.cn:9000
訪問後頁面以下,首先選擇Docker的connect
進入docker 管理的主頁
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境開發的軟件,它包含了運行某個軟件所需的全部內容,包括代碼、運行時、庫、環境變量和配置文件。全部的應用,直接打包docker鏡像,就能夠直接跑起來!
如何獲得鏡像
UnionFS(聯合文件系統)
UnionFS(聯合文件系統):是一種分層、輕量級並高性能的文件系統,它支持對文件系統的修改,做爲一次提交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下。Union文件系統是Docker鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統包含全部底層的文件和目錄。
Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統是UnionFS。採用分層構建機制,最底層爲bootfs,其之上rootfs。
bootfs:(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kennel,linux剛啓動是會加載bootfs文件系統,再docker鏡像的最底層是bootfs。這一層與咱們典型的Linux/Unix系統是同樣的,包含bootj加載器和內核。當boot加載完成後整個內核就在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs: 位於bootfs之上,rootfs是Docker容器在啓動時內部進程可見的文件系統,即Docker容器的根目錄。rootfs一般包含一個操做系統運行所需的文件系統,例如可能包含典型的類Unix操做系統中的目錄系統,如/dev、/proc、/bin、/etc、/lib、/usr、/tmp及運行Docker容器所需的配置文件、工具等。
特色
Docker鏡像都是隻讀的,當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層就是咱們一般說的容器層,容器層之下的都叫鏡像層
如何提交一個本身的鏡像
docker commit #提交容器成爲一個新的副本 #命令和git原理相似 docker commit -m="提交的描述信息" -a="做者" 容器id 目標鏡像名:[TAG]
實戰測試
#1. 啓動一個默認的tomcat docker run -d -p 8080:8080 46cfbf1293b1 #2. 發現這個默認的tomcat是沒有webapps應用,鏡像的緣由官方的鏡像默認webapps下面是沒有文件的 #3. 本身拷貝基本的文件到webapps文件夾下 cp -r webapps.dist/* webapps #4.將咱們操做過的容器經過commit提交爲一個新的鏡像,之後咱們就能夠直接使用咱們修改過的鏡像便可 docker commit -a="sean" -m="add apps into webapps folder" 3de860244cd4 tomcat_sean:v0.1
當咱們在使用docker容器的時候,會產生一系列的數據文件,這些數據文件在咱們關閉docker容器時是會消失的,可是其中產生的部份內容咱們是但願可以把它給保存起來另做用途的,Docker將應用與運行環境打包成容器發佈,咱們但願在運行過程鍾產生的部分數據是能夠持久化的的,並且容器之間咱們但願可以實現數據共享。
容器之間能夠有一個數據共享的技術,將Docker容器中產生的數據,同步到本地!這就是卷技術。目錄的掛載將容器內的目錄掛載到Linux上面。
總結:容器的持久化和同步操做,容器間也是能夠同步數據的!
docker run -it -v 主機目錄:容器內目錄
測試
1.啓動運行容器
docker run -it -v /home/sean:/home 300e315adb2f
2.啓動起來後能夠經過 命令docker inspect 容器id
查看掛載狀況
docker inspect 8a5f116da90b
之後修改只需再本地修改便可,容器內會自動同步
思考:Mysql的數據持久化的問題
#獲取鏡像 docker pull mysql:5.7 #運行容器的時候,須要作數據掛載,須要注意的是Mysql須要配置密碼(參考官方文檔),若是沒有設置密碼的化,容器是啓動不起來的 docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MY_SQL_ROOT_PASSWORD=root mysql:5.7
容器運行後,使用Navicat 軟件鏈接docker的Mysql
在數據庫中新建一個數據庫
如今進入宿主機服務器目錄/home/mysql/data,查看是否有剛纔建立的數據庫
以上測試代表:容器內的mysql中的數據已經同步到服務器本地咯,實現了容器數據持久化功能
具名和匿名掛載
匿名掛載
在使用-v 進行數據卷掛載的時候,只有容器內路徑,即-v 容器內路徑
#匿名掛載 docker run -d -P --name nginx01 -v /etc/nginx nginx
查看全部的volume的狀況
docker volume ls
這種沒有一串隨機數字的就是匿名掛載生成的volume name
具名掛載
在使用-v 進行數據卷掛載的時候,卷名:容器內路徑,即-v 卷名:容器內路徑
docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx nginx
查看volume的狀況
查看該卷
docker volume inspect sean_nginx
全部的docker容器內的卷,沒有指定目錄的狀況下都是在該目錄下/var/lib/docker/volumes/xxx/data
經過具名掛載能夠方便的找到咱們的一個卷,大多數狀況下都使用具名掛載
#如何區分匿名、具名、指定路徑掛載 -v 容器內路徑 #匿名掛載 -v 卷名:容器內路徑 #具名掛載 -v /宿主機路徑:容器內路徑 #指定路徑掛載
拓展:
#經過 -v 容器內路徑:ro rw 改變讀寫權限 ro:read only #只讀 rw: readwrite #可寫可讀 docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx:rw nginx #ro 說明這個路徑只能經過宿主機來操做,容器內部是沒法操做的
初識DockerFile
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。經過這個腳本能夠生成鏡像,鏡像是一層一層的,腳本一個一個的命令,每一個命令都是一層。
FROM centos VOLUME ["volume01","volume02"] CMD '---------end-----------' CMD /bin/bash
構建docker鏡像
docker build -f dockerFile1 -t centos_sean . #-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile') # -t, --tag list Name and optionally a tag in the 'name:tag' format
運行生成的鏡像,能夠看到是能夠運行進入到容器內的
這個卷和外部必定有一個同步的目錄
#經過docker inspect能夠查看對應的掛載目錄 docker inspect 4daed2f6eb77
數據卷容器(容器間的數據共享)
命名的容器掛載數據卷,其餘容器經過掛載這個父容器實現數據共享,掛載數據卷的容器稱爲數據卷容器。
建立數據卷容器
docker run -it --name dc01 imageName #啓動dc01容器 docker run -it --name dc02 --volumes-from dc01 imageName #dc02繼承自dc01
容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止!!!
應用:多個Mysql共享數據或者nginx共享數據
總結:經過--volumes-from能夠實現容器間的數據共享。
參考:https://www.cnblogs.com/lwenwu/p/14029573.html
dockerFile是用來構建docker鏡像的文件,命令參數腳本
構建步驟:
首先了解官方鏡像(centos爲例)
點擊版本號後跳轉到github,發現github上就是DockerFile文件
官方既然能夠製做鏡像,那咱們也能夠本身製做本身的鏡像,不少官方鏡像都是基礎包,不少功能都沒有,一般會本身構建本身的鏡像
基礎知識:
dockerfile是面向開發的,之後要發佈項目,作鏡像都須要編寫dockerfile文件!Docker鏡像逐漸成爲一個企業的交付標準,必須掌握。
步驟:
DockerFile:構建文件,定義了一切的步驟,至關於源代碼
DockerImages:經過dockerfile構建生成的鏡像,最終發佈和運行的產品
Docker容器:容器就是鏡像運行起來提供服務器
FROM #基礎鏡像,一切從這裏開始構建 MAINTAINER #鏡像是誰寫的,姓名+郵箱 RUN #鏡像構建的時候須要運行的命令 ADD #添加內容,好比要在centos基礎上添加tomcat就須要使用該命令 WORKDIR #鏡像的工做目錄 VOLUME #掛載的目錄 EXPOST #保留端口配置 CMD #指定這個容器啓動的時候要運行的命令,只有最後一個會生效,可被替代 ENTRYPOINT #指定這個容器啓動的時候要運行的命令,能夠追加命令 ONBUILD #當構建一個被繼承DockerFile,這個時候就會運行ONBUILD的指令,觸發指令 COPY #相似ADD,將文件拷貝到鏡像中 ENV #構建時設置環境變量
實戰:構建一個本身的鏡像
#1.編寫DockerFile文件 FROM centos MAINTAINER xuxin<sean_xin@126.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "-----end------" CMD /bin/bash #2.構建鏡像 docker build -f myCentos -t myCentos . #3.測試運行 docker run -d 86f274d241ef
發現pwd命令、工做目錄等都已經按照dockerfile修改了
#鏡像的歷史變動,平時拿到一個鏡像,可使用該命令研究它的建立過程 docker history 鏡像id
準備鏡像文件tomcat壓縮包,jdk的壓縮包
編寫dockerfile文件,官方命名Dockerfile
FROM centos MAINTAINER sean<sean_xin@126.com> COPY readme.txt /usr/local/readme.txt ADD apache-tomcat-7.0.81.tar.gz /usr/local ADD jdk-8u211-linux-x64.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_211 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.81 ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.81 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-7.0.81/bin/startup.sh && tail -F /usr/local/apche-tomcat-7.0.81/bin/catalina.out
構建鏡像(使用Dockerfile命令後不用-f命令)
docker build -t diytomcat .
運行鏡像
docker run -d -p 9090:8080 --name seantomcat -v /home/sean/test:/usr/local/apache-tomcat-7.0.81/webapps/test -v /home/sean/tomcatlogs/:/usr/local/apache-tomcat-7.0.81/logs diytomcat
訪問測試
發佈項目(因爲作了卷掛載,能夠直接再本地編寫項目就發佈)
發佈鏡像到dockerHub
官網註冊帳號:https://hub.docker.com/
登陸dockerHub
docker login -u724056979
提交鏡像
#首先須要對鏡像進行打tag標籤,用dockerhub帳戶名/鏡像名:版本號 docker tag centos_sean:latest 724056979/centos:1.0 #而後使用push命令提交鏡像 docker push 724056979/centos:1.0
發佈鏡像到阿里雲
登陸阿里雲
找到容器鏡像服務
建立命名空間
建立容器鏡像
建立成功後,根據阿里雲提示操做
小結:
#經常使用的docker network命令 docker network --help #獲取docker網絡命令幫助 docker network ls #獲取dockers全部的網絡 docker network inspect networkId #查看具體network的元數據
測試:3個重要的網卡地址
思考:docker是如何處理容器網絡訪問的?
宿主機能夠ping通docker運行的容器嘛?
#查看容器內地址 docker exec -it tomcat01 ip addr
發現容器啓動的時候會獲得一個eth0@if72 ip地址,docker分配的。
說明宿主姐能夠ping通容器內部
原理
每啓動一個docker容器,docker就會給docker容器分配一個ip,只要安裝了docker,就會有一個網卡docker0,使用橋接模式,其使用的技術就是evth-pair技術!
ip addr
發現會多一個網卡再啓動一個tomcat容器,並查看地址,發現又多一對網卡地址73:vetha2920@if72
#啓動tomcat02容器 docker run -d --name tomcat02 tomcat #查看ip地址 ip addr
veth-pair就是一對的虛擬設備接口,他們都是成對出現的,正是由於有這個特性,一端連着協議,一端彼此相連,evth-pair充當一個橋樑,鏈接各類虛擬網絡設備的
測試如下tomcat01和tomcat02是否能夠ping 通
docker exec -it tomcat02 ping 172.17.0.2
結論:容器和容器之間是能夠互相ping通的
Docker核心網絡圖:docker中的全部的網絡接口都是虛擬的,虛擬的轉發效率高!只要刪除容器,對應網橋也就刪除
思考一個場景,編寫一個微服務,database url=ip,項目部重啓,數據庫ip換掉了,能夠經過名字來進行訪問容器。也就是說能夠想springcloud的服務發現與註冊同樣使用名稱來註冊服務,而不是使用IP地址的方式
#同時啓動了2個tomcat容器 docker ps
#都直接使用容器名可否ping通呢? docker exec -it tomcat01 ping tomcat02
發現都使用容器名是不能ping通的,該如何解決這個問題呢?可使用docker --link
解決網絡連通問題
#使用--link從新啓動過一個tomcat03 docker run -d -P --name tomcat03 --link tomcat02 tomcat #使用容器名tomcat03 ping tomcat02 docker exec -it tomcat03 ping tomcat02
測試發現經過--link
可使用容器名互相通訊的。可是可使用tomcat02 ping tomcat03嗎?繼續測試
#使用容器名tomcat02 ping tomcat03 docker exec -it tomcat02 ping tomcat03
測試發現這樣是不行的,探究其中的原理
#查看tomcat03的host文件配置 docker exec -it tomcat03 cat /etc/hosts
--link
本質:就是在hosts配置中增長了一個tomcat02的映射,如今不推薦使用--link
,可使用docker 自定義網絡,不使用docker0來實現。docker0存在的問題:不支持容器名進行鏈接訪問。
網絡模式:
bridge: 橋接 docker(默認) none: 不配置網絡 host: 和宿主機共享網絡
測試
建立自定義網絡
docker network create
命令
#直接啓動的命令,默認添加了--net bridge,而這個就是docker0 docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat #docker0不能經過容器名進行網絡連通,可使用--link #使用自定義網絡 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
查看自定義網絡mynet,咱們本身的網絡就建立好了
容器使用自定義網絡
#運行tomcat容器使用自定義網絡mynet docker run -d -P --name tomcat-net-01 --net mynet tomcat #查看mynet自定義網絡元數據 docker network inspect mynet
使用自定義網絡來經過容器名來連通
#使用自定義網絡再運行一個tomcat-net-02 docker run -d -P --name tomcat-net-02 --net mynet tomcat #連通測試 docker exec -it tomcat-net-01 ping tomcat-net-02 docker exec -it tomcat-net-02 ping tomcat-net-01
自定義網絡能夠不使用--link也能夠經過容器名互相連通,docker都已經維護好了對應的關係,推薦平時使用自定義網絡。
使用自定義網絡的好處:對於不通的集羣使用不一樣的網絡,保證集羣的安全和健康
好比:mysql集羣可使用192.168.0.2這樣網段內的地址,而redis集羣可使用192.167.0.2這樣的網段實現互相隔離。
思考:以下圖所示網絡,處於不一樣網段的兩個容器如何實現tomcat-01與tomcat-net-01的互相連通?
#兩個容器能夠直接連通嗎? docker exec -it tomcat-01 ping tomcat-net-01
通過測試發現這樣是不可能連通的,應該怎麼處理呢?可使用docker network connect
命令,實現一個容器與網卡直接相連
#打通tomcat01與mynet網絡 docker network connect mynet tomcat01 #查看mynet網絡的元數據 docker network inspect mynet
通過測試發現使用docker network connect
,連通後把tomcat01添加到了mynet網絡裏,即一個容器2個IP,好比阿里雲主機也有2個IP地址(內網和外網地址)
#再次測試tomcat01 ping tomcat-net-01 docker exec -it tomcat01 ping tomcat-net-01
結論:假設要跨網絡操做,就須要使用docker network connect
連通
構建springboot項目
打包應用
編寫Dockerfile
下載docker插件
編寫Dockerfile文件
FROM java:8.0 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
上傳jar包和Dockerfile文件
構建鏡像
發佈運行測試
之後使用了docker以後,交付給別人的就是一個鏡像文件
Compose 是用於定義和運行多容器 Docker 應用程序的工具。經過 Compose,您可使用 YML 文件來配置應用程序須要的全部服務。而後,使用一個命令,就能夠從 YML 文件配置中建立並啓動全部服務。
Compose 使用的三個步驟:
官網文檔地址:https://docs.docker.com/compose/
下載 Docker Compose 的當前穩定版本
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #這個可能快點 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
受權
sudo chmod +x /usr/local/bin/docker-compose
測試安裝
docker-compose version
出現該畫面說docker-compose安裝成功。
官方文檔:https://docs.docker.com/compose/gettingstarted/
之前都是單個docker run 啓動容器,如今經過docker-compose編程yaml配置文件,能夠經過compose一鍵啓動、中止全部服務。
官方文檔:https://docs.docker.com/compose/compose-file/compose-file-v3/
對於yaml文件的構成主要是由3層
version: #第一層 版本號 services: #第二層 service1:web images build ... service2: redis ... #第三層,其餘配置,網絡/卷/全局規則 volumes: networks:
特別注意在啓動多個服務的時候,他們之間有前後順序,須要使用depends_on
來限定服務的啓動順序
version: "3.9" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
官方文檔: https://docs.docker.com/samples/wordpress/
建立一個my_wordpress的文件夾並進入
mkdir my_wordpress cd my_wordpress
編寫docker-compose.yml文件
version: "3.9" services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} wordpress_data: {}
訪問測試