Docker 專題總結(jié)
Docker 專題總結(jié)
Docker 的基本命令
-
啟動 Docker
$ systemctl start docker -
停止Docker
$ systemctl stop docker -
重啟Docker
$ systemctl restart docker -
開啟自啟動Docker
$ systemctl enable docker -
查看Docker的概要信息
$ docker info -
查看Docker的幫助文檔
$ docker --help -
查看Docker的版本信息
$ docker version
Docker 鏡像的常用命令
-
docker images 列出本機所有鏡像
$ docker images列出本機所有鏡像 :
標簽 說明 REPOSITORY 鏡像的倉庫源 TAG 鏡像的標簽(版本)同一個倉庫有多個TAG的鏡像,多個版本;我們用REPOSITORY:TAG來定義不同的鏡像; IMAGE ID 鏡像ID,鏡像的唯一標識 CREATE 鏡像創(chuàng)建時間 SIZE 鏡像大小 列出鏡像可選參數(shù)
OPTIONS 可選參數(shù): -a 顯示所有鏡像(包括中間層) -q 只顯示鏡像ID -qa 可以組合 --digests 顯示鏡像的摘要信息 --no-trunc 顯示完整的鏡像信息 -
docker search 搜索鏡像
$ docker search和 https://hub.docker.com/ 這里的搜索效果一樣;
OPTIONS可選參數(shù):
可選參數(shù) 說明 --no-trunc 顯示完整的鏡像描述 -s 列出收藏數(shù)不小于指定值的鏡像 --automated 只列出Docker Hub自動構(gòu)建類型的鏡像 -
docker pull 下載鏡像
docker pull 鏡像名稱:[TAG]注意:不加TAG,默認下載最新版本latest
-
刪除單個鏡像
# 1,刪除單個: docker rmi 鏡像名稱:[TAG]如果不寫TAG,默認刪除最新版本latest
有鏡像生成的容器再運行時候,會報錯,刪除失敗;
我們需要加 -f 強制刪除
-
docker rmi -f 鏡像名稱1:[TAG] 鏡像名稱2:[TAG]
$ docker rmi -f 鏡像名稱1:[TAG] 鏡像名稱2:[TAG] -
刪除全部
$ docker rmi -f $(docker images -qa)
Docker容器常用命令
-
查看正在運行的容器
$ docker ps [OPTIONS] $ docker ps 查看正在運行的容器 $ docker ps -a 查看所有容器 $ docker ps -n 2 顯示最近創(chuàng)建的2個容器 $ docker ps -f status=exited 查看停止的容器OPTIONS說明:
-a :顯示所有的容器,包括未運行的。
-f :根據(jù)條件過濾顯示的內(nèi)容。
--format :指定返回值的模板文件。
-l :顯示最近創(chuàng)建的容器。
-n :列出最近創(chuàng)建的n個容器。
--no-trunc :不截斷輸出。
-q :靜默模式,只顯示容器編號。
-s :顯示總的文件大小。
-
容器停止退出
$ exit #容器停止退出$ ctrl + P + Q #容器不停止退出 -
進入容器
$ docker attach 容器ID or 容器名 -
啟動容器
$ docker start 容器ID or 容器名 -
重啟容器
$ docker restart 容器ID or 容器名 -
停止容器
$ docker stop 容器ID or 容器名 #暴力刪除,直接殺掉進程 (不推薦) docker kill 容器ID or 容器名 -
刪除容器
$ docker rm 容器ID #如果刪除正在運行的容器,會報錯,我們假如需要刪除的話,需要強制刪除; $ docker rm -f 容器ID #刪除多個容器 $ docker rm -f 容器ID1 容器ID2 中間空格隔開 #刪除所有容器 docker rm -f $(docker ps -qa) -
docker宿主機和容器間文件拷貝
#宿主機文件 copy to 容器內(nèi) docker cp 需要拷貝的文件或者目錄 容器名稱:容器目錄 # 比如 docker cp /home/data/001.jpg 6498bcb8d66f /home/data/001.jpg #容器內(nèi) copy to 宿主機 docker cp 容器名稱:容器目錄 宿主機目錄 -
docker 查看容器日志
$ docker logs [OPTIONS] CONTAINER #也可以去docker日志文件目錄查找,docker日志文件目錄 /var/lib/docker/containers/Options:
--details 顯示更多的信息
-f, --follow 跟蹤實時日志
--since string 顯示自某個timestamp之后的日志,或相對時間,如42m(即42分鐘) --tail string 從日志末尾顯示多少行日志, 默認是all-t, --timestamps 顯示時間戳
--until string 顯示自某個timestamp之前的日志,或相對時間,如42m(即42分鐘) -
docker 查看容器進程
$ docker top 容器ID -
docker 進入容器執(zhí)行命令,直接操作容器,執(zhí)行完 回到 宿主主機終端;
我們一般用于 啟動容器里的應(yīng)用 比如 tomcat nginx redis elasticsearch等等
$ docker exec -it 容器名稱 或者 容器ID /bin/bash -
提交運行時容器成為鏡像
docker commit -a='作者' -m='備注' 運行時容器ID 新鏡像名稱 -
容器端口映射
# 端口映射; $ docker run -it -p 8888:8080 鏡像ID $ docker run -it -P 鏡像ID -
創(chuàng)建并啟動容器
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 啟動普通容器 $ docker run --name 別名 鏡像ID # 啟動交互式容器 運行一個容器 取別名 交互模式運行 以及分配一個偽終端 $ dokcer run -it --name 別名 鏡像ID # 守護式方式創(chuàng)建并啟動容器,執(zhí)行完命令后,終端依然再宿主機上; $ docker run -di --name 別名 鏡像ID #啟動容器,并執(zhí)行/bin/bash命令; $ docker run -it --name 別名 鏡像ID /bin/bash命令--name="容器新名字":為容器指定一個名稱;
-i:以交互模式運行容器,通常與-t或者-d同時使用;
-t:為容器重新分配一個偽輸入終端,通常與-i同時使用;
-d: 后臺運行容器,并返回容器ID;
-P: 隨機端口映射,容器內(nèi)部端口隨機映射到主機的端口
-p: 指定端口映射,格式為:主機(宿主)端口:容器端口
Docker目錄掛載
-
簡介:容器目錄掛載,我們可以在創(chuàng)建容器的時候,將宿主機的目錄與容器內(nèi)的目錄進行映射,這樣我們就可以實現(xiàn)宿主機和容器目錄的雙向自動同步;
-
作用:前面的 cp 命令來實現(xiàn)數(shù)據(jù)傳遞,這種方式比較麻煩;我們通過容器目錄掛載,能夠輕松實現(xiàn)代碼上傳,配置修改,日志同步等需求;
-
語法:
#單個目錄掛載 $ docker run -it -v /宿主機目錄:/容器目錄 鏡像名 #多個目錄掛載 $ docker run -it -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 鏡像名 #掛載目錄只讀: $ docker run -it -v /宿主機目錄:/容器目錄:ro 鏡像名
注意:
如果同步的是多級目錄,可能會出現(xiàn)權(quán)限不足的提示;
這是因為Centos7中的安全模塊selinux把權(quán)限禁掉了,我們需要在啟動命令后添加 --privileged=true 來解決掛載的目錄沒有權(quán)限的問題;
Docker tomcat端口映射的坑
問題描述:啟動容器后,外網(wǎng)無法映射訪問 Tomcat
排查思路:
-
查看firewall-cmd --state,添加策略對外打開指定的端口
#查看 firewall-cmd --list-ports firewall-cmd --list-services #添加策略 firewall-cmd --add-port=5000/tcp --permanent firewall-cmd --remove-port=5000/tcp --permanent firewall-cmd --reload -
查看 sysctl net.ipv4.ip_forward 是否轉(zhuǎn)發(fā) 0-未轉(zhuǎn)發(fā) 1-轉(zhuǎn)發(fā)
-
查看容器 tomcat的 webapp目錄下是否存在文件,講webapp.dist目錄內(nèi)文件 拷貝至wepapp
Docker 配置 Tomcat
-
配置思路:先進行鏡像的拉取安裝,然后指定端口啟動并進入容器。在本地建立Tomcat 同級目錄,并將容器Tomcat目錄下內(nèi)容拷貝至宿主機,再進行宿主機與容器之間的掛載,這樣容器與宿主機間的數(shù)據(jù)關(guān)系就同步了。
-
配置步驟:
-
安裝鏡像并運行容器
$ docker pull tomcat:8.5.31 $ docker run -di -p 8888:8080 鏡像id -
宿主機里home目錄下新建tomcat目錄,復制容器里conf,webapps到宿主機
$ docker cp 容器id:/usr/local/tomcat/conf /home/tomcat/ $ docker cp 容器id::/usr/local/tomcat/webapps /home/tomcat/ -
把容器里的tomcat里的webapp,logs,conf掛載到宿主機tomcat目錄下,方便上傳代碼,同步持久化日志,以及方便配置tomcat;關(guān)掉容器,啟動容器;
$ docker run -d --name 容器名稱 -p 80:8080 -v /home/tomcat/conf/:/usr/local/tomcat/conf/ -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ -v /home/tomcat/logs/:/usr/local/tomcat/logs/ 鏡像名稱 -
配置tomcat server.xml 以及 同步上傳war包
<Context path="" docBase="/usr/local/tomcat/webapps/WebTest" debug="0" reloadable="true" />
-
Docker 配置 MySQL
-
簡介:docker安裝MySQL 和 安裝Tomcat 差不太多,這邊主要介紹下配置思路
-
安裝步驟:
-
拉取需要的MySQL鏡像
$ docker pull mysql:5.7 -
創(chuàng)建宿主機掛載目錄,存儲MySQL配置文件、數(shù)據(jù)文件及相關(guān)日志信息
$ docker cp 容器id:/etc/mysql/conf.d /home/mysql/ $ docker cp 容器id:/var/log /home/mysql/ $ docker cp 容器id:/var/lib/mysql /home/mysql/ -
創(chuàng)建并運行容器,端口指定,目錄掛載
$ docker run -p 3306:3306 -d -v /etc/mysql/conf.d/:/home/mysql/conf/ -v /var/log:/home/mysql/log/ -v /var/lib/mysql/:/home/mysql/mysql/ -e MYSQL_ROOT_PASSWORD=123456 鏡像ID -
用sqlyog連接docker里的數(shù)據(jù)庫,導入sql腳本
-
-
注意事項:
-
運行的項目里的數(shù)據(jù)庫連接地址,要寫docker里的mysql容器所在的虛擬IP地址;容器間通信IP;
# 查看 inspect中的 "IPAddress": "172.17.0.2" 信息 項目中l(wèi)ocahost 替換為容器IPAddress 地址 $ docker inspect 容器ID
-
Docker遷移與備份
-
大公司開發(fā)過程中,經(jīng)常自定義鏡像,然后commit提交成鏡像到本地倉庫,但是我們發(fā)布到客戶服務(wù)器的時候,可以用前面講得發(fā)布到hub官方,或者阿里云,但是有些機密性的項目,是禁止公網(wǎng)存儲的,所以我們只能通過docker鏡像備份和遷移實現(xiàn)。
-
實現(xiàn)方式:
#備份鏡像 $ docker save -o 備份鏡像的名稱 源鏡像名稱:tag版本 比如: $ docker save -o mytomcat7.1.tar java1234/tomcat7:7.1 #將打好的tar 進行sftp或網(wǎng)絡(luò)傳輸 可實現(xiàn)自定義鏡像的恢復 $ docker load -i 鏡像文件 比如:$ docker load -i mytomcat7.1.tar
DockerFile
-
簡介:
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于操作系統(tǒng)(centos或者Ubuntu)基礎(chǔ)鏡像并最終創(chuàng)建的一個新鏡像;通過用手工的方式,修改配置文件,或者添加,刪除文件目錄的方式,來構(gòu)建一種新鏡像;這種手工方式麻煩,容易出錯,而且不能復用;Dockerfile使用腳本方式來構(gòu)建自動化,可復用的,高效率的創(chuàng)建鏡像方式,是企業(yè)級開發(fā)的首選方式;
在軟件系統(tǒng)開發(fā)生命周期中,采用Dockerfile來構(gòu)建鏡像;
1、對于開發(fā)人員:可以為開發(fā)團隊提供一個完全一致的開發(fā)環(huán)境;
2、對于測試人員:可以直接拿開發(fā)時所構(gòu)建的鏡像或者通過Dockerfile文件構(gòu)建一個新的鏡像開始工作;
3、對于運維人員:在部署時,可以實現(xiàn)應(yīng)用的無縫移植。
-
DockerFile常用指令
#定義了使用哪個基礎(chǔ)鏡像啟動構(gòu)建流程 FROM image_name:tag #聲明鏡像維護者信息 MAINTAINER user_info #設(shè)置環(huán)境變量(可以寫多條) ENV key value #構(gòu)建容器時需要運行的命令(可以寫多條) RUN command #設(shè)置終端默認登錄進來的工作目錄 WORKDIR path_dir #當前容器對外暴露出的端口 EXPOSE port #將宿主機的文件復制到容器內(nèi),如果是一個壓縮文件,將會在復制后自動解壓 ADD source_dir/file dest_dir/file #和ADD相似,但是如果有壓縮文件是不能解壓 COPY source_dir/file dest_dir/file #創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等 VOLUME #指定容器啟動時要運行的命令,假如有多個CMD,最后一個生效 CMD #指定容器啟動時要運行的命令 ENTRYPOINT #當構(gòu)建一個被繼承的Dockerfile時運行的命令,父鏡像在被子鏡像繼承后父鏡像的onbuild被觸發(fā)??梢园袿NBUID理解為一個觸發(fā)器。 ONBUILD -
DockerFile構(gòu)建自定義CentOS
#第一步:編寫DockerFile FROM centos MAINTAINER zhangtao<zhangtao2021@126.com> LABEL name="zhangtao CentOS Image" \ build-date="20210316" ENV WORKPATH /home/ WORKDIR $WORKPATH RUN yum -y install net-tools RUN yum -y install vim EXPOSE 80 CMD /bin/bash #2.通過DockerFile構(gòu)建鏡像 構(gòu)建 docker build -f myCentosDockerFile -t zhangtao/mycentos:1.1 . #3:測試運行鏡像 運行 docker run -it 鏡像ID #4.查看鏡像歷史 查看鏡像歷史 docker history 鏡像ID
DockerFile通過VOLUME實現(xiàn)容器卷
-
簡介:前面用啟動命令 -v 宿主機目錄:容器卷目錄 來實現(xiàn)容器卷目錄掛載。但是由于定義Dockerfile的時候,并不能保證在所有的宿主機上都有這樣的特定目錄,所以在Dockerfile定義中,只能指定容器卷目錄;
-
語法:
#編寫DockerFile FROM centos VOLUME ["/home/v1","/home/v2"] CMD /bin/bash #構(gòu)建 $ docker build -f myVolumeDockerFile -t zhangtao/myTest:1.1 . #運行 $ docker run -it 鏡像ID容器運行后,進入home目錄,找到v1,v2兩個容器卷目錄;然后我們通過 docker inspect 容器ID 來查看下默認生成的容器卷對應(yīng)的宿主機目錄,通過新建文件和 修改,實現(xiàn)容器卷同步

浙公網(wǎng)安備 33010602011771號