---
# System prepended metadata

title: Docker使用與概念
tags: [docker]

---

# Docker使用與概念
## 基本介紹
* Docker是一個Client-Server結構的系統，Docker守護進程運行在主機上，然後通過Socket連接從客戶端訪問，守護進程從客戶端接受命令並管理運行在主機上的容器。(容器是一個運行時的環境)
* Docker之於虛擬機優勢在於Docker無須加載虛擬硬件與操作系統，更加輕盈與方便。
* Docker模擬軟件而非硬件(虛擬機)，並藉由模擬當時開發環境(容器)成就使用者開啟程式無需考慮操作系統與開發環境差異。
* Docker基本命令
1. docker version (個人信息:簡易)
2. docker info (個人信息:詳細)
3. docker --help (查看docker的命令)

## Docker常用命令
### 啟用命令
```
systemctl start docker
```
### 鏡像命令
---
```
docker images (查看本機鏡像模板)
```
###### REPOSITORY:     表示鏡像的倉庫源
###### TAG:            表示鏡像的標籤
###### IMAGE ID:       鏡像ID
###### CREATED:        鏡像的創立時間
###### SIZE:           鏡像大小 

```
docker images -a 列出本地所有鏡像(包含中間層)
docker images -q 只顯示鏡像ID
```
---
```
docker search +要找的鏡像 (尋找鏡像)
```
###### STAR:點讚數
```
docker search -s 30 +要找的鏡像 (尋找點讚數超過30的鏡像)
```
---
 ```
 docker pull   +要下載的鏡像(下載鏡像)
 ```

#### docker pull centos

---
```
docker rmi    +要刪除的鏡像(刪除鏡像)
```
```
docker rmi -f +要刪除的鏡像(強制刪除鏡像)
docker rmi -f +要刪除的鏡像1 +要刪除的鏡像1(強制刪除多個鏡像)
docker rmi -f $(docker images -qa) 刪除全部容器
```


### 容器命令
* 有鏡像才能創造容器
* 興建並啟動容器
```
docker run [option] IMAGE [COMMAND][ARG]
```
###### example : 興建並啟動一個centos
```
docker run -it centos
```
* 查看目前運行的容器(可查看容器與生成的鏡像)
```
docker ps
docker container ls
docker container ls -all
```
```
docker ps -a    查看所有運行過容器(含正在運行的)
docker ps -l    查看上一個使用的容器
docker ps -n 3  查看上三個使用的容器
docker ps -ql   查看上一個使用的容器編號
```
* 退出容器
```
exit
```
* 關閉容器(不停止運行)
```
ctrl+P+Q (關閉)
docker start 容器名 (啟動關閉的容器)
```
* 重啟容器
```
docker restart 容器名 (重新啟動容器)
```
* 幫容器命名
```
docker run --name 想命名的容器 想命名的名字
docker run --rename 想命名的容器 想命名的名字
```
* 停止容器
```
docker stop 容器名
docker kill 容器名 (強制停止)
```
* 刪除容器
```
docker rm 容器名
```
---
* 後台開啟容器 (後臺開啟如果沒指定作業會自行關閉)
```
docker run -d 容器名
```
* 查看容器日誌
```
docker logs -f -t --tail 容器名
(-t:加入時間戳) 
(-f:跟隨最新的日製打印)
(--tail 數字: 顯示後面[數字]條)
```
* 查看容器內運行的進程
```
docker top
```
* Container執行操作
```
docker attach：連接Container的標準輸出輸入端
docker exec：在外部向Container內執行指令(遠程操作)
docker exec -it 檔案名(從外部進入內部)
docker denter：進入Container
```
* 容器內拷貝文件或數值到本機
```
docker cp 路徑1 (名稱) 路徑2 
```
## 進階指令
* 把容器做成鏡像
```
docker commit 
docker commit -m="要提交的訊息" -a="作者" 容器名 生成的鏡像名:版本
```
example:
###### 進入tomcat
```
docker pull tomcat
docker run -it -p 8080:8080 tomcat
(docker run -it -P tomcat)
(-P 隨機分配窗口)
(-p 分配指定窗口)
到火狐打 localhost:8080
```
###### 刪除文件
```
docker exec -it 文件名 /bin/bash 
```
## 容器數據卷
docker 容器內產生的數據，如果不通過docler commit生成新的鏡像，使得數據做為鏡像的一部份保存下來，那麼當容器刪除後數據自然隨之消失。

為了解決上述問題，於是產生的數據卷。

1.數據卷可在容器之間共享或重用數據。
2.數據卷中的更改不會包含在鏡像的更新中。
3.數據卷的更改不會包含在鏡像的更新中。
4.數據卷的生命週期一直持續不斷到沒有容器使用它為止。


```
docker run -it -v /宿主機的絕對路徑:/容器內目錄路徑 鏡像名
docker run -it -v /宿主機的絕對路徑:/容器內目錄路徑:ro 鏡像名
(如果沒有該文件夾，則會自動生成)
(:ro 只可讀不可寫)
```
指令輸入時將宿主機上資料夾路徑與想要連容器的資料夾分別輸入並加上原本生成的鏡像名，指令使用後將自動連線兩資料夾，並共享資料夾內的內容，若原路找不到該資料夾，則會自行建立一個該名稱的資料夾，並完成掛載。

example:
```
docker run -it -v /mydata:/datavolume centos
docker run -it -v /mydata:/datavolume:ro centos
```
把宿主機根目錄的mydata資料夾和鏡像產生centos容器中的datavolume資料夾掛載。
容器停止退出後，再重新執行進入，內容仍然可以同步。

觀看是否掛載成功
```
docker inspect 容器名
```

###### tags: `docker`