---
# System prepended metadata

title: Docker
tags: [Linux]

---

[TOC]

# Docker

Docker History：

2010年 San Franciscro Of United State
dotCloud為(Platform-as-a-Service, Pass) 平台即服務供應商。底層技術上,dotCloud平台利用了Linux的LXC容器技術。

為了方便創建和管理這些容器，dotCloud基於Google公司推出的Go語言開發了一套內部工具，之後被命名為Docker，Docker就是這樣誕生的。

public docker image repository


# 容器化
容器化：
是軟體開發的一種方法，在這種方法中，程式和他所依賴的組件和集合包，以及相關的環境變數、配置文件都會被完全打包成容器鏡像，進行單元測試，最後將這個容器部屬到服務器的操作系統中。

一致的運行環境：
避免開發環境或測試環境、生產環境的不一致導致一些Bug的產生，而Docker鏡像提供除了內核外完整的運行時環境，確保了應用運行環境的一致性。

更輕鬆的搬移程式碼：
由於Docker確保了執行環境的一致性，使得程式的搬移更加容易，Docker可以在很多平台上運行，無論是物理機、虛擬機、公有雲、私有雲、或是一般電腦其運行結果都會是一致的。

持續交付和部署：
對開發和運維(DevOps)人員來說，最希望的就是一次創建或配置，可以再任意地方正常運行。使用Dockerfile訂製程式鏡像來實現持續集成、持續交付、部署。而且使用Dockerfile使鏡像構建透明化，不僅僅開發團隊可以理解程式運行的環境，也方便DevOps團隊理解程式運行所需條件，幫助更好的生展環境中部署該鏡像。

更輕鬆的維護和擴展：
Docker使用的分層儲存以及鏡像的技術，使得程式重複部分的重複使用更為容易，也使得程式的維護及更新更加簡單，基於基礎鏡像進一步擴展的鏡像，也變得非常簡單。此外，Docker團隊同各個開源項目團隊一起維護了，一大批高質量的官方鏡像，既可以直接在生產環境使用，又可以做為基礎進一步的訂製，大大的降低了應用服務的鏡像製作成本。


### CentOS 7
下載教學
https://iter01.com/578383.html



### Windows Terminal
https://www.kwchang0831.dev/dev-env/wsl/centos

### Wsl 
https://ithelp.ithome.com.tw/articles/10255920
https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-10#2-install-wsl


Wsl PID
https://askubuntu.com/questions/1379425/system-has-not-been-booted-with-systemd-as-init-system-pid-1-cant-operate

Windows 進入Wsl資料夾方法
資料夾目錄輸入 \\wsl$

### ubuntu可能要運行
wsl.exe install

### 開啟 docker服務
sudo service docker start

### 修改image拉取的網域
daemon.json
vi /etc/docker/daemon.json

### vim 編輯器
https://linux.vbird.org/linux_basic/centos7/0310vi.php

### docker run hello-world
![](https://i.imgur.com/lpDOXma.png)

### image分層

![](https://i.imgur.com/y9H8DGE.png)
表示該image已經存在

### Volume 數據卷
可將資料從Container同步到Server上，做數據持久化。
### Registry 註冊中心
官方提供 https://hub.docker.com Repository

registry image可以讓我們在自己本機搭建一個repository


# docker command-line 

### 查image清單

    docker images
    docker image ls

REPOSITORY：image在repository中的名稱。
TAG: image tag
IMAGE ID: image ID
CREATED: image createTime
SIZE: image size

這些image都是儲存在Server或是Local的/var/lib/docker目錄下。

### 刪除image

刪除image

    docker rmi [image name]
    docker rmi [image id]
    docker rmi [image name + image tag]
    
    ex:
        docker rmi redis (如果未指定預設刪除 redis:latest)
        docker rmi redis:5
        docker rmi 226c4c322bdb
    
    
### 從網路上搜尋image

    docker search [search image name]
    
NAME: image name
DESCRIPTION: image description
STARS: popularity
OFFICIAL: 是否為官方建構的
AUTOMATED: 自動構建，表示該image由Docker Hub自動構建流程創建。


### 拉取image

    docker pull [image]
    
# Container command-line

### 查詢Container

查詢正在運行的Container：

    docker ps
    
查詢停止的Container：(-f就是filter的意思)

    docker ps -f status=exited
    
查詢所有Container：

    docker ps -a
    
查詢最後一次運行的Container：

    docker ps -l
    
列出最近創建的n個Container：

    docker ps -n 5

列出最後運行的n個Container：
    
    docker ps -l -n 3
    

### 創建Container

創建並且進入Container：
    
    docker run -it --name [Container Name] [image Name]:tag /bin/bash
    
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
   
-i: 表示運行容器
-t:表示容器啟動後會進入其命令行，加入這兩個參數後，容器創建就能登入進去。即分配一個偽終端;

--name: 給這個容器一個名稱
很像C#中 var myRedis = new redis的概念

-v 表示目錄映射關係(前者是宿主機目錄，後者是映射到宿主機的目錄，可以使用多個 -v做多個目錄或文件映射。注意:最好做目錄映射在宿主機上做修改，然後共享到容器上。

-d 在run後面加上-d參數，則會創建一個守護式容器在後台運行 (這樣創建容器後不會自動登錄容器，如果只加-i -t兩個參數，創建容器後會自動進容器裡)。

-p: 映射port號
把container的port號映射到server的port號 (server or localhost)的port:(docker container)的port。

-P: 隨機映射port號
把server的隨機port號映射到container的port號上。

    ex：
        docker run --name myRedis -p 80:80 redis
        docker run -it --name myNginx -p 80:80 nginx

### 刪除Container

    docker rm [NAMES]
    docker rm [CONTAINER ID]
    
### 退出Container

    exit
    
### 守護方式創建Container

    docker run -di --name [Container Name] [image Name]:tag
        
### 守護式容器登錄方式

    docker exec -it [Container Name]or[Container ID] /bin/bash
        
### 停止與啟動容器

    docker stop [Container Name]or[Container ID]
    docker start [Container Name]or[Container ID]
        
### 文件複製

如果需要將文件複製到容器內可以使用cp命令

    docker cp 需要複製的文件或目錄 [Container Name]:[Container Path]
    
    ex
        docker cp testWoody.txt myNginx:/etc
    
也可以將文件容器內複製出來
    
    docker cp [Container Name]:[Container Path] 需要複製的文件或目錄
    
    ex 
        docker cp myNginx:/etc/WoodyTest3.txt /root/
    
### 目錄掛載 (Container Volume Operation)

我們可以在創建容器的時候，將宿主機的目錄與容器內的目錄進行映射，這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器，而且這個操作是雙向綁定的，也就是說容器內的操作也會影響到宿主機，實現備份功能。

但是容器被刪除的時候，宿主機的內容並不會被刪除。如果多個容器掛載同一個目錄，其中一個容器的內容被刪除，其他容器的內容也不會受到影響。

:::success
容器與宿主機之間的Volume屬於引用的關係，Volume是從外界掛載到容器內部中的，所以可以脫離容器的生命週期而獨立存在，正是由於Volume的生命週期並不等同於容器的生命週期，在容器退出或者刪除以後，Volume仍然不會受到影響，Volume的生命週期會一直持續到沒有容器使用它為止。
:::

創建容器添加 <font color=orange>-v</font> 參數，格式為 <font color=orange>宿主機目錄:容器目錄</font>

    ex
        docker run -di -v /mydata/docker_centod/data:/usr/local/data --name centos7-01 centos:7
    
    ex 
        docker run -di --name myNginx02 -p 81:80 -v /mydata/docker_nginx/:/woody/confi

### 多目錄掛載

    ex 
        docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 [image Name]
     
:::info
掛載的相關訊息會在容器中的Mounts看到，如果創立時沒有綁定任何資料來源，那Mounts就會是[]空陣列，所以如果一開始創建沒有綁定，其中一個做法就是找到容器的Config文件中的Mounts，修改其內容。
:::


### 匿名掛載


# 暫列其他

### vi 
建立並編輯檔案
    
    ex 
        vi WoodyTest01.txt
### cat
觀看檔案內容

    ex 
        cat WoodyTest01.txt
        
### docker inspect
查看容器的所有相關訊息

    ex 
        docker inspect [Container Name]
        
        
https://www.bilibili.com/video/BV1344y1B7xv?p=22&spm_id_from=pageDriver&vd_source=d245a3d8337eba59934877dec9ee317e

https://linux.vbird.org/linux_basic/centos7/0310vi.php