第一本Docker書。原做者:James Turnbullhtml
這裏只說明Windows環境的安裝(Windows7以上)nginx
使用Docker Toolbox工具便可:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/?spm=5176.8351553.0.0.58a71991lwK6LZgit
而後點擊下一步安裝完畢,web
出現三個圖標,ToolBox是Docker組件的集合,包括了一個極小的虛擬機,在Windows下安裝了一個支持命令行的工具。docker
而其中的Docker Quickstart Terminal,提供了一個命令行操做的平臺,Kitematic (Alpha)提供了一個GUI客戶端的平臺。數據庫
須要注意的是:使用-v的docker run命令在Windows下沒法工做,由於沒法掛載本地目錄。apache
Docker客戶端位於外界,各個客戶端經過Docker守護進程做爲中介,鏈接到Docker容器中。Docker容器和Docker守護進程,屬於Docker主機中的內容。ubuntu
打開Docker Quickstart Terminal輸入命令:docker images,便可查看本地的鏡像。鏡像是存儲在本地的一個位置的(在/var/lib/docker中)vim
docker images
用戶基於鏡像,建立容器。windows
在Docker裏,root文件系統永遠只讀狀態,並會經過root文件系統價值更多的只讀文件系統。這樣的文件系統稱爲鏡像。
容器將鏡像的層層堆疊和覆蓋,造成新的鏡像,下面的鏡像稱爲父鏡像,最底層爲基礎鏡像。在最上層是一個可讀寫的文件系統,用於Docker程序在該讀寫層執行。
這種堆疊稱爲寫時複製,所以說,當在最上層進行修改後,覆蓋了原有的一部分,又能夠構成新的鏡像,而後發佈(快速構建)。
Registry保存用戶的鏡像,下載,上傳鏡像。Docker公司是Docker Hub上存儲了很多官方和私人的鏡像。如MySQL數據庫的鏡像。用戶也能夠本身架設Registry,Registry也有共有和私有之分。
使用鏡像建立容器container。我以爲是鏡像的實例化。使用命令:docker run -i -t ubuntu /bin/bash之類的命令能夠根據鏡像建立容器,鏡像不存在則自動下載鏡像
位置在(/var/lib/docker/containers)。在Toolbox中查看須要使用:docker-machine ssh進入到虛擬機中才能夠查看。如圖,有時候須要sudo,或者切換到管理員才能進入目錄下:
第二種圖爲容器的ID號碼
有時候,一個良好的下載速度是必要的。和其它人同樣,這裏提供一個更改下載鏡像源的方案。
使用阿里雲加速,也許能夠打開參閱:https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors
註冊帳號,找到容器鏡像服務,打開,找到本身專屬的地址,對應系統,而後輸入到控制檯中便可。能夠用docker info 查看鏡像源是否更改。
在終端輸入docker info,能夠查看到當前容器數量,鏡像數量,還有更改的鏡像源等
運行以下代碼,-i保證容器中的STDIN開啓,-t建立僞tty終端,這樣能夠交互。該代碼使用的鏡像爲Ubuntu,當該鏡像不存在則會自動pull而後下載,保存到本地。該鏡像是一個基礎鏡像。
建立的容器,是一個剪裁的Ubuntu系統,有本身的網絡和IP地址,和宿主機通訊的網絡接口。
docker run -i -t ubuntu /bin/bash
運行該行會進入到容器中,並自動爲該容器建立一個名字和一個ID。
名字能夠在run的時候指定,指定的方式爲:
docker run --name my_container -i -t ubuntu /bin/bash
輸入後直接進入該容器中,輸入hostname能夠查看到ID。
經過
apt update apt install net-tools
命令安裝完ifconfig的程序時候,能夠經過ifconfig -a查看到該容器的IP地址。
能夠經過如下代碼在容器中,查看進程,安裝vim等
ps aux apt install vim
輸入exit退出容器,或者ctrl+d退出。退出容器,/bin/bash命令結束,容器中止。
經過如下代碼查看建立的容器詳細信息,包括ID,名字。在引用的時候,可使用ID,也可使用名字引用。
docker ps -a
以下命令便可啓動:(對應到上圖中ID的第一個,也可使用NAMES的值代替ID,這裏ID沒有寫全了,不過能用)
docker start 6d47
使用以下代碼查看STATUS,能夠看到啓動了:
docker ps -a
容器建立使用docker create命令,建立卻不運行它。
雖然容器啓動了,但是沒有進到容器中,不能進行交互式會話。
使用以下命令,附着到正在運行的容器,進行會話。
docker attach 6d47
這樣就又回到交互式環境中了:
守護式容器沒有交互式會話,長期運行在後臺,提供服務便可。使用的命令仍是run命令。
運行以下命令,便可建立一個守護式容器。
docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
運行完之後,經過docker ps -a能夠查看狀態,它在後臺運行。會在每秒中輸出一個hello world。
由於使用了-d參數,因此纔可以放到後臺運行。
查看該容器中的輸出效果:
docker logs my_container
使用以下跟蹤守護式進程日誌(ctrl +c退出跟蹤(容器不會中止)):
另外,-t能夠增長日誌的時間戳信息,如--tail 4,能夠只顯示最後四條信息
docker logs -f my_container
Docker日誌驅動,使用的
docker run --log-driver="syslog" --name container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
建立,可是在Docker Toolbox中,須要使用:
docker-machine ssh syslogd
命令進入Docker Toolbox虛擬機,而後運行syslogd,來啓動syslog守護進程
在終端查看守護式容器中的進程:
docker top my_container
後臺命令示例使用代碼:
docker exec -d my_container touch /etc/new_file
則在該容器中(-d表示後臺執行),建立一個新文件
交互式命令示例使用代碼:
docker exec -t -i my_container /bin/bash
該代碼能夠進去與以前建立的守護式容器進行交互(固然我以前使用了 docker exec -d my_container kill -9 xxx結束了容器中的循環echo的代碼了)。
使用以下(發送SIGTERM信號),中止正在運行的該容器:(也可使用docker kill 發送SIGKILL信號更快中止)
docker stop my_container
建立守護式容器中使用了:docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done",這裏添加--restart部分便可
docker run --restart=always --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
可使用always表示是否正常退出都重啓,使用參數爲on-failure:5表示失敗重啓,次數爲5次。
查看詳細信息以下,其中第二條用於過濾信息。
docker inspect my_container docker inspect --format='{{.State.Running}}' my_container
刪除容器使用rm命令
docker rm my_container
使用-f選項,能夠刪除正在運行中的容器。
刪除全部容器的方法是:
docker rm `docker ps -a -q`
其中的子句列出了全部容器的id。
以前經過run獲取的是自動獲取,這裏手動下載鏡像示例:
docker pull ubuntu:12.04
該命令會從Docker Hub上拉取鏡像
以後能夠經過docker images查看本地鏡像。在拉取過程當中,不指定則使用標籤爲latest,這裏指定了標籤爲12.04.
這種標籤機制能夠存活多個相同名字不一樣標籤的鏡像。
在run的過程當中,指定基礎鏡像時候,須要加上該標籤更合適(默認latest):
docker run --name my_container -i -t ubuntu:12.04 /bin/bash
從用戶那裏拉取鏡像時候,:須要包含:用戶名,倉庫名。
以前拉取只有倉庫名,是由於其爲頂級倉庫,由優質廠商提供的鏡像。
使用代碼示例:
docker search puppet
會提示一些信息,排名等
而後經過如下拉取鏡像便可
docker pull xxx/xxxx
前面是用戶名,後面是倉庫名。
這裏指代的是在原有鏡像的基礎上,進行修改,而後從新生成新的鏡像。
建立容器,進行修改後退出容器,提交便可:
docker run -i -t ubuntu /bin/bash apt update apt -y install apache2 docker commit $ID $用戶名/$倉庫名
其中,提交參數有 -a 後面添加做者,-m後面添加提交說明,倉庫名後添加 :$標籤 ,表示提交使用的標籤。
提交後成爲鏡像,又能夠拿來產生容器。
使用build和Dockerfile建立鏡像。其中Dockerfile中填寫了一些說明信息。下面構建了文件夾做爲環境上下文,而後在該環境中建立文件。
mkdir static_web cd static_web touch Dockerfile nano Dockerfile
文件中寫入的內容例如:
FROM ubuntu:14.04 MAINTAINER Bai "1872040489@qq.com" RUN apt-get update && apt-get install -y nginx RUN echo 'Hi I am in your container ' > /usr/share/nginx/html/index.html EXPOSE 80
這裏的每個做爲一個控制說明。分別說明了基礎鏡像,做者,郵箱,運行命令和向外公佈的端口。
固然其還有如CMD,ENTRYPOINT,WORKDIR等等的標記,用於構建Dockerfile。#表示註釋
其中run的命令在有時候須要寫成以下格式(exec格式的RUN指令):
RUN ["apt-get", "install","-y","nginx"]
進行保存後,在該路徑下執行命令:
docker build -t="jamtur01/static_web:v1" .
進行在該路徑下構建鏡像,每一步會造成一個新的鏡像,中途失敗,下次會衝上次失敗的地方開始(鏡像堆疊效果)。
使用docker history + 鏡像能夠查看堆疊過程。
以上構建代碼指明瞭用戶名,倉庫名,標籤。
另外,也能夠在git倉庫中構建鏡像。
在構建一個nginx鏡像成功之後,經過如下命令,進行端口映射,而後建立容器:如下代碼使用了地址加隨機端口的方式,進行了映射。固然還有其它各類映射方案。
sudo docker run -d -p 127.0.0.1::80 --name static jm/static_web_1 nginx -g "daemon off;"
經過如下查看端口映射狀況(均可):
docker ps -l docker port + ID + 被映射端口
使用:docker push username/image
可能須要登陸:
docker login命令便可
使用docker rmi +鏡像便可