輸入 docker 可以查看Docker的命令用法,輸入 docker COMMAND --help 查看指定命令的詳細用法
## 1、鏡像操作
| 操作 | 命令 | 說明 |
| --- | --- | --- |
| 查找 | docker search 關鍵字 | 可以在Docker Hub網站查看鏡像的詳細信息,如鏡像的tag標簽 |
| 抽取 | docker pull 鏡像名:tag | :tag表示軟件的版本,如果不指定默認是latest |
| 列表 | docker images | 查看所有本地鏡像 |
| 獲取元信息 | docker inspect 鏡像id | 獲取鏡像的元信息,詳細信息 |
| 刪除 | docker rmi -f 鏡像id或鏡像名:tag | 刪除指定的本地鏡像,-f表示強制刪除 |
## 2、容器操作
| 操作 | 命令 | 說明 |
| --- | --- | --- |
| 運行 | docker run --name 容器名 -i -t -p 主機端口:容器端口 -d -v 主機目錄:容器目錄:ro 鏡 像id或鏡像名稱:tag | --name 指定容器名,名稱自定義,如果不指定會自動命名; -i 以交互模式運 行,即以交互模式運行容器;-t 分配一個偽終端,即命令行,通常組合使用-it ;-p 指定端口映射,將主機端口映射到容器內的端口;-d 表示后臺運行,即守 護式運行容器;-v 指定掛載主機目錄到容器目錄(主機目錄中的內容發生變化會自動同步到容器目錄),默認在容器中為rw讀寫模式,ro表示 只讀 |
| 列表 | docker ps -a -q | 查看正在運行的容器,-a表示顯示所有容器,-q表示只顯示容器id |
| 啟動 | docker start 容器id或容器名稱 | 啟動容器 |
| 停止 | docker stop 容器id或容器名稱 | 停止正在運行的容器 |
| 刪除 | docker rm --f 容器id或容器名稱 | 刪除容器,--f表示強制刪除 |
| 日志 | docker logs 容器id或容器名稱 | 獲取容器的日志 |
| 在容器中執行 | docker exec --it 容器id或容器名稱 /bin/bash | 進入正在運行的容器中并開啟一個交互模式的終端,可以在容器中執行操作 |
| 拷貝文件 | docker cp 主機中的文件路徑容器id或容器名稱:容器路徑;docker cp 容器id或容器名稱:容器中的文件路徑主機路徑 | 將文件中的文件拷貝到容器中;將容器中的文件拷貝到主機中 |
| 獲取元信息 | docker inspect 容器id | 獲取容器的元信息 |
#### 以CentOS為例:
```
docker search centos
docker pull centos
docker run ----name mycentos --it centos:latest # 根據centos:latest鏡像運行容器,并以交互模式 進入容器中
# 實際上是在Docker容器中運行一個精簡版的CentOS系統
exit # 退出并關閉容器
docker ps --a
docker start mycentos
docker stop mycentos
docker rm mycentos
docker rm --f $(docker ps --aq) # 強制刪除所有容器
```
注:Docker容器內實際上是運行著一個精簡版的Linux系統
#### 以tomcat為例:
```
# 示例1:基本用法
docker search tomcat
docker pull tomcat
docker run ----name mytomcat --p 8888:8080 --d tomcat
# 測試:http://宿主機地址:8888
docker stop mytomcat
docker ps --a
docker start mytomcat
# 示例2:拷貝文件和掛載目錄
docker run --p 8080:8080 --d tomcat
docker exec --it 70cba924861c /bin/bash
cd /usr/local/tomcat/webapps/ROOT
exit
echo welcome to tomcat > index.jsp
docker cp index.jsp 70cba924861c:/usr/local/tomcat/webapps/ROOT # 將宿主機中的文件拷貝到容器中指定的目錄中
# 部署web項目,將war文件放到容器中
docker cp spring--web.war 70cba924861c:/usr/local/tomcat/webapps
# 問題:如果項目更改了需要重新拷貝war文件,太麻煩,可以直接掛載目錄(也稱為數據卷Volume)
docker run \ -
-p 8080:8080 \
--v /my/tomcat/webapps/spring-web.war:/usr/local/tomcat/webapps/spring-web.war \ -
-v /my/tomcat/data:/usr/local/tomcat/dataVolume:ro \ -
-d tomcat
# 可以掛載指定的文件也可以掛載目錄
# 示例3:啟動多個容器,一個鏡像可以啟動多個容器,每個容器互相隔離、獨立 ,所以容器的端口是可以重復的
docker run --p 8081:8080 --d tomcat
docker run --p 8082:8080 --d tomcat
docker run --p 8083:8080 --d tomcat
```
## 3、 鏡像的分層結構
tomcat鏡像為什么這么大?
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境的軟件,包含運行某個軟件所需要的所有內容。
基于UnionFS聯合文件系統,采用分層結構,一層一層的堆疊起來,像一個同心圓,但從外面來說,只能看到最外層的文件系統(鏡像層)

分層結構:共享資源、便于復用(許多鏡像都是從相同的Base基礎鏡像構建而來的,基礎鏡像只需要保存一份)
鏡像都是只讀的,而由鏡像生成的容器是可修改的
## 4、創建鏡像
有時從Docker鏡像倉庫中下載的鏡像不能滿足我們的要求,此時可以基于這個鏡像(基礎鏡像)封裝一個自己的鏡像。
兩種方式:
* 更新鏡像:使用docker commit命令
* 構建鏡像:使用docker build命令,需要創建Dockerfile文件
### 4.1、更新鏡像
先使用基礎鏡像創建一個容器,然后對容器進行修改,最后使用commit命令提交為一個新的鏡像
步驟:
a、根據基礎鏡像,創建容器
docker run ----name mytomcat --p 8080:8080 --d tomcat
b、修改容器
```
docker exec --it bcd08edac78d /bin/bash
cd webapps/ROOT
rm --f index.jsp
echo welcome to tomcat > index.html
exit
```
c、提交為新鏡像,語法: docker commit -m="描述消息" -a="作者" 容器id或容器名 鏡像名:tag
```
docker commit --m="修改默認索引頁" --a="AAA" bcd08edac78d itany/tomcat:v1
```
d、使用新鏡像運行容器
```
docker run ----name tomcat_v1 --p:8080:8080 --d itany/tomcat:v1
```
### 4.2、 構建鏡像
根據Dockerfile文件來自動構建鏡像
Dockerfile是一個包含創建鏡像所有命令的文本文件,使用docker build命令可以根據Dockerfile的內容創建鏡像
步驟:
a、創建一個Dockerfile文件 vi Dockerfile
```
# 指定基礎鏡像
FROM tomcat
# 指定作者
MAINTAINER yuanke@163.com
# 執行命令
RUN rm --f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html
```
b、構建新鏡像,語法: docker build -f Dockerfile文件的路徑 -t 鏡像名:tag 命令執行的上下文
```
docker build --f Dockerfile --t itany/tomcat:v2 .
```
c、使用新鏡像運行容器
```
docker run --p 9999:8080 --d itany/tomcat:v
```