Docker概念、作用、術語
一張超級形象的圖
看到這張圖,大家會想到什么?
可以這么理解:大海是操作系統,鯨魚是Docker,集裝箱是在Docker 運行的容器!
概念
百度百科:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux 或 Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
作用
Docker簡化了環境部署和配置,實現“一次構建,處處運行”,避免了因運行環境不一致而導致的異常
常用術語
Docker主機(Host):安裝了Docker程序的主機,運行Docker守護進程
Docker鏡像 (Image)--類似面向對象中的類:將軟件環境打包好的模板,用來創建容器的,一個鏡像可以創建多個容器
Docker容器(Container)--類似面向對象中的實例:運行鏡像后生成的實例稱為容器,每運行一次鏡像就會產生一個容器,容器可以啟動、停止或刪除;容器使用是沙箱機制,互相隔離,是獨立是安全的;可以把容器看作是一個簡易版的Linux環境,包括用戶權限、文件系統和運行的應用等;
Docker倉庫 (Repository):用來保存鏡像的,倉庫中包含許多鏡像,每個鏡像都有不同的標簽Tag<版本>,官方倉庫: https://hub.docker.com/
使用Docker的步驟
1.安裝Docker 2.從Docker倉庫中下載軟件對應的鏡像 3.運行這個鏡像,此時會生成一個Docker容器 4.對容器的啟動/停止
下面進入實操,建議通過雲服務器來練習:https://www.cnblogs.com/uncleyong/p/12694334.html
Docker安裝及配置
環境要求
Docker要求CentOS7,必須是64位, 且內核是3.10及以上
或者看這里:http://www.docker.org.cn/book/install/rhel-docker-dependance-28.html
安裝centos7(安裝文件加Q群獲取):https://www.cnblogs.com/uncleyong/p/10739997.html
查看內核信息,滿足docker安全要求
uname -r
安裝
卸載舊版本
較舊的 Docker 版本稱為 docker 或 docker-engine。如果已安裝這些程序,請卸載它們以及相關的依賴項。
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
另外,還要刪除鏡像/容器等:rm -rf /var/lib/docker
否則,已有的鏡像/容器刪除不掉
另外,如果誤刪了目錄rm -rf /var/lib/docker
systemctl restart docker,重啟docker后會生成目錄
否則拉取鏡像報錯
安裝docker-ce
https://docs.docker.com/install/linux/docker-ce/ubuntu/
安裝所需軟件包
設置鏡像倉庫
如果報錯
改為
生成緩存
安裝
查看版本
可以看到是go語言寫的
docker version
啟動
systemctl start docker
查看狀態
systemctl status docker
docker info
停止
systemctl stop docker
重啟
systemctl restart docker
設置開機啟動
systemctl enable docker
驗證
驗證是否正確安裝了docker,方法是運行hello-world鏡像
本地沒有hello-world鏡像,就從遠程拉
docker run
配置鏡像加速器
登錄阿里雲獲取鏡像加速器地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
配置自己的docker加速器
最后執行重啟命令:
Docker操作(鏡像、容器、更新構建鏡像)
鏡像操作
查找
docker search 鏡像名
參數說明: NAME: 鏡像倉庫源的名稱 DESCRIPTION: 鏡像的描述 OFFICIAL: 是否 docker 官方發布 stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。 AUTOMATED: 自動構建。
也可以通過docker官網搜索mysql
點擊查看詳情
查看可以標簽
拉取
docker pull 鏡像名:版本,如果版本不指定,默認就是latest
拉取完成
查看所有本地鏡像
docker images
各個選項說明: REPOSITORY:表示鏡像的倉庫源 TAG:鏡像的標簽(版本) IMAGE ID:鏡像ID CREATED:鏡像創建時間 SIZE:鏡像大小
查看完整鏡像id,可以加--no-trunc參數
獲取鏡像詳細信息
docker inspect 鏡像id
上面id才是鏡像的完整id
版本
端口
msyql數據文件
刪除指定的本地鏡像
docker rmi -f 鏡像id或者鏡像名:tag,rmi全英文是remove image,-f表示強制刪除
容器操作
運行容器
只有200M,是精簡版centos(linux),只包含系統運行最基本的內核和庫
@后面是容器的id
退出並關閉容器
容器中,很多命令沒有,比如ifconfig,可以這樣安裝:yum install -y net-tools
查看容器
docker ps -a
可以看到狀態是Exited
-q,只顯示容器id
docker ps -aq
啟動容器
docker start
只顯示運行的,docker ps
停止容器
docker stop
刪除容器
docker rm
一個鏡像可以生成多個容器,啟動時不指定名稱,名稱是是隨機定義的
批量刪除容器
docker rm -f $(docker ps -aq)
示例(含docker commit方式更新鏡像)
不能訪問,因為tomcat不是直接跑在虛擬機上的,而是跑在虛擬機上docker里面容器里的
192.168.0.105:8080
刪除容器
docker rm
運行容器
可以訪問,但是報404
192.168.0.105:9999
加入容器
如果報錯,可能版本是1.13.1 ,升級到ce版本可以解決,詳見:本文安裝docker部分
也可以根據docker官方文檔配置yum源,重新安裝,https://docs.docker.com/install/linux/docker-ce/centos/
下面兩個圖就是我之前安裝的docker
如果是ce版本,就沒問題,如下圖
進入webapps文件夾,是空的(tomcat默認的歡迎頁面實際上放在的路徑應該是webapps/ROOT/index.jsp或者index.html),旁邊還有個webapps.dist的文件,進入才發現原本應該在webapps文件中的文件都在webapps.dist文件中。所以將webapps.dist重命名為webapps。
改名后
更新鏡像:docker commit
將修改后的容器提交生成一個新鏡像
-m是描述,-a是作者
通過新鏡像,運行容器
加上版本
訪問,成功
192.168.0.105:8888
tomcat后台運行,-d
先刪除容器
返回了完整容器id
查看,docker ps
只顯示12位容器id
停止
啟動
查看日志
docker logs 容器id或者容器名稱
下面看到的就是tomcat的啟動日志
拷貝
宿主機拷貝到容器中
docker cp
可以訪問到
192.168.0.105:8888
容器拷貝到宿主機
拷貝到當前目錄
在宿主機中可以看到
掛載
共享目錄,運行下面的命令
docker run \ --name mytomcat2_con \ -p 8888:8080 \ -v /root/docker_test/tomcat/mydata:/usr/local/tomcat/mydata \ -d mytomcat2:v2
mydata目錄在容器中會自動創建,可以看到宿主機對應目錄下的文件
容器中新增2.txt,3.txt
宿主機中可以看到容器中新增的文件
獲取元信息
docker inspect 容器id
默認是rw,表示讀寫,如果容器中不能改,可以改為只讀ro
-v /root/docker_test/tomcat/mydata:/usr/local/tomcat/mydata:ro
包含了jdk
創建鏡像(含Dockerfile講解、自定義鏡像)
創建鏡像的方式
更新鏡像:使用docker commit命令,詳見本文容器操作部分,可以文中搜索commit
構建鏡像:使用docker build命令,需要創建Dockerfile文件,下面講解
Dockerfile
Dockerfile是用來構建Docker鏡像的文件,是由一系列指令和參數構成的腳本,從FROM命令開始,緊接着各種命令、參數等,最終會生成一個新的鏡像。
第一條指令必須是FROM,指定Base Image基礎鏡像,指令按從上往下的順序,依次執行,每條指令都會創建一個新的鏡像層並提交
常用指令
FROM:指定基礎鏡像,即當前新鏡像是基於哪個鏡像的 MAINTAINER:指定作者 RUN:指定鏡像構建過程中要運行的命令 ENV:設置環境變量 WORKDIR:指定默認的工作目錄,即進入容器后默認進入的目錄 VOLUME:創建掛載點,也稱容器數據卷,用於數據共享和持久化 CMD:指定容器啟動時要運行的命令,與RUN不同的是, 這些命令不是在鏡像構建過程中執行的 ENTRYPOINT:指定容器啟動時要運行的命令 COPY:拷貝文件/目錄到鏡像中 ADD:拷貝文件到鏡像中,且會自動解壓縮 EXPOSE:指定對外暴露的端口
我們來看下官方tomcat的Dockerfile是如何寫的
指定基礎鏡像、環境變量
暴露端口8080
運行容器,就把tomcat啟動起來
自定義tomcat鏡像
有時候,官方提供的鏡像不一定滿足我們的需求,我們想用自己期望的jdk、tomcat版本,那么,我們可以基於一個精簡版centos來制作
FROM centos MAINTAINER qzcsbj # 拷貝文件 ADD jdk-8u211-linux-x64.tar.gz /usr/local ADD apache-tomcat-9.0.19.tar.gz /usr/local # 配置環境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_211 ENV CLASSPATH .:$JAVA_HOME/lib ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.19 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin WORKDIR $CATALINA_HOME EXPOSE 8080 # 鏡像運行容器就把tomcat啟動起來 CMD ["catalina.sh", "run"]
運行容器
docker run \ --name qzcsbj_tomcat \ -p 8181:8080 \ -d qzcsbj/tomcat:1.0
192.168.0.105:8181
把自定義鏡像推送到鏡像倉庫
創建命名空間
創建鏡像倉庫
鏡像推送到阿里雲
下面給了login、push、pull的命令
1. 登錄阿里雲Docker Registry $ sudo docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com 用於登錄的用戶名為阿里雲賬號全名,密碼為開通服務時設置的密碼。您可以在訪問憑證頁面修改憑證密碼。 2. 從Registry中拉取鏡像 $ sudo docker pull registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[鏡像版本號] 3. 將鏡像推送到Registry $ sudo docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[鏡像版本號] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[鏡像版本號] 請根據實際鏡像信息替換示例中的[ImageId]和[鏡像版本號]參數。
設置登錄阿里雲的docker倉庫密碼
登錄
docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com
指定鏡像tag歸入倉庫
docker tag ab8ba635b677 registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
將鏡像推送到倉庫
docker push registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
push成功
push的鏡像
層信息
搜索鏡像
鏡像信息
也可以修改信息
實戰1:使用Docker搭建環境
安裝tomcat,部署war包
拉取剛剛push的tomcat鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
war包在Q群文件
運行容器
docker run \ --name qzcsbj_tomcat4 \ -p 8184:8080 \ -v /root/my_docker/qzcsbj_springboot_war.war:/usr/local/apache-tomcat-9.0.19/webapps/qzcsbj_springboot_war.war \ -d registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
192.168.0.105:8184/qzcsbj_springboot_war/test
war包對應的代碼:
安裝mysql、nginx、redis
安裝方式都差不多(創建掛載目錄,拷貝並修改配置文件)
詳細步驟略,如有問題,請聯系作者。
建議通過雲服務器來練習:https://www.cnblogs.com/uncleyong/p/12694334.html
實戰2:Docker+JMeter+Grafana+Influxdb搭建可視化性能測試監控平台
詳見:
https://www.cnblogs.com/uncleyong/p/11885192.html
常用命令回顧
具體含義見下圖官方解釋。
docker version
docker info
docker search
docker pull
docker images
docker rmi
docker run
docker logs
docker ps
docker exec
docker start
docker restart
docker stop
docker status
docker rm
docker commit
docker build
docker inspect
docker cp
docker login
docker tag
docker push
更多:
最后記錄一個問題
運維角度用docker:https://www.cnblogs.com/uncleyong/p/10069429.html
參考資料:https://www.runoob.com/docker/docker-tutorial.html