閱讀761 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Docker基礎之四: Docker入門

Docker入門

對Docker感興趣的朋友可以加我的微信ghostcloud2016,然後我把你加到我們的一個Docker愛好者群組裏麵。

首先我們檢查docker是否安裝成功:

root@gctest:~# docker info
Containers: 3
Images: 18
Server Version: 1.9.0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 24
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-32-generic
Operating System: Ubuntu precise (12.04.5 LTS)
CPUs: 1
Total Memory: 979.2 MiB
Name: gctest
ID: 5RZM:ZIIU:OVNC:AS2Y:P6YZ:ZQBU:PUF2:7DR5:D3Y7:L6M5:X5RF:LQ6P
WARNING: No swap limit support

如果安裝成功,會顯示容器數量、鏡像數量、docker版本等信息。可能的失敗原因有:

docker: command not found

這個是安裝失敗,參考上一節。

/var/lib/docker/repositories: permission denied

這個可能是用戶沒有添加到docker組,參考上一節。

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

這個是Daemon沒有啟動成功。

1 下載一個鏡像

# Download an ubuntu image
$ docker pull Ubuntu

剖析:

  • 該命令首先檢查本地有沒有ubuntu鏡像,如果沒有默認會從Docker Hub進行拉取
  • 當下載成功會出現539c0211cd76: Download complete
  • 這個ID是一個縮寫的ID,完整的ID可以通過下麵的命令獲取docker inspect 或者docker images –no-trunc=true

2 運行一個可交互的shell終端

$ docker run -i -t ubuntu /bin/bash

剖析:

  • -i 表示啟動一個可交互的容器
  • –t表示使用pseudo-TTY,關聯到容器的stdin和stdout
  • 在終端中,如果輸入exit命令將會停止當前容器;因此如果隻是取消關聯,可以鍵入ctrl-p或者ctrl-q
  • 你可以在其他終端通過docker ps –a查看已經運行的容器列表

3 運行一個長時間的程序

# Start a very useful long-running process
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# Collect the output of the job so far
$ docker logs $JOB

# Kill the job 稍微延遲點運行
$ docker kill $JOB

剖析:

  • 本例啟動了一個容器,而該容器會每隔1秒輸出Helo World
  • –d 表示在後台運行
  • docker logs $JOB表示查看該容器的日誌,就是查看標準輸出stdout
  • docker kill $JOB表示停掉這個容器

4 查看容器

$ docker ps # 查看運行中的容器
$ docker ps -a # 查看所有容器

5 容器操作

# 創建並啟動容器
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# 停止一個容器
$ docker stop $JOB

# 啟動一個已經創建的容器
$ docker start $JOB

# 重啟一個容器
$ docker restart $JOB

# 停止一個容器
$ docker kill $JOB

# 刪除一個容器
$ docker stop $JOB # 必須先停止
$ docker rm $JOB

6 導出服務端口

# 將4444端口從容器導出,在容器內部通過nc監聽到4444端口(nc是一個簡單的監聽器,可以接收用戶的輸入)
$ JOB=$(docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444)

# 通過docker port可以查看主機上哪一個端口映射到了容器的 4444端口(docker默認使用nat映射方式)
$ PORT=$(docker port $JOB 4444 | awk -F: '{ print $2 }')

# 向主機的端口,發送hello world
$ echo hello world | nc 127.0.0.1 $PORT

# 確認容器收到了hello world
$ echo "Daemon received: $(docker logs $JOB)"

剖析:

  • nc是一個簡單的監聽指定端口的程序
  • -p表示導出容器的指定端口,由於沒有指定主機端口,因此是隨機分配的
  • 外部程序可以通過主機的端口,間接訪問容器的4444端口

7 提交(保存)容器到image

# Commit your container to a new named image
$ docker commit <container> <some_name>

# List your images
$ docker images

剖析:

容器運行一個Image時,是不會對image做修改的,而是在原始image上通過UnionFS增加了一個文件層用於讀寫,因此如果我們要想複用容器,就需要將容器commit成一個鏡像。很多初學者會誤以為啟動一個容器後,原始鏡像就會隨之改變。

最後更新:2017-04-01 13:37:06

  上一篇:go 阿裏分布式數據庫服務實踐
  下一篇:go 海量存儲之十七--一致性和高可用專題