版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/46291047
上一篇中,我們對Docker有了一個基本的了解
下面将讨論Docker中Image,Container的相關實際操作
Image管理:
鏡像的命名和版本管理:
普通鏡像的命名規範
{namespace}/{repository}:{tag}
namespace是docker hub的使用者名
repository是項目名稱,如:Ubuntu,mysql等
tag表示版本資訊,例如:cesc/mysql:5.5,tag是可選的,預設為latest
顯示本地的images
docker images
我們可以通過docker指令從Docker Hub上拉取鏡像回本地:
docker pull {image name}
//如果沒有指定image的tag的話,會把該image的所有版本都下載下傳下來
上傳鏡像:
docker login
//登陸到docker hub中
docker commit containerId
//将一個指定的Container打包成一個image,這時會傳回一個臨時的imageId(一大串)
docker tag imageId {namespace}/{repository}:{tag}
//根據imageId重命名image
docker push {namespace}/{repository}:{tag}
//push到docker hub
運作Container:
在Host看來,運作一個Container就是開啟一個獨立namespace程序而已
通過docker run指令來啟動一個container,必須指定一個image作為初始化的檔案系統
docker run [options] image[:tag] [commond][args]
//[options]表示一些運作參數
//如-t,表示後面用哪個image作為template
//-d,表示背景運作等
//[commond],表示可以輸入一些linux指令 如ls等,作為container實際運作的首程序
//[args],表示上面的指令需要的參數,如-al
如果-t 後面的image不存在本地的話,會自動到docker hub上下載下傳對應的image
docker run -d -t image[:tag]//-d讓container運作在背景
docker run -a stdin//預設是運作在前台的,會将輸入,輸出和錯誤資訊列印出來,通過-a來限制隻有stdin,這樣就看不到輸出和錯誤資訊了
docker attach containerId//将一個背景的container attach到前台
docker ps//檢視目前的container,用法和linux中的ps類似
docker inspect containerId//獲得指定container的所有資訊
docker logs containerId//檢視指定container的日志資訊
網絡設定:
Docker預設使用橋接的方式,如下圖:
Host上對應每個Container都有veth{id}這樣的虛拟網卡,對應每個Container裡面的eth0,Host上的bridge負責将資料在各個veth中轉發,以達到通信的目的
docker run -dt --net none image[:tag]
//none關閉網絡
//host使用主機網絡棧,将不做veth映射
//container:{containerId}使用另外一個container的網絡
端口映射:
docker通過端口映射的方式,能夠将container内部的網絡端口暴露到外部
docker run -dt -p 80:8000 image[:tag]
//将内部的80端口暴露出來,外部可以通過8000通路到,如果沒有指定外部對應的端口号,将會預設配置設定一個49000-49900之間的一個端口,可以通過docker ps來檢視自動配置設定的端口
Volume綁定:
通過-v參數可以将Host上的一個目錄綁定到container中,允許container對其進行讀寫
docker -dt -v /home/jchubby:/test image[:tag]
//将host上的/home/jchubby映射到container中的/test目錄
環境變量設定:
既然container可以看成一個獨立的os,那麼肯定會有環境變量的設定
舉一個例子來說明:
有兩個container,a是提供資料庫服務的,b是web應用,那麼b要怎麼才能知道a的主機ip,端口等資訊,然後進行服務接入呢?
docker run --name mysql -dt image[:tag]
//通過--name為該container指定一個唯一的name
docker run --link mysql:db -dt image[:tag]
//通過link參數,可以将指定name(mysql)的container資訊以環境變量的方式加到目前的container中,:db是mysql的别名
–link運作産生的環境變量結果如下:
如何進入Container:
每個Container都是一個獨立的os,我們可以像操作VM虛拟機一樣操作它
連接配接到Container有三種方式:
1、sshd
需要在Container中安裝sshd服務,然後通過ssh連接配接即可(安全性不高)
2、nsenter
由linux提供,用來進入一個程序的namespace
docker inspect --format "{{.State.Pid}}" <container-id>
//首先要獲得Container在host中的程序id
nsenter --target $pid --mount --uts --ipc --net --pid
//然後通過下面的指令進入Container
3、exec
是Docker新進入的一個指令,用來進入一個Container來運作一些指令
docker exec containerId commod args