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
和 https://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<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構建映象 構建 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 來檢視下預設生成的容器卷對應的宿主機目錄,通過新建檔案和 修改,實現容器卷同步