Docker 專題總結
Docker 專題總結
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 鏡像創建時間 SIZE 鏡像大小 列出鏡像可選參數
OPTIONS 可選參數: -a 顯示所有鏡像(包括中間層) -q 只顯示鏡像ID -qa 可以組合 –digests 顯示鏡像的摘要資訊 –no-trunc 顯示完整的鏡像資訊 -
docker search 搜索鏡像
$ docker search
和 //hub.docker.com/ 這裡的搜索效果一樣;
OPTIONS可選參數:
可選參數 說明 –no-trunc 顯示完整的鏡像描述 -s 列出收藏數不小於指定值的鏡像 –automated 只列出Docker Hub自動構建類型的鏡像 -
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 顯示最近創建的2個容器 $ docker ps -f status=exited 查看停止的容器
OPTIONS說明:
-a :顯示所有的容器,包括未運行的。
-f :根據條件過濾顯示的內容。
–format :指定返回值的模板文件。
-l :顯示最近創建的容器。
-n :列出最近創建的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 容器內 docker cp 需要拷貝的文件或者目錄 容器名稱:容器目錄 # 比如 docker cp /home/data/001.jpg 6498bcb8d66f /home/data/001.jpg #容器內 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 進入容器執行命令,直接操作容器,執行完 回到 宿主主機終端;
我們一般用於 啟動容器里的應用 比如 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
-
創建並啟動容器
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 啟動普通容器 $ docker run --name 別名 鏡像ID # 啟動互動式容器 運行一個容器 取別名 交互模式運行 以及分配一個偽終端 $ dokcer run -it --name 別名 鏡像ID # 守護式方式創建並啟動容器,執行完命令後,終端依然再宿主機上; $ docker run -di --name 別名 鏡像ID #啟動容器,並執行/bin/bash命令; $ docker run -it --name 別名 鏡像ID /bin/bash命令
–name=”容器新名字”:為容器指定一個名稱;
-i:以交互模式運行容器,通常與-t或者-d同時使用;
-t:為容器重新分配一個偽輸入終端,通常與-i同時使用;
-d: 後台運行容器,並返回容器ID;
-P: 隨機埠映射,容器內部埠隨機映射到主機的埠
-p: 指定埠映射,格式為:主機(宿主)埠:容器埠
Docker目錄掛載
-
簡介:容器目錄掛載,我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以實現宿主機和容器目錄的雙向自動同步;
-
作用:前面的 cp 命令來實現數據傳遞,這種方式比較麻煩;我們通過容器目錄掛載,能夠輕鬆實現程式碼上傳,配置修改,日誌同步等需求;
-
語法:
#單個目錄掛載 $ docker run -it -v /宿主機目錄:/容器目錄 鏡像名 #多個目錄掛載 $ docker run -it -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 鏡像名 #掛載目錄只讀: $ docker run -it -v /宿主機目錄:/容器目錄:ro 鏡像名
注意:
如果同步的是多級目錄,可能會出現許可權不足的提示;
這是因為Centos7中的安全模組selinux把許可權禁掉了,我們需要在啟動命令後添加 –privileged=true 來解決掛載的目錄沒有許可權的問題;
Docker tomcat埠映射的坑
問題描述:啟動容器後,外網無法映射訪問 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 是否轉發 0-未轉發 1-轉發
-
查看容器 tomcat的 webapp目錄下是否存在文件,講webapp.dist目錄內文件 拷貝至wepapp
Docker 配置 Tomcat
-
配置思路:先進行鏡像的拉取安裝,然後指定埠啟動並進入容器。在本地建立Tomcat 同級目錄,並將容器Tomcat目錄下內容拷貝至宿主機,再進行宿主機與容器之間的掛載,這樣容器與宿主機間的數據關係就同步了。
-
配置步驟:
-
安裝鏡像並運行容器
$ 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;關掉容器,啟動容器;
$ 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
-
創建宿主機掛載目錄,存儲MySQL配置文件、數據文件及相關日誌資訊
$ docker cp 容器id:/etc/mysql/conf.d /home/mysql/ $ docker cp 容器id:/var/log /home/mysql/ $ docker cp 容器id:/var/lib/mysql /home/mysql/
-
創建並運行容器,埠指定,目錄掛載
$ 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里的資料庫,導入sql腳本
-
-
注意事項:
-
運行的項目里的資料庫連接地址,要寫docker里的mysql容器所在的虛擬IP地址;容器間通訊IP;
# 查看 inspect中的 "IPAddress": "172.17.0.2" 資訊 項目中locahost 替換為容器IPAddress 地址 $ docker inspect 容器ID
-
Docker遷移與備份
-
大公司開發過程中,經常自定義鏡像,然後commit提交成鏡像到本地倉庫,但是我們發布到客戶伺服器的時候,可以用前面講得發布到hub官方,或者阿里雲,但是有些機密性的項目,是禁止公網存儲的,所以我們只能通過docker鏡像備份和遷移實現。
-
實現方式:
#備份鏡像 $ docker save -o 備份鏡像的名稱 源鏡像名稱:tag版本 比如: $ docker save -o mytomcat7.1.tar java1234/tomcat7:7.1 #將打好的tar 進行sftp或網路傳輸 可實現自定義鏡像的恢復 $ docker load -i 鏡像文件 比如:$ docker load -i mytomcat7.1.tar
DockerFile
-
簡介:
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於作業系統(centos或者Ubuntu)基礎鏡像並最終創建的一個新鏡像;通過用手工的方式,修改配置文件,或者添加,刪除文件目錄的方式,來構建一種新鏡像;這種手工方式麻煩,容易出錯,而且不能復用;Dockerfile使用腳本方式來構建自動化,可復用的,高效率的創建鏡像方式,是企業級開發的首選方式;
在軟體系統開發生命周期中,採用Dockerfile來構建鏡像;
1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境;
2、對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作;
3、對於運維人員:在部署時,可以實現應用的無縫移植。
-
DockerFile常用指令
#定義了使用哪個基礎鏡像啟動構建流程 FROM image_name:tag #聲明鏡像維護者資訊 MAINTAINER user_info #設置環境變數(可以寫多條) ENV key value #構建容器時需要運行的命令(可以寫多條) RUN command #設置終端默認登錄進來的工作目錄 WORKDIR path_dir #當前容器對外暴露出的埠 EXPOSE port #將宿主機的文件複製到容器內,如果是一個壓縮文件,將會在複製後自動解壓 ADD source_dir/file dest_dir/file #和ADD相似,但是如果有壓縮文件是不能解壓 COPY source_dir/file dest_dir/file #創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的數據等 VOLUME #指定容器啟動時要運行的命令,假如有多個CMD,最後一個生效 CMD #指定容器啟動時要運行的命令 ENTRYPOINT #當構建一個被繼承的Dockerfile時運行的命令,父鏡像在被子鏡像繼承後父鏡像的onbuild被觸發。可以把ONBUID理解為一個觸發器。 ONBUILD
-
DockerFile構建自定義CentOS
#第一步:編寫DockerFile FROM centos MAINTAINER zhangtao<[email protected]> 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構建鏡像 構建 docker build -f myCentosDockerFile -t zhangtao/mycentos:1.1 . #3:測試運行鏡像 運行 docker run -it 鏡像ID #4.查看鏡像歷史 查看鏡像歷史 docker history 鏡像ID
DockerFile通過VOLUME實現容器卷
-
簡介:前面用啟動命令 -v 宿主機目錄:容器卷目錄 來實現容器卷目錄掛載。但是由於定義Dockerfile的時候,並不能保證在所有的宿主機上都有這樣的特定目錄,所以在Dockerfile定義中,只能指定容器卷目錄;
-
語法:
#編寫DockerFile FROM centos VOLUME ["/home/v1","/home/v2"] CMD /bin/bash #構建 $ docker build -f myVolumeDockerFile -t zhangtao/myTest:1.1 . #運行 $ docker run -it 鏡像ID
容器運行後,進入home目錄,找到v1,v2兩個容器卷目錄;然後我們通過 docker inspect 容器ID 來查看下默認生成的容器卷對應的宿主機目錄,通過新建文件和 修改,實現容器卷同步