docker常用設定以及命令

2022-11-07 15:00:42

1. Docker基本概念

1.1 什麼是 docker hub

DockHub是一個倉庫
https://hub.docker.com/

倉庫是集中存放映象檔案的場所
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

  • docker拉取命令
    docker pull centos
  • docker 檢視映象
    docker images

1.2 什麼是docker映象?

Docker映象是一個特殊的檔案系統 除了執行時所需要的程式,庫 資源 設定等檔案意外,還包含了一些執行時的準備的的一些設定引數(如匿名卷、環境變數、使用者等).映象不包含任何動態資料、其內容在構建之後也不會被改變。

共用一個base映象 但是base映象不會被修改
只會修改單個容器內
這個用到了docker特性

每當一個映象被建立 就會建立一個可寫層在上方
這個可寫層又被稱為容器層 容器層的下方統一叫映象層

使用centos映象建立一個容器

sudo docker run --name centos_test -it centos /bin/bash

1.3 什麼是容器

容器是一種輕量級,可移植,自包含的軟體打包技術 ,是一種應用程式,可以
在九乎任何地方以相同的方式執行。
開發人員在自己筆電上建立並測試好的容器,無需任何修改就能夠在生產系
統的虛擬機器器,物理伺服器或公有云主機上執行。

那為什麼需要容器 以及為什麼被稱為容器?

1.4 docker容器的優勢

容器的優勢 ,對於開發人員來說,建立一次,可以在任何地方執行,對於運維人員來說,設定一次,可以執行所有應用

1.5 docker容器是如何工作的

docker的核心元件包括:
docker使用者端,docker伺服器,docker映象,registry,docker容器

1.6 docker使用者端

在Linux系統下,Docker Client 和Docker daemon和容器直接執行在宿主機上,這意味著容器可直接使用宿主機埠資源,不需要在容器和宿主機之間對映埠。

在Windows或Max X系統下,Docker服務執行在Linux虛擬機器裡,Dockerclient執行在宿主機下跟Docker服務通訊。,當執行容器裡,它用的埠資源是虛擬機器裡的,必須跟宿主機上的埠對映。

6.1.7 docker 服務
Docker 服務是Docker最核心的後臺程序,它負責響應來自Docker client的請求,然後將這些請求翻譯成系統呼叫完成容器管理操作。
該程序會在後臺啟動一個API Server負責接收由Docker client傳送的請求;接收到的請求將通過Docker 服務內部的一個路由分發排程,再由具體的西數來執行請求。

2. docker 命令

容器執行

$ docker run -it centos /bin/sh
docker 使用者端使用docker命令來執行 run引數 表明使用者端要執行一個新的容器.
docker使用者端要執行一個容器需要告訴 docker守護行程的最小引數是:

  1. 這個容器從哪個映象中建立.這是centos,基礎的centos映象
  2. 在容器中要執行的命令,這裡是/bin/bash 在容器中執行bash shell

那麼執行這個命令在底層發生了什麼?
按照順序

  1. 拉取映象 檢查是否存在 如果沒有會在docker pub中下載.如果已存在 建立新的容器
  2. 建立新的容器,當docker 有了這個映象之後,docker 會用他建立一個新的容器.
  3. 分配檔案按系統 並且掛載一個可讀寫的曾,容器會在這個檔案系統中建立.並且一個可讀寫的曾被新增到映象中,
  4. 分配網路/橋接介面,建立一個執行容器與本地主機通訊的網路介面.
  5. 設定一個ip地址:從池中尋找一個可用的ip並且附加到容器中
  6. 執行你指定的程式 執行該程式
  7. 鋪貨並且提供應用輸出: 連結並且記錄標準輸出,輸入和錯誤,讓你可以看到你的程式如何執行的

檢視所有執行 的容器

docker ps -a

停止 docker

docker stop id

殺死程序

docker kill id

進入容器內部

docker attach id

通過 docker exec -it + 短id 進入容器內部

docker exec -it + 短id

attach 和exec的區別

attach 和exec主要區別如下

  • attach 直接進入容器啟動命令的終端,不會啟動新的程序.
  • exec 則是在容器中開啟新的終端 並且可以啟動新的程序
  • 如果像直接在終端檢視命令的輸出 用attach
  • 其他請看用exec

其他的一些命令

# 啟動死掉的容器
docker start 短id

# 重啟 docker容器
docker restart 短id

# 暫停 docker 容器 # 不會佔用資源
docker pause 短id

# 重新執行 容器
docker unpause 短id

# 刪除docker 容器 #可以同時刪除兩個 空格隔開
docker rm 短id 短id

# 批次刪除 所有死掉的docker
docker rm -v $(docker ps -aq -f status=exited)

# 刪除映象
docker rmi hello-world

# 刪除異常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'` 
 
#  刪除名稱或標籤為none的映象
docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`

# 清除所有無容器使用的映象 注意,此命令只要是映象無容器使用(容器正常執行)都會被刪除,包括容器臨時停止
docker system prune -a

4. docker-appium的使用

docker 安裝apoium 巨坑!! 不建議安裝

這裡推薦另一種方式 直接從docker hub上安裝

sudo docker search appium

然後 docker pull 映象即可

sudo docker pull appium/appium

如果下載的太慢 可手動設定加速器

  • 建立一個Docker的組態檔。
    • sudo vim /etc/docker/daemon.json
  • 編寫組態檔
    • { "registry-mirrors": ["此處寫映象源地址"]
    • Docker映象源地址:

官方國內映象 https://registry.docker-cn.com

網易 http://hub-mirror.c.163.com

中國科技大學 https://docker.mirrors.ustc.edu.cn

  • 重新載入組態檔並重啟Docker。
    • sudo systemctl daemon-reload
    • sudo systemctl restart docker
  • 驗證映象源是否修改成功
    • sudo docker info
    • 檢視docker 容器ip
      • docker inspect 容器ID | grep IPAddress

5. 自己提交一個映象

我們執行的容器可能在映象的基礎上做了一些修改,有時候我們希望儲存起來,封裝成一個更新的映象,這時候我們就需要使用 commit 命令來構建一個新的映象

docker commit -m="提交資訊" -a="作者資訊" 容器名/容器ID 提交後的映象名:Tag

我們拉取一個tomcat映象 並持久化執行 且設定與宿主機進行埠對映

docker pull tomcat

docker run -itd -p8080:8080 --name tom tomcat /bin/bash

使用 提交命令 將在執行的tomcat 容器 打包為一個全新的映象 名字為tom Tag為1.0

docker commit -a="leilei" -m="第一次打包映象,打包後直接存取還會404嗎" 231f2eae6896 tom:1.0

6. Docker映象建立的兩種方法

6.1. 使用commit 命令建立docker映象

建立一個nginx映象
sudo docker run --name webserver -d -p 80:80 nginx
執行完命令 建立成功
然後我們存取瀏覽器

假設我們不喜歡這個頁面 想修改這個頁面
我們可以進入docker容器內
sudo docker exec -it webserver bash

然後 輸入命令
echo '<h1>hello,docker!</h1>' >/usr/share/nginx/html/index.html
然後就修改了頁面了

docker diff命令
我們修改了檔案即修改了儲存層
可以通過命令檢視剛剛有哪些操作
sudo docker diff webserver

Docker commit 命令
Docker commit 命令可以疊加內容從而重新生成一個映象
docker commit [選項]<容器ID或容器苗> [<倉庫名>][:<標籤>]

sudo docker commit --author "lzc <[email protected]>" --message "modify Default page" webserver nginx:v2

這個時候就可以通過sudo docker images來檢視了

或者通過sudo docker histroy nginx:v2

我們再建立一個為81埠的nginx容器
sudo docker run --name web2 -d -p 81:80 nginx:v2
然後存取 192.168.2.91:81
可以發現 頁面還是一樣的 說明映象建立成功

!!!! 慎用 docker commit 命令
使用docker commit 命令雖然可以比較直觀的幫助理解映象分層的概念 但是實際開發環境不會這麼使用
因為由於命令執行了 很多檔案發生了改動 這還僅僅是簡單錯誤 如果是安裝檔案 編譯構建 那麼映象會非常臃腫,
此外 使用docker commit 意味著 所有對映象的操作都是黑箱操作,生成的映象也被稱之為 黑箱操作

6.2 使用Dockerfile 建立docker映象

什麼是dockerfile
Dockerfile 是一個文字檔案。其包含了一條一條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應該如何構建。
命令:
必須命名為Dockerfile

mkdir mynginx
cd mynginx
touch Dockerfile

然後編輯此檔案

FROM nginx
RUN echo '<h1>Hello,world</h1>' > /usr/share/nginx/html/index.html

然後執行命令(記住有個 點 . 代表執行dockerfile的目錄)
sudo docker build -t nginx:v3 .

我們可以把映象上傳到docker中去
https://hub.docker.com/repositories

在我們上傳映象 要確保我們的docker 賬號是登入狀態的

  • 登入命令命令
    sudo docker login -u xxx -p xxx
  • 修改tag命令
    sudo docker tag nginx:v3 hybpjx/nginxv3:v3

使用這個名字
然後執行
sudo docker push hybpjx/nginxv3:v3
即可完成上傳

FROM 和RUN

【FROM指定基礎映象】
基礎映象是必須指定的。而FROM就是指定基礎映象,因此應該Dockfile中FROM是必備的指令。並且必須為第一條指令。

【Run指令的兩種格式】
shell 格式:RUN<命令>,就像是再命令列中輸入的命令一樣。
exec格式:RUN["可執行檔案","引數1","引數2"],這更像是函數中呼叫的格式

比如

RUN apt-get update
RUN apt-get install vim

就是建立了兩層映象 這樣毫無意義
最大不能超過127層的
正確寫法為:

RUN apt-get install \
	&& apt-get install vim

注意: 任何無關的檔案都要清理