下載官方的ubuntu image:
sudo docker pull ubuntu
然後運行hello world:
sudo docker run ubuntu /bin/echo hello world
三種運行命令的模式
短暫方式,就是剛剛的那個”hello world”,命令執行完後,container就終止了,不過並沒有消失,可以用
sudo docker ps -a看一下所有的container,第一個就是剛剛執行過的container,可以再次執行一遍:sudo docker start container_id
不過這次看不到”hello world”了,只能看到ID,用
logs命令才能看得到,sudo docker logs container_id
可以看到兩個”hello world”,因為這個container運行了兩次。
交互方式,
sudo docker run -i -t image_name /bin/bash
daemon方式,即讓軟件作為長時間服務運行,這就是SAAS啊!
例如,一個無限循環打印的腳本(替換為memcached, apache等,操作方法仍然不變!):
CONTAINER_ID=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done")
在container外面查看它的輸出
sudo docker logs $CONTAINER_ID
或者連接上容器實時查看
sudo docker attach $CONTAINER_ID
終止容器
sudo docker stop $CONTAINER_ID
sudo docker ps看一下,已經沒了docker ps 命令詳解
sudo docker ps,列出當前所有正在運行的containersudo docker ps -l,列出最近一次啟動的,且正在運行的containersudo docker ps -a,列出所有的container
其他用法請參考
sudo docker ps -h
還有一種方式可以讓程序在daemon模式下運行,就是在Dockerfile裡設置USER為daemon,見Dockerfile tutorial Level2。
熟悉一下Dockerfile
完了幾遍交互式入門教程後,你會好奇,怎麼自己定制一個image,例如把常用的軟件裝好後打包? 這時候該Dockfile 登場了。Dockerfile 實質上是一個腳本文件,用於自動化創建image。
請跟著官方教程走一遍,Dockerfile Tutorial
到這裡,官網的Getting started的內容基本上消化完了,接下來就是翻官網的Documentation了。
現在創建一個目錄,並且創建一個Dockerfile
mkdir filename
cd filename
touch Dockerfile
把上面的內容填充在Dockerfile中
我的第一個Dockerfile
文件名為update.dockerfile,內容如下:
# use the ubuntu base image provided by dotCloud
FROM ubuntu
MAINTAINER Frank Dai soulmachine@gmail.com
# if you're behind a government firewall or company proxy
# ENV http_proxy http://proxy-prc.intel.com:911
# ENV https_proxy https://proxy-prc.intel.com:911
# RUN echo "Acquire::http::proxy \"proxy_server:port\";" >> /etc/apt/apt.conf
# RUN echo "Acquire::https::proxy \"proxy_server:port\";" >> /etc/apt/apt.conf
# choose a faster mirror, see http://t.cn/zWYrzCE
RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt precise main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt precise-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt precise-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt precise-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update -y
# currently docker official ubuntu image has a problem with apt-get upgrade
# RUN apt-get upgrade -y && apt-get dist-upgrade -y
RUN apt-get clean all
# install wget
RUN apt-get install -y wget
RUN wget www.baidu.com
RUN rm index.html
#install vim editor
RUN apt-get install -y vim
注意一個坑:
apt-get upgrade在當前官方的ubuntu image裡是無法運行成功的,見Issue #1724 apt-get upgrade in plain Ubuntu precise image fails。所以,乾脆放棄更新吧,能apt-get install軟件就行了,不要有更新強迫症:)刪除容器
每一行命令都會產生一個新的容器(無論是在
sudo docker run -i -t ubuntu /bin/bash模式下,還是Dockerfile裡的RUN命令),玩了一會兒後,sudo docker ps -a會看到很多容器,很是乾擾視線,可以用一行命令刪除所有容器:sudo docker rm `sudo docker ps -a -q`
創建image
有兩種用方式,
- 寫一個Dockerfile,然後用
docker build創建一個image - 在容器裡交互式地(例如
sudo docker run -i -t ubuntu /bin/bash)進行一些列操作,然後docker commit固化成一個image。
image相當於編程語言裡的類,container相當於實例,不過可以動態給實例安裝新軟件,然後把這個container用commit命令固化成一個image。
使用前面寫好的update.dockerfile,創建一個image:
sudo docker build -t soulmachine/ubuntu:latest - < update.dockerfile
sudo docker build -rm -t soulmachine/ubuntu:latest .
下載image
https://index.docker.io/是官方的image倉庫,也可以用Docker-Registry創建自己的倉庫,這就好比git,https://index.docker.io/相當於Github,也可以自己DIY搭建一個git服務器,把自己的代碼託管到私有的服務器上。
sudo docker pull ubuntu是從https://index.docker.io/_/ubuntu/下載名為ubuntu的repo,裡麵包含了幾個tag,默認使用latest這個tag。這個repo是docker官方的。上傳並共享image
自己build了一個image,想要共享,怎麼辦?參考這篇文章,How to build and publish base boxes for Docker?
註冊一個賬號
build一個image
build命令格式如下:
sudo docker build -t username/repo:tag - < Dockerfile
如果沒有tag,則默認為latest。
登陸
sudo docker login
輸入自己的用戶名和密碼。
push 到Docker index
sudo docker push username/repo
這條命令會把一個repo下面的所有tag都push到https://index.docker.io/