上一篇中,咱們對Docker有了一個基本的瞭解
下面將討論Docker中Image,Container的相關實際操做css
Image管理:mysql
鏡像的命名和版本管理:linux
普通鏡像的命名規範
{namespace}/{repository}:{tag}web
namespace是docker hub的用戶名
repository是項目名稱,如:Ubuntu,mysql等
tag表示版本信息,例如:cesc/mysql:5.5,tag是可選的,默認爲latestsql
顯示本地的imagesdocker
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:ruby
在Host看來,運行一個Container就是開啓一個獨立namespace進程而已bash
經過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有三種方式:
一、sshd
須要在Container中安裝sshd服務,而後經過ssh鏈接便可(安全性不高)
二、nsenter
由linux提供,用來進入一個進程的namespace
docker inspect --format "{{.State.Pid}}" <container-id>
//首先要得到Container在host中的進程id
nsenter --target $pid --mount --uts --ipc --net --pid
//而後經過下面的命令進入Container
三、exec
是Docker新進入的一個命令,用來進入一個Container來運行一些指令
docker exec containerId commod args