【docker】docker学习
docker概念
docker主機(Host):安裝了Docker程序的機器(Docker直接安裝在操作系統(tǒng)之上);
docker客戶端(Client):連接docker主機進行操作﹔
docker倉庫(Registry):用來保存各種打包好的軟件鏡像﹔
docker鏡像(Images):軟件打包好的鏡像﹔放在docker倉庫中;
鏡像就像安裝包,容器就是安裝的應(yīng)用程序
可以通過鏡像安裝多個相同的應(yīng)用程序,但是端口號不能相同
安裝docker:
- yum包更新 【sudo yum update】
- 安裝軟件包yum-util提供yum-config-manager功能【sudo yum install -y yum-utils device-mapper-persistent-data lvm2】
- 設(shè)置yum源 【sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo】
- 安裝docker 【sudo yum install docker -ce】
- 查看版本:【docker -v】
- 啟動docker 根據(jù)linux版本進行相應(yīng)命令
操作docker相關(guān)命令
檢查內(nèi)核版本,必須是3.10及以上【uname ‐r】 安裝docker(輸入y確認(rèn)安裝)【yum install docker 】 查看版本【docker ‐v】 開機啟動docker 【systemctl enable docker】啟動docker 【systemctl start docker 】 停止docker 【systemctl stop docker】 docker概要信息【docker info】 docker幫助文檔【docker --help】鏡像倉庫
Docker默認(rèn)倉庫地址是Docker Hub官網(wǎng)地址。
設(shè)置ustc鏡像便于docker拉取某些需要的鏡像 ustc:老牌linux鏡像服務(wù)提供者 ustc的docker鏡像加速器速度很快
- 編輯文件【vi /etc/docker/daemon.json】
- 輸入內(nèi)容
鏡像與容器
鏡像命令
鏡像是構(gòu)建docker的基石,可以將鏡像當(dāng)做容器的源代碼 體積小,便攜,易分享存儲和更新
由于鏡像可能重名(如版本不同),所有通過tag即標(biāo)簽區(qū)分
鏡像可以從所設(shè)置的源中拉取
- 【docker images】 查看鏡像
- 【docker search 鏡像名稱】 搜索鏡像 如:docker search redis
- 【docker pull 鏡像名稱:tag】 拉取鏡像
- 【docker rmi 鏡像id】 刪除鏡像 鏡像有運行中的容器時不能刪除
- 【docker rmi ‘docker images -q’】 刪除全部鏡像
容器命令
通過鏡像簡單啟動容器:【docker run -d 容器名稱:標(biāo)簽】
通過鏡像啟動容器(指定參數(shù)):【docker run --name 自己給容器隨便取個名稱(–name和這里的名稱可省) -p 主機端口:容器端口 -d 容器名稱:標(biāo)簽】
- 標(biāo)簽即相當(dāng)于版本,latest標(biāo)簽即最新的意思
- 參數(shù):
- –name 容器名稱
- [-p]為docker和本機物理端口映射
- [-d]為后臺運行
容器命令:
-
查看正在運行的容器 :【docker ps】
-
查看所有容器: 【docker ps -a】
-
查看最后一次運行的容器:【docker ps -l】
-
啟動容器:【docker start 容器名稱或id】
-
停止容器:【docker stop 容器名稱或id】
-
文件拷貝:【docker cp 待拷貝文件路徑 容器名稱:路徑】宿主機到容器 容器關(guān)閉時也可以正常拷貝文件進去
-
查看容器ip:
- 【docker inspect 容器名稱】 顯示一推信息
- 【docker inspect --format=’{{.NetWorkSettings.IPAddress}}’ 容器名稱 】 直接顯示ip地址,其他信息也可以這樣顯示
-
刪除容器:【docker rm 容器名稱】 需要停止容器后才能進行移除
-
進入容器:【docker exec -it 容器名稱或id /bin/bash】 進入容器后操作命令和linux一致就行
-
退出到宿主機位置 容器停止:【docker exit】
-
查看容器運行日志:【docker logs -f 容器tag】
交互式容器
使用交互式運行容器,容器運行后直接進入到容器內(nèi)部,退出容器內(nèi)部后,容器直接關(guān)閉
創(chuàng)建交互式容器:【docker run -it --name 容器名稱 鏡像名稱:標(biāo)簽 /bin/bash 】
- 交互式創(chuàng)建容器后即進入到容器
- 參數(shù):
- -i:表示運行容器
- -t:表示容器啟動后會進入其命令行。加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端。
- 每個容器相當(dāng)于一個小電腦(服務(wù)器)
通過鏡像啟動容器 也可以通過docker exec -it 容器名稱或id /bash 進入容器進行操作
守護式容器
守護式進程的特點是:
- 能夠長期運行
- 沒有交互式會話
- 適合運行應(yīng)用程序和服務(wù)
創(chuàng)建守護式容器: 【docker run -id --name 容器名稱 鏡像名稱:標(biāo)簽】
將容器保存為鏡像
# 基于自己容器創(chuàng)建的鏡像創(chuàng)建容器,該新建的容器默認(rèn)包含自己容器所擁有的資源,因為是基于其創(chuàng)建的 【docker commit 容器名稱 鏡像名稱】 【docker run -di --name=myxxx -p 宿主機端口:容器端口 自己容器所保存的鏡像名稱】 # 鏡像導(dǎo)入導(dǎo)出 【docker save -o 文件路徑 鏡像名稱】 鏡像導(dǎo)出為鏡像文件 【docker load -i 文件路徑】 鏡像文件恢復(fù)為鏡像docker數(shù)據(jù)卷
目錄掛載:宿主機目錄和容器目錄形成映射關(guān)系。 目錄掛載后,操作宿主機的目錄即操作容器的目錄
創(chuàng)建容器時加【-v 宿主機目錄:容器目錄】 如: 【docker run -id --name=mycentos3 centos:7 -v /usr/local/myhtml:/usr/local/myhtml】 【docker run -id -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7】也可以目錄掛載即docker數(shù)據(jù)卷。需求:為了部署demo工程,需要使用到cp的命令將宿主機內(nèi)的demo文件復(fù)制到容器內(nèi)部
數(shù)據(jù)卷:將宿主機的一個目錄,映射到容器的一個目錄中,可以在宿主機中操作目錄中的內(nèi)容,那么容器內(nèi)部映射的文件,也會跟著一起改變。
- 創(chuàng)建數(shù)據(jù)卷:【docker volume create 數(shù)據(jù)卷名稱】 創(chuàng)建數(shù)據(jù)卷之后,默認(rèn)會存放在一個目錄下/var/1ib/docker/volumes/數(shù)據(jù)卷名稱/_data
- 查看數(shù)據(jù)卷的詳細(xì)信息【docker volume inspect 數(shù)據(jù)卷名稱】
- 查看全部數(shù)據(jù)卷:【docker volume ls】
- 刪除數(shù)據(jù)卷 【docker volume rm 數(shù)據(jù)卷名稱】
- 應(yīng)用數(shù)據(jù)卷
Dockerfile
Dockerfile就是一系列命令和參數(shù)構(gòu)成的腳本 這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個新的鏡像。 文件名稱:【Dockerfile】
存在意義:更方便構(gòu)建鏡像文件
- 開發(fā):提供一個完全一致開發(fā)環(huán)境
- 測試:直接拿開發(fā)時構(gòu)建的鏡像或通過dockerfile文件構(gòu)建一個鏡像開始工作
- 運維:部署時可以實現(xiàn)應(yīng)用無縫移植
相關(guān)指令:
- 【from image_name:tag】定義使用哪個基礎(chǔ)鏡像啟動構(gòu)建流程
- 【maintainer user_name】聲明鏡像創(chuàng)建者
- 【env key value】設(shè)置環(huán)境變量(可寫多條)
- 【run command】dockerfile的核心部分(可寫多條)
- 【add source_dir/file dest_dir/file】宿主機文件復(fù)制到容器內(nèi) 如果是壓縮文件,復(fù)制后會自動解壓
- 【copy source_dir/file dest_div/file】和add類似,但有壓縮文件不會被解壓
- 【workdir path_div】 設(shè)置工作目錄
例子:構(gòu)建jdk1.8鏡像 基于centos:7
- 創(chuàng)建目錄 上傳jdk的tar包 進入目錄
- 構(gòu)建dokerfile文件 名稱必須叫dockerfile 進入文件
- 編寫文件 保存
【docker build -t=‘jdk1.8’ Dockerfile所在目錄】 所在當(dāng)前目錄則用 .表示 通過Dockerfile構(gòu)建鏡像
說明
Docker以從上到下的順序運行Dockerfile的指令。為了指定基本鏡像,第一條指令必須是FROM。一個聲明以#字符開頭則被視為注釋。
可以在Dpcker文件中使用RUN,CMD,FROM,EXPOSE,ENv等指令。
構(gòu)建鏡像:【docker bui1d -t 鏡像名稱[:tag]】
基本結(jié)構(gòu)
- 基礎(chǔ)鏡像信息
- 維護者信息
- 鏡像操作指令
- 容器啟動時執(zhí)行指令
常用指令
from:指定基礎(chǔ)鏡像,必須為第一個命令
# 格式:FROM <image>FROM <image> :<tag>FROM <image>@<digest> #示例: FROM mysq1 :5.6# 注: tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎(chǔ)鏡像maintainer:維護者信息
# 格式:MAINTAINER <name> # 示例:MAINTAINER Jasper XuMAINTAINER sorex@163.comMAINTAINER Jasper Xu<sorex@163.com>run:構(gòu)建鏡像時執(zhí)行的命令
RUN用于在鏡像容器中執(zhí)行命令,其有以下兩種命令執(zhí)行方式:she11執(zhí)行 # 格式:RUN <command> # exec執(zhí)行格式:RUN [ "executab1e","param1", "param2"] # 示例:RUN [ ""executable","param1","param2""]RUN apk updateRUN ["/etc/execfi1e","arg1","arg1"]# 注:RUN指令創(chuàng)建的中間鏡像會被緩存,并會在下次構(gòu)建中使用。如果不想使用這些緩存鏡像,可以在構(gòu)建時指定--no-cache參數(shù),如: docker build --no-cacheadd:將本地文件添加到容器中,tar類型文件會自動解壓(網(wǎng)絡(luò)壓縮資源不會被解壓),可以訪問網(wǎng)絡(luò)資源,類似wget
# 格式:ADD <src>. . . <dest>ADD ["<src>" ,... "<dest>"]用于支持包含空格的路徑 # 示例:ADD hom*/mydir/ # 添加所有以"hom"開頭的文件ADD hom?.txt /mydir/ # ?替代一個單字符,例如:"home.txt"ADD test relativeDir/#添加“test”到^wORKDIR `/relativeDir/ADD test /absoluteDir/#添加“test”到/absoluteDir/copy:功能類似ADD,但是是不會自動解壓文件,也不能訪問網(wǎng)絡(luò)資源
cmd:構(gòu)建容器后調(diào)用,也就是在容器啟動時才進行調(diào)用。
entrypoint :配置容器,使其可執(zhí)行化。配合CMD可省去"application",只使用參數(shù)。
# 格式;ENTRYPOINT ["executable","param1","param2""](可執(zhí)行文件,優(yōu)先)ENTRYPOINT command param1 param2 (she11內(nèi)部命令) # 示例:FROM ubuntuENTRYPOINT ["top","-b"]CMD ["-c"]# 注: ENTRYPOINT與CMD非常類似,不同的是通過docker run執(zhí)行的命令不會覆蓋ENTRYPOINT,而dockerrun命令中指定的任何參數(shù),都會被當(dāng)做參數(shù)再次傳遞。 # ENTRYPOINT。Dockerfile中只允許有一個。 # ENTRYPOINT命令,多指定時會覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令。label:用于為鏡像添加元數(shù)據(jù)
# 格式:LABEL <key>=<value> <key>=<value> <key>=<value> ...示例:LABEL version="1.0" description="這是一個web服務(wù)器" by="ghz"# 注:使用LABEL指定元數(shù)據(jù)時,一條LABEL指定可以指定一或多條元數(shù)據(jù),指定多條元數(shù)據(jù)時不同元數(shù)據(jù)之間通過空格分隔。推薦將所有的元數(shù)據(jù)通過一條LABEL指令指定,以免生成過多的中間鏡像。env:設(shè)置環(huán)境變量
# 格式:# <key>之后的所有內(nèi)容均會被視為其<va1ue>的組成部分,因此,一次只能設(shè)置一個變量ENV <key> <value># 可以設(shè)置多個變量,每個變量為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用\來進行轉(zhuǎn)義,也可以通過""來進行標(biāo)示;另外,反斜線也可以用于續(xù)行ENV <key>=<value> ... # 示例:ENV myName John DoeENV myDog Rex The DogENV mycat=f1uffyexpose:指定于外界交互的端口
# 格式:EXPOSE <port> [<port>...] # 示例:EXPOSE 80 443EXPOSE 8080 EXPOSE 11211/tcp 11211/udp# 注:EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過p來發(fā)布這些端口,或通過-P參數(shù)來發(fā)布EXPOSE導(dǎo)出的所有端口volume:用于指定持久化目錄
# 格式:VOLUME ["/path/to/dir"] # 示例:VOLUME ["/data"]VOLUME ["/var/www","/var/log/apache2","/etc/apache2"] # 注:一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯(lián)合文件系統(tǒng),并具有以下功能: # 1卷可以容器間共享和重用 # 2容器并不一定要和其它容器共享卷3修改卷后會立即生效 # 4對卷的修改不會對鏡像產(chǎn)生影響 # 5卷會一直存在,直到?jīng)]有任何容器在使用它workdir:工作目錄,類似于cd命令
# 格式:WORKDIR /path/to/workdir # 示例:WORKDIR /a(這時工作目錄為/a)WORKDIR b (這時工作目錄為/a/b)WORKDIR c(這時工作目錄為/a/b/c)# 注:通過WORKDIR設(shè)置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執(zhí)行。在使用docker run運行容器時,可以通過-w 參數(shù)覆蓋構(gòu)建時所設(shè)置的工作目錄。user:指定運行容器時的用戶名或UID,后續(xù)的 RUN也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當(dāng)服務(wù)不需要管理員權(quán)限時,可以通過該命令指定運行用戶。并且可以在之前創(chuàng)建所需要的用戶
# 格式:USER userUSER user: groupUSER uidUSER uid:gidUSER user:gidUSER uid: group # 示例:USER www# 注:使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構(gòu)建完成后,通過docker run運行容器時,可以通過-u參數(shù)來覆蓋所指定的用戶。age:用于指定傳遞給構(gòu)建運行時的變量
# 格式:ARG <name>[=<default value>] # 示例:ARG siteARG bui1d_user=wwwonbuilde:用于設(shè)置鏡像觸發(fā)器
# 格式: ONBUILD [INSTRUCTION] # 示例:ONBUILD ADD . /app/srcONBUILD RUN /usr/loca1/bin/python-bui1d --dir /app/src# 注:當(dāng)所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像,該鏡像中的觸發(fā)器將會被鑰觸發(fā)實例1 構(gòu)建nginx鏡像
# This my first nginx Dockerfile # version 1.0 # Base images基礎(chǔ)鏡像 FROM centos # MAINTAINER維護者信息 MAINTAINER ghz # ENV設(shè)置環(huán)境變量 ENV PATH/usr/loca1/nginx/sbin : $PATH # ADD文件放在當(dāng)前目錄下,拷過去會自動解壓 ADD nginx-1.8.0.tar.gz /usr/loca1/ # ngix ADD epe1-release-latest-7.noarch.rpm /usr/1oca1/ #企業(yè)linux擴展包 # RUN執(zhí)行以下命令 RUN rpm -ivh /usr /loca1/epe1-release-1atest-7.noarch.rpm RUN yum instal1 -y wget lftp gcc gcc-c++ make openss1-deve1 pcre-deve1 pcre && yum cleana11 RUN useradd -s /sbin/no1ogin -M www # WORKDIR相當(dāng)于cd WORKDIR /usr/loca1/nginx-1.8.0 RUN ./configure --prefix=/us r/1oca1/nginx --user=www --group=www --with-http_ss1_module --with-pcre && make && make insta11 RUN echo "daemon off; " >>/etc/nginx.conf #EXPOSE映射端口 EXPOSE 8o #CMD運行以下命令 CMD ["nginx"]實例2 tomcat鏡像
- 打成war包
- 通過Dockerfile
- 在Dockerfile目錄下執(zhí)行構(gòu)建鏡像命令
- 查看鏡像并通過構(gòu)建的鏡像創(chuàng)建容器
docker私有倉庫
私有倉庫存放鏡像,中央倉庫存放通用鏡像,私有倉庫可以存放自己所構(gòu)建的鏡像,便于同一局域網(wǎng)的使用
- 拉取私有倉庫鏡像 【docker pull registry】
- 創(chuàng)建容器即創(chuàng)建私有倉庫 【docker run -di --name=registry -p 5000:5000 registry】
- 網(wǎng)頁訪問倉庫【宿主機ip:容器創(chuàng)建時映射的端口/v2/_catalog】 訪問到j(luò)son數(shù)據(jù)即私有倉庫創(chuàng)建成功
- 修改配置文件使docker信任私有倉庫才能上傳鏡像到私有倉庫【vi /etc/docker/daemon.json】添加配置:
- 重啟docker服務(wù)
鏡像上傳到私有倉庫
【docker tag 鏡像名稱 私服ip和端口/鏡像名稱】如【docker tag jdk1.8 192.168.x.x:5000/jdk1.8】打標(biāo)簽 相當(dāng)于復(fù)制一個鏡像為上傳做準(zhǔn)備
【docker push 私服ip和端口/鏡像名稱】 如【docker push 192.168.x.x:5000/jdk1.8】 上傳鏡像到私服
訪問私服可以查看到上傳的鏡像
獲取鏡像 【docker pull 私服ip和端口/鏡像名稱】
例:docker搭建應(yīng)用環(huán)境:
mysql部署
拉取鏡像:【docker pull centos/mysql-centos7】 后面即mysql路徑
創(chuàng)建容器:【docker run -di --name tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD 密碼 鏡像名稱】
參數(shù):
-
-p 端口映射 操作宿主機33306端口即相當(dāng)于操作容器的3306端口
-
-e MYSQL_ROOT_PASSWORD = 指定mysql密碼
-
–mysql圖形化界面軟件即可進行mysql連接(通過宿主機來連接容器中的mysql) 需要:宿主機ip 密碼 用戶名 端口==映射的宿主機的端口如33306
tomcat部署
拉取鏡像 pull
創(chuàng)建容器 【docker run -di --name mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/webapps tomcat:7-jre7】
使用目錄掛載后由于做了目錄映射,直接在網(wǎng)頁訪問tomcat是無法直接訪問的,可以把war包上傳到目錄下進行訪問
nginx部署
拉取鏡像 pull
創(chuàng)建容器 【docker run -di --name mynginx -p 80:80 nginx】
redis部署
拉取鏡像 pull
創(chuàng)建容器 【docker run -di --name myredis -p 6379:6379 redis】
測試:客戶端進入cmd -》redis-cli -h 遠(yuǎn)程ip -》連接成功,存儲查詢正常即完成。
例:docker簡單使用例子
通過docker構(gòu)建tomcat部署web項目。
復(fù)制項目到容器目錄運行
1- 準(zhǔn)備一個簡單web項目并上傳到linux
- 目錄結(jié)構(gòu)
- 文件內(nèi)容
- 上傳linux 如: 通過FileZilla工具上傳
2-通過Docker安裝tomcat
# 獲取Tomcat鏡像 docker pu17 daocloud.io/library/tomcat:8.0.45 # 查看Tomcat鏡像 docker images # 創(chuàng)建Tomcat容器 docker run -d -p 8080:8080 --name tomcat 鏡像tag(獲取IMAGE ID, imageId不用輸完整也行) # 查看tomcat啟動 瀏覽器訪問http://ip地址:80803-把上傳的項目復(fù)制到tomcat的webapp目錄下
# 查看運行的容器 docker ps # 進入tomcat容器查看目錄 docker exec -it imageId bash # 進入webapps 查看路徑 輸出路徑: /usr/local/tomcat/webapps cd webapps pwd# 可以退出容器 獲取重新打開一個終端 進入項目所在目錄復(fù)制項目到webapp目錄 exit docker cp ./demo/ imageId:/usr/local/tomcat/webapps# 可以再次進入tomcat容器查看是否復(fù)制成功 docker exec -it imageId bash cd webapps ls4- 瀏覽器訪問項目 可通過【docker logs -f tomcat】查看運行日志
復(fù)制項目到數(shù)據(jù)卷映射目錄操作運行
1、2、4一致:如果基于上面直接復(fù)制項目到容器目錄了可以刪除項目后停止容器
# 進入到容器內(nèi)tomcat的webapp目錄中 rm -r demo/ # 停止容器 docker stop [imageId(可通過[docker ps查看]) docker rm 容器名稱/imageId3-創(chuàng)建數(shù)據(jù)卷映射目錄并復(fù)制項目到映射的目錄下
# 1-----創(chuàng)建數(shù)據(jù)卷 docker volume create v01 # 啟動容器時進行數(shù)據(jù)卷映射 docker run -d -p 8080:8080 -v v01:/usr/local/tomcat/webapps/ --name tomcat imageId # 可以通過【docker volume ls】查看數(shù)據(jù)卷列表。查看數(shù)據(jù)卷詳細(xì)信息獲取docker自動創(chuàng)建數(shù)據(jù)卷時映射的路徑,即掛載路徑:[MountPoint] docker volume inspect v01 # 復(fù)制項目到映射的路徑中 cp demo -r /var/lib/docker/volumes/v01/_data# 2----直接映射目錄 # 創(chuàng)建映射的目錄 mkdir tomcat_webapps # 停止tomcat并刪除容器 docker stop 容器名稱/imageId docker rm 容器名稱/imageId # 創(chuàng)建容器直接映射目錄 # 如:docker run -d -p 8080:8080 -v /root/other/dockerTest/tomcat_webapps:/usr/local/tomcat/webapps/ --name tomcat feba docker run -d -p 8080:8080 -v 需要映射的路徑:/usr/local/tomcat/webapps/ --name tomcat imageId # 項目復(fù)制到映射的目錄中 cp demo -r /root/other/dockerTest/tomcat_webappsdocker-compose
總結(jié)
以上是生活随笔為你收集整理的【docker】docker学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5 励志名言,霸气的学习励志名言
- 下一篇: 高中计算机辗转相除法,高中数学的辗转相除