Docker鏡像
Docker 運行容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker 會從鏡像倉庫下載(默認是Docker Hub 公共注冊服務器中的倉庫)。
鏡像操作:
1. 搜索鏡像
docker search nginx # 從 Docker Hub 查找具有 nginx 關鍵字的鏡像.
2. 下載鏡像
此命令用來從倉庫獲取需要的鏡像
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