Docker初步實踐遇到的一些問題

爲何刪除不了有些Images

當你試圖刪除一個你不用的image的時候,有時候會告訴你有個container正在使用這個鏡像,可是docker ps 並無發現相關的container,這個是因爲對container的exit理解不深形成的。python

這裏有兩個不一樣的單詞,images和container。其中images很好理解,跟日常使用的虛擬機的鏡像一個意思,至關於一個模版,而container則是images運行時的的狀態。docker對於運行過的image都保留一個狀態(container),可使用命令docker ps來查看正在運行的container,對於已經退出的container,則可使用docker ps -a來查看。 若是你退出了一個container而忘記保存其中的數據,你可使用docker ps -a來找到對應的運行過的container使用docker commit命令將其保存爲image而後運行。linux

事實上你須要rm掉那個container才能夠進行rmi的操做git

docker ps -a
docker rm ${container_id}
docker rmi ${iamge_id}

在Ubuntu下使用docker 可是不想寫sudo

原理仍是將用戶加入docker組 問題解決web

掛起一個container

Ctrl+p, Ctrl+qdocker

#不當心exit可是數據沒有保存ubuntu

docker ps -a

檢查全部的關掉的containerbash

docker restart ${old_container_id}

可是問題是,也許你會以爲有些container明明都不用了卻還在那裏礙眼,能夠刪掉全部舊的containerapp

docker rm $(docker ps -a -q) #這個更暴力一點
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm # 我的更喜歡這個

或者是有些時候你想刪掉中間層的鏡像webapp

有些時候你能夠在run裏頭加這個參數,這樣在退出container的時候就會直接刪掉那個container了rest

--rm=false Automatically remove the container when it exits

Docker commit and docker push

commit是commit一個正在運行的container做爲一個新的鏡像 push是把整個repo都推上去,包括全部的tag 和git同樣的

#指定端口

docker run -ti -p 主機端口:容器端口 鏡像 命令
docker ps nostalgic_morse # 用於查看端口映射的狀況

#掛載數據卷 掛載數據卷纔是Best Practice,Docker的本質不但願和主機發生太多的關係,不要太期望在主機上放數據文件 這篇文章 講了這件事情的Best practice,反正就是使用data-only-container就對了

主要是還說了另外的方法的drawback

數據卷說白了就是什麼都不作的卷

  • 拉一個數據鏡像
docker pull maxexcloo/data

這個鏡像其實很簡單,看一下Dockerfile

FROM busybox:latest
MAINTAINER Max Schaefer <max@excloo.com>
RUN mkdir /data
VOLUME /data

基於buzybox,在我看來buzybox就是linux命令的一個子集

You can also use the VOLUME instruction in a Dockerfile to add one or more new volumes to any container created from that image.

這個 VOLUME關鍵字和 run後面的參數 -v是一個意思,在我看來這個數據是沒有辦法持久化的(2014.12.10)

  • 不拉鏡像
docker run -ti --name web -v /src/webapp:/opt/webapp training/webapp python app.py

--name="" Assign a name to the container

注意這兩個的區別

-v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)

這個是指定目錄

--volumes-from=[] Mount volumes from the specified container(s)

這個後面跟container_id或者是--name指定的名字

在一個指定的container裏頭跑一條命令

docker exec container_id command

查看docker container的ip

docker inspect ${CONTAINER_ID}
相關文章
相關標籤/搜索