Docker三大組件詳解


Docker鏡像

   Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載(默認是Docker Hub 公共注冊服務器中的倉庫)。

鏡像操作:

   1. 搜索鏡像

        docker search

       docker search nginx  #  從 Docker Hub 查找具有 nginx 關鍵字的鏡像.

   2. 下載鏡像

       docker pull 

      此命令用來從倉庫獲取需要的鏡像

      docker pull nginx  # 從 docker hub 的nginx 倉庫下載 nginx 鏡像到本地.

[root@localhost ~]# docker images # 查看本地的 docker 鏡像,TAG  信息用來標記來自同一個倉庫的不同鏡像。
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              568c4670fa80      2 weeks ago       109MB
倉庫名               標簽                  鏡像ID             

   3. 修改鏡像倉庫名和Tag 名稱

      docker tag IMAGEID(鏡像id) REPOSITORY:TAG(倉庫:標簽)

[root@localhost ~]# docker tag 568c4670fa80 bushaoxun/nginx:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB

   4. 創建鏡像

       通過容器創建鏡像

       docker commit -m “指定提交的說明信息”  -a "指定更新的用戶信息"   容器ID  鏡像的倉庫名:tag  # 創建成功后返回鏡像 ID 信息.

[root@localhost ~]# docker commit -m "nginx-dev" -a "bushaoxun" b6c542a22efc  shaouxn/nginx-dev:v1
sha256:26546368ce8387ffef823e16b7712d4b29a9bd996f85966eaeca8c264a2650d9  #鏡像ID
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shaouxn/nginx-dev   v1                  26546368ce83        13 seconds ago      109MB
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB

     利用Dockerfile來創建鏡像

     1. 新建一個目錄和一個 Dockerfile 文件

     2 . 進入目錄並編寫 Dockerfile 文件

# This is a comment
FROM bushaoxun/nginx  # 基於哪個鏡像創建
MAINTAINER bushaoxun  # 維護者的信息
RUN mkdir -p /var/www/html  # 創建中在容器中執行的命令

    3. 創建鏡像

# docker build 指定倉庫名和標簽名
[root@localhost newimage]# docker build -t="bushaoxun/nginx:v1" .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM bushaoxun/nginx:latest
 ---> 568c4670fa80
Step 2/3 : MAINTAINER bushaoxun
 ---> Running in 6130257ff12b
Removing intermediate container 6130257ff12b
 ---> e480b4783294
Step 3/3 : RUN mkdir -p /var/www/html
 ---> Running in d46920df7e5d
Removing intermediate container d46920df7e5d
 ---> 593d8fbe1711
# 查看創建的鏡像
[root@localhost newimage]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bushaoxun/nginx     v1                  593d8fbe1711        9 seconds ago       109MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
bushaoxun/nginx     latest              568c4670fa80        2 weeks ago         109MB

    4. 從本地文件系統導入鏡像

     要從本地文件系統導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術)的模板來創建: openvz 的模板下載地址為 templates 

#下載文件系統
wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
#從下載的文件系統導入成為鏡像
cat centos-7-x86_64.tar.gz | docker import - centos:v1
#查看導入的鏡像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              v1                  0d3ef3a9e423        10 seconds ago      589MB

    5. 存出和載入鏡像

    存出鏡像:docker save -o centos.tar centos:v1  # 保存鏡像到本地文件

    載入鏡像: docker load --input centos.tar  # 從本地文件中再導入到本地鏡像庫,這將導入鏡像以及其相關的元數據信息(包括標簽等)。

容器操作

   容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套操作系統(提供了運行態環境和其他系統環境)和跑在上面的應用。

   1. 新建容器

       容器是基於鏡像創建的。

#啟動一個Bash終端,允許用戶進行交互創建容器.
# -t  選項讓Docker分配一個偽終端(pseudo-tty)並綁定到容器的標准輸入上,  -i  則讓容器的標
准輸入保持打開。
docker run -it centos:v1 /bin/bash
#讓 Docker容器在后台以守護態(Daemonized)形式運行
docker run -itd centos:v1 /bin/bash

   2. 啟動停止容器

      docker start 容器名或者ID  #啟動容器

      docker stop 容器名或者ID  #停止容器

   3. 進入容器

       僅介紹 .bash_docker 的方式

       編寫 .bashrc_docker 文件,內容如下:

# Some useful commands to use docker.
# Author: yeasy@github
# Created:2014-09-25

alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'"
alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"

#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
    #if [ -e $(dirname "$0")/nsenter ]; then
    #Change for centos bash running
    if [ -e $(dirname '$0')/nsenter ]; then
        # with boot2docker, nsenter is not in the PATH but it is in the same folder
        NSENTER=$(dirname "$0")/nsenter
    else
        # if nsenter has already been installed with path notified, here will be clarified
        NSENTER=$(which nsenter)
        #NSENTER=nsenter
    fi
    [ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return

    if [ -z "$1" ]; then
        echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
        echo ""
        echo "Enters the Docker CONTAINER and executes the specified COMMAND."
        echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
    else
        PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
        if [ -z "$PID" ]; then
            echo "WARN Cannot find the given container"
            return
        fi
        shift

        OPTS="--target $PID --mount --uts --ipc --net --pid"

        if [ -z "$1" ]; then
            # No command given.
            # Use su to clear all host environment variables except for TERM,
            # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
            # and start a login shell.
            #sudo $NSENTER "$OPTS" su - root
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
        else
            # Use env to clear all host environment variables.
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i $@
        fi
    fi
}

     把 .bashrc_docker 文件內容加載到系統變量

echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

     常用命令介紹

#顯示容器的 pid
docker-pid 容器名或容器ID
#進入容器
docker-enter 容器名或容器ID

    4. 導出和導入容器

# 導出容器到本地文件
docker export  容器名或者容器ID  >  文件名
#從導出的容器快照文件導入成為鏡像
cat 容器快照文件名 | docker import -  倉庫名:tag
#:用戶既可以使用  docker load  來導入鏡像存儲文件到本地鏡像庫,也可以使用  docker import  來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息
(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。

倉庫

目前 Docker 官方維護了一個公共倉庫 Docker Hub,大部分需求,都可以通過在 Docker Hub 中直接下載鏡像來實現。
可以通過執行  docker login  命令來輸入用戶名、密碼和郵箱來完成注冊和登錄。 注冊成功后,本地用戶目錄的  .dockercfg  中將保存用戶的認證信息。

   1. 自動創建鏡像

       自動創建允許用戶通過 Docker Hub 指定跟蹤一個目標網站(目前支持 GitHub 或 BitBucket)上的項目,一旦項目發生新的提交,則自動執行創建。

       要配置自動創建,包括如下的步驟:
           創建並登錄 Docker Hub,以及目標網站;
           在目標網站中連接帳戶到 Docker Hub;
           在 Docker Hub 中 配置一個自動創建;
           選取一個目標網站中的項目(需要含 Dockerfile)和分支;
           指定 Dockerfile 的位置,並提交創建。
       之后,可以 在Docker Hub 的 自動創建頁面 中跟蹤每次創建的狀態。

    2. 私有倉庫

       docker-registry  是官方提供的工具,可以用於構建私有的鏡像倉庫。

#通過 docker 鏡像的方式構建私有倉庫。 -v  掛載本地卷到容器卷。  --restart=always, 隨docker啟動而啟動.
docker run -d -v /var/lib/registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest

     由於docker push 的時候,默認是 https 連接,實現方法有很多種,這里我們先暫時放行 http 連接。

# 編輯配置文件
vim /etc/docker/daemon.json
{
  "registry-mirrors": [ "https://registry.docker-cn.com"], #加速器,aliyun的https://zgmke8qe.mirror.aliyuncs.com
  "insecure-registries": [ "192.168.8.77:5000"] # 配置 http 連接訪問
}

    上傳鏡像到私有倉庫

#docker tag  改變鏡像倉庫名稱
docker tag 鏡像ID 192.168.8.77:5000/centos
#上傳鏡像到私有倉庫
docker push 192.168.8.77:5000/centos
#查看倉庫里面的鏡像
[root@localhost docker]# curl http://192.168.8.77:5000/v2/_catalog
{"repositories":["centos","nginx"]}

   配置 web 界面查看倉庫內的鏡像

# 啟動 web 界面docker 容器, 傳入私有倉庫的地址和端口號.
docker run -d -e ENV_DOCKER_REGISTRY_HOST=192.168.8.77 -e ENV_DOCKER_REGISTRY_PORT=5000  -p 8080:80 konradkleine/docker-registry-frontend:v2
# 訪問 web 界面
http://192.168.8.77:8080/home

      

 

 

 

 

      

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM