docker編譯安裝
本文根據docker官方給出的docker代碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,了解了編譯步驟後,也可以結合自身遇到的網路問題進行「規避」。
docker的編譯環境實際上是創建一個docker容器,在容器中對代碼進行編譯。 如果想快速的查看編譯環境搭建指導,而不關注環境搭建的機制和細節,可以直接跳到最後一章「總結」。
前提
機器上已經安裝了docker,因為編譯環境是個docker容器,所以要事先有docker(daemon),後面會創建個編譯環境容器,在容器裡面編譯代碼。本文中使用物理機,物理機上運行著docker (daemon)。
機器(物理機)上安裝了git 。 後續使用git下載docker源碼
機器(物理機)上安裝了make。
下載ubuntu 14.04的docker鏡像
2. 如何編譯docker 1.2.0版本的源碼
經過研究docker的官方編譯腳步,發現本地編譯也很簡單,只需要在docker源碼的目錄下執行如下命令即可:
./hack/make.sh binary
上面這條命令就只會生成docker的二進制文件,不過肯定不會這么順利的,執行這個命令你就會發現錯誤。如果第一次執行報的錯誤應該是找不到相應的go依賴包。那麼現在就開始解決第一個問題,go依賴包。
解決go依賴包最直接的方法就一個一個去github或者其他地方去下載到本地,但是這樣做很麻煩,docker依賴的go語言包很多,然後依賴包可能又依賴其他包。這里有一個簡單實用的辦法,也是go語言管理項目的方便之處。通過go get命令來自動下載,例如發現報錯的是docker某一個目錄下的依賴包,那麼可以如下執行:
go get -v ./src/github.com/docker/docker/...
這條命令執行以後整個docker目錄下源文件依賴的包都會被自動下載。如果發現其他目錄下源文件也報同樣的錯誤,可以按照次方法解決。不過這里需要強調一點, 這些下載都是會下載最新的包,如果編譯老的docker肯定會出問題 ,如果編譯最新的docker代碼肯定不會有問題,因為官方的編譯是這種方式。
上面執行的命令都是建立在go語言環境建立成功的基礎上,我安裝的go遇到是1.3.3版本的,採用源碼方式安裝。安裝在/export/servers/go下面,然後所有的go語言工程源碼目錄放在 /export/servers/gopath。然後配置環境變數在用戶的根目錄下的.bashrc文件裡面如下:
export GOPATH=/export/servers/gopath
export GOROOT=/export/servers/go
export GOARCH=amd64
export GOOS=linux
然後docker的代碼目錄如下:/export/servers/gopath/src/github.com/docker/docker。這樣才能在gopath下面進行依賴包的下載。通過上面的方法把所有依賴包下載完以後就可以進行編譯了。
在繼續編譯的過程中還會遇到缺少c語言依賴包缺少的問題,主要有三個,(1)sqlite3;(2)device-mapper;(3)btrfs.
第一個sqlite3可以使用如下命令安裝依賴:yum install sqlite-devel.x86_64
3. docker 是做運行環境嗎
Docker的安裝和構成
Docker官方本身提供了非常具體的安裝教程,這里不說具體的安裝過程,請參考Docker安裝(Mac系統),重要的是描述下原理和安裝完成後的結構,好對Docker更好的了解。 由於LXC本身不支持Mac內核,因此需要跑一個VirtualBox虛擬機(TinyCoreLinux)來安裝,幸好Docker社區提供了一個非常方便的工具boot2docker(其實就是一個VBoxManage的包裝shell腳本),用於安裝Mac下的整個Docker環境。具體的結構如下:
如圖所示,安裝完成後,具體情況如下:
在Mac的home目錄~/.boot2docker下創建了虛擬機所需要的文件,其中boot2docker.iso是虛擬機映像,這是一個由CD-ROM引導的TinyCoreLinux系統;而boot2docker-vm.vmdk文件則是你的虛擬機磁碟,你所有的持久化數據都存放在這里,包括docker創建的lxc容器等文件。
在Mac下,docker被分為客戶端docker-client和服務端docker-daemon兩部分,如果是在linux(比如ubuntu),實際上則是同一個可執行文件同時充當客戶端和服務端。docker-daemon可以監聽unix scoket,也可以在tcp socket(默認埠為4234),docker-client會通過一個叫DOCKER_HOST的環境變數讀取服務地址和埠,因此你應該在你的bash_profile文件裡面添加這么一行:
1
2
export DOCKER_HOST=tcp://127.0.0.1:4243
docker-daemon跑在虛擬機上,這個程序實際上就是接收docker-client發送過來的消息命令,創建、啟動和銷毀lxc容器,以及docker本身的版本管理、映像存儲等等 運行你的第一個docker容器 安裝完成後,就差不多可以開始創建和運行docker容器了,在這之前,你首先得下載一個Image,什麼是Image?我們先來了解docker的2個基礎概念:Image和Container。
Container和Image 在Docker的世界裡,Image是指一個只讀的層(Layer),這里的層是AUFS里的概念,最直觀的方式就是看一下docker官方給出的圖:
Docker使用了一種叫AUFS的文件系統,這種文件系統可以讓你一層一層地疊加修改你的文件,最底下的文件系統是只讀的,如果需要修改文件,AUFS會增加一個可寫的層(Layer),這樣有很多好處,例如不同的Container可以共享底層的只讀文件系統(同一個Kernel),使得你可以跑N多個Container而不至於你的硬碟被擠爆了!這個只讀的層就是Image!而如你所看到的,一個可寫的層就是Container。
那Image和Container的區別是什麼?很簡單,他們的區別僅僅是一個是只讀的層,一個是可寫的層,你可以使用docker commit 命令,將你的Container變成一個Image,也就是提交你所運行的Container的修改內容,變成一個新的只讀的Image,這非常類似於git commit命令,感覺真棒!
實際上這就是Docker對Container映像的版本管理基石,AUFS文件系統實在是太美妙了,更多細節可以參考DotCloud的這篇文章。
運行和退出
在了解了Image和Container的概念後,我們可以開始下載一個Image,Docker的好處就是提供了一個類似github的Image倉庫管理,你可以非常方便pull別人的Image下來運行,例如,我們可以下載一個ubuntu Image:
1
2
docker pull ubuntu:13.10
這里的13.10是一個Tag,類似於git的tag,這里的tag可以為你制定一個ubuntu的版本。下載完成後,執行docker images命令可以列出你已經下載或者自己構建的image:(請允許我使用可愛的馬賽克 :) )
你可以看到ubuntu:13.10的大小為178MB,以及它的IMAGE ID。 現在我們開始運行一個Container,命令很簡單,例如我們想運行一個執行Shell終端的Container:
如你看到的,你已經進入到一個Shell裡面,可以執行你想執行的任何命令,就和在ubuntu裡面一樣,進去後默認是在根目錄/下,可以看到經典的unix/linux目錄結構,以及你所運行的bash版本等信息。你可以給你的Container定一個名字,通過–name選項,例如這里命名了shell,日後你就可以直接用這個名字引用Contanier。
退出一個Container也很簡單,你直接exit就好了。 其他更多的命令這里不做贅述,因為官方的文檔已經非常全面,這里只是給一個直觀的初步印象。下面進入主題。
利用Docker搭建開發環境
我們先看看程序員在搭建開發環境時遇到的一些問題:
軟體安裝麻煩,比如很多公司都使用redhat,一般開發人員又不給root,安裝一個nginx或者是mysql都得自己下載編譯安裝 許可權問題,沒有root,一些軟體無法運行,例如dnsmasq;
沒有root,無法修改hosts,無法netstat -nptl,無法tcpmp,無法iptable
隔離性差,例如不同的開發人員如果在同一台主機環境下共享開發,雖然是用戶隔離,但埠如果不規范可能會沖突;同一個Mysql如果許可權管理不好很有可能誤刪別人的數據
可移植性差,例如和生產環境不一致,開發人員之間也無法共享;更嚴重的情況是當有新人入職時,通常需要又折騰一遍開發環境,無法快速搭建
這些問題可以通過在本地搭建虛擬機來解決,但虛擬機是一個很笨重的解決方案,Docker是一個非常輕量級的方案,而且還擁有虛擬機沒有的一些功能,例如標准化Image,Image共享等,更重要的是,利用Docker,你可以運行非常多的容器,在你的Mac下搭建一個分布式的開發環境根本不是什麼大的問題,而且對內存、磁碟和cpu的消耗相比傳統的虛擬機要低許多,這些都要歸功於AUFS和LXC這兩大神奇的技術。
構建基礎Image
想要搭建一個節省磁碟空間和擴展性良好的開發環境,最重要的第一步就是構建一個基礎性的Image,比如你的主要開發語言是Ruby,那麼你肯定需要一個已經安裝好以下工具的基礎Image:
ruby
bundler
gem
然後在此基礎上,你可以擴展這個基礎的Image(下面叫base)為不同的開發環境,例如rails,或者是nats。當然,你的這個base也可以從別人的Image擴展而來,還記得我們剛剛pull下來的ubuntu:13.10這個Image嗎?你可以從這個Image擴展開始構建你的base,如何做呢?Docker提供了一種標准化的DSL方式,你只需要編寫一個Dockerfile,運行docker build指令,就可以構建你自己的Image,這有點像Makefile和make命令一樣,只是大家要構建的內容和構建語言不同。
Dockerfile的語法請參考Dockerfile Reference,這里給出上面提到的Ruby開發的base Dockerfile示例:
1
2
3
4
5
FROM ubuntu:13.10
RUN apt-get update
RUN apt-get install -y ruby ruby-dev gem
RUN gem install bundler
這里只用到了很簡單的2個指令:FROM和RUN,FROM指定了我們要擴展的Image,RUN指定我們要運行的命令,這里是安裝ruby,gem、bundler等軟體。寫好Dockerfile後,運行以下指令就可以創建你的base image了:
1
2
docker build --rm -t dev:base .
-t 選項是你要構建的base image的tag,就好比ubuntu:13.10一樣 –rm 選項是告訴Docker在構建完成後刪除臨時的Container,Dockerfile的每一行指令都會創建一個臨時的Container,一般你是不需要這些臨時生成的Container的 如你所想,我們可以像運行ubuntu:13.10那樣運行我們的base了:
1
2
docker run -i -t --name ruby dev:base irb
這里我們使用dev:base這個Image運行了一個irb解釋器(Ruby的互動式解釋器)。 在構建完base之後,你可以依樣畫葫蘆構建你的rails環境,很簡單,只需要FROM dev:base,然後RUN安裝你的rails組件就可以了,不再贅述。最終你可能構建的開發環境是這樣的:
如上圖所示,base和service都是從ubutnu:13.10繼承而來,他們作為不同的基礎開發環境,base是ruby開發環境(也許命名為dev:ruby更為合適?),而service是一些基礎數據服務,例如mysql,memcache,我建議將這些第三方組件集中在一個Container中,因為他們的環境不經常修改,可以作為一種底層服務Container運行,除非你需要構建分布式的服務,例如memcache集群,那可以繼續拆分。
指定Image入口
當你構建完你的base Image和其他應用的Image之後,你就可以啟動這些Image了,還記得前面我們給出的運行命令嗎?
1
2
docker run -i -t --name shell dev:base /bin/bash
這里我們運行了一個bash,這樣你就可以在shell裡面執行你所想要執行的任何命令了,但是我們有時候並不想每次都啟動一個shell,接著再在shell裡面啟動我們的程序,比如一個mysql,而是想一啟動一個容器,mysql服務就自動運行了,這很簡單,Dockerfile提供了CMD和ENTRYPOINT這2個指令,允許你指定一個Image啟動時的默認命令。CMD和ENTRYPOINT的區別是CMD的參數可以由docker run指令指定的參數覆蓋,而ENTRYPOINT則不可以。例如我們想運行一個memcached服務,可以這么寫Dockerfile:
1
2
3
FROM ubuntu:13.10
RUN apt-get install -y memcached CMD memcached -u root -p 40000
或者可以這么寫:
1
2
3
FROM ubuntu:13.10
RUN apt-get install -y memcached ENTRYPOINT ["memcached", "-u", "root", "-p", "40000"]
注意不要把memcached啟動為後台進程,即加上-d選項,否則docker啟動的container會馬上stop掉,這點我也覺得比較意外。 接著我們build這個Image:
1
2
docker build -t dev:memcache .
這樣,當你build完你的Image後,你可以直接將該Image運行為一個容器,它會自動啟動mysql服務:
1
2
docker run --name memcache_service -d dev:memcache
注意使用-d (detach) 選項,這樣這個container就會作為後台進程運行了,接著你可以使用docker ps命令查看是否有在運行。
磁碟映射
大部分時候你會需要把你host主機(宿主)上的目錄映射到Container裡面,這樣你就非常方便地在host主機上編輯代碼,然後直接就可以在Container裡面運行它們,而不用手動到Container裡面再重啟Container。按理將host的目錄映射到guest(指Container)上應該是一件很容易的事情,就好像VMWare那樣,但可惜的是,由於Mac上的Docker多了一層虛擬機,因此多了一層周折,你必須先VM上的目錄通過sshfs mount到host(指Mac)上,然後再將你的目錄或文件到這個mount的目錄,再將VM上的這個目錄映射到Container里,聽起來比較拗口,畫個圖會清晰很多。
如上圖所示,VM裡面的/mnt/sda1/dev/目錄(你需要自己創建)通過sshfs命令mount到了host主機(Mac)的~/workspace/dev/目錄 ,而VM里的/mnt/sda1/dev/目錄又被映射到了Container的/src/目錄下,這樣你就可以在Container裡面的/src/目錄下訪問你的host文件了。具體如何做呢?首先你需要安裝sshfs命令,然後將VM的password寫到一個文件中,例如~/.boot2docker/b2d-passwd,在用sshfs命令mount起VM的/mnt/sda1/dev目錄:
1
2
3
4
brew install sshfs
cat tcuser > ~/.boot2docker/b2d-passwd
sshfs docker@localhost:/mnt/sda1/dev ~/workspace/dev -p 2022 -o reconnect -o password_stdin < ~/.boot2docker/b2d-passwd
接著你在run一個Container的時候需要通過-v選項來將/mnt/sda1/dev/映射到/src目錄:
1
2
docker run -i -t dev:base -v /mnt/sda1/dev:/src /bin/bash
這樣你就可以在你的Container的/src目錄下看到你host里的文件了。 磁碟映射還有2個地方需要注意:
你的文件實際上是存儲在VM裡面的,也就是說你需要將你的目錄或者文件到VM裡面,你sshfs之後,就是到~/workspace/dev目錄下
千萬不要sshfs mount非/mnt/sda1下的目錄,因為VM裡面跑的是TinyCoreLinux,這個OS的rootfs是臨時性的(放在內存的,實際上就是boot2docker.iso文件裡面的一個rootfs),因此其根目錄/下的東西(包括/home)根本不會持久化,只有/mnt/sda1這個目錄下的才能持久化。如果你放在/home目錄下,只要VM一重啟,就會丟失的,/mnt/sda1則不會,實際上就是那個~/.boot2docker-vm.vmdk文件掛載到了/mnt/sda1目錄下
埠映射
和磁碟映射一樣,你有時候會需要將Container的埠映射到host主機上,同樣蛋疼的是,由於多了一層VM,埠映射也顯得比較麻煩。首先你需要設置VirtualBox的埠映射,然後再將Container的埠映射到你的VM裡面:
具體是這么做的,通過2條命令:
1
2
3
boot2docker ssh -L 8000:localhost:8000
docker run -i -t -p 8000:8000
也就是說在docker run的時候通過-p選項指定要映射的埠到VM,而boot2docker ssh命令則是將VM的8000埠映射到了host(Mac)的8000埠,這樣你就可以通過Mac的localhost:8000訪問Container的8000埠了。 其實,有另一種解決方案就是你不用映射到host(Mac),而是直接登錄到VM裡面進行訪問就好了,boot2docker ssh就可以登錄到VM,這樣就類似於你的host是ubuntu,但這種解決方案的問題是這個ubuntu太弱了(TinyCoreLinux),如果你在這個ubuntu裡面開發代碼,或者是運行瀏覽器,是非常蛋疼的事情,關鍵還是這個ubuntu是每次重啟都會復原的!所以我建議還是做多一層映射好了。 最後,實際上在VM裡面,你是可以直接訪問所有的Container的埠的,因為VM到Container的網路都是橋接的。
4. 想使用docker來進行Android源碼編譯,對電腦配置要求怎麼樣
這個配置足夠了,還需要配置好對應的環境和編譯工具。
5. 安裝docker-io之後怎麼啟動docker
對於Docker的安裝在官網上針對不同的操作系統分別進行了描述,Ubuntu上安裝Docker,對於ubuntu操作系統來說必須是64位的,因為Docker的官網上只是提供了64位的docker,如果需要32位的docker則需要下載源碼進行編譯,這里有篇文章介紹了Docker源碼如何進行編譯成32位,編譯32位的Docker。但是對於我使用的Ubuntu來說正好是32位的。通過下面的兩條命令可以看出操作系統的位數和Linux的內核版本。
root@ubuntu:/tmp#uname -a
Linux e529c1b7772a 3.13.0-12-generic #32-Ubuntu SMP Fri Feb 21 17:44:24 UTC 2014 i686 i686 i686 GNU/Linux
root@ubuntu:/tmp#file /sbin/init
/sbin/init: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=, stripped
如果想在32為的Ubuntu操作系統上運行Docker的話,就必須安裝32位的Docker。在Ubuntu中提供docker1.01-32位的deb包,可以直接點擊「docer1.01-32位deb包」跳轉到下載頁面。下載完成後,直接使用dpkg –i進行安裝。
dpkg -i docker.io_1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1_i386.deb
Selecting previously unselected package docker.io.
(Reading database ... 150021 files and directories currently installed.)
Preparing to unpack docker.io_1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1_i386.deb ...
Unpacking docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ...
Setting up docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ...
docker.io start/running, process 10456
Processing triggers for ureadahead (0.100.0-16) ...
Processing triggers for man-db (2.6.6-1) ...
也可以參考下面的這篇文章《Docker 1.0.1 已經可以在 Ubuntu 14.04 LTS 上測試了!》進行安裝。安裝完成後,可以使用下面的命令確定安裝的版本和基本的信息。由於docker使用go語言進行編寫的,所以要依賴於GO的編譯工具和庫文件。
oot@ubuntu:/tmp# docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a
root@ubuntu:/tmp# docker info
Containers: 1
Images: 7
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 10
Execution Driver: native-0.2
Kernel Version: 3.13.0-12-generic
WARNING: No swap limit support
官方安裝方式docker pull imagename從docker的索引中心下載,imagename是鏡像名稱,例如docker pull ubuntu就是下載base ubuntu並且tag是latest。
root@ubuntu:/# docker pull ubuntu:14.04
Pulling repository ubuntu
c4ff7513909d: Download complete
511136ea3c5a: Download complete
1c9383292a8f: Download complete
9942dd43ff21: Download complete
d92c3c92fa73: Download complete
0ea0d582fd90: Download complete
cc58e55aa5a5: Download complete
root@ubuntu:~/Downloads# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c1b5399bd2ee 8 minutes ago 205.3 MB
learn/tutorial latest 8dbd9e392a96 17 months ago 128 MB
root@ubuntu:/# docker run -i -t ubuntu /bin/bash
2014/09/04 13:04:28 exec format error
docker run -i -t learn/tutorial /bin/bash
2014/09/04 14:45:13 exec format error
PS:在安裝完成Dokcer後,使用Pull命令sudo docker pull ubuntu:14.04從鏡像倉庫獲取ubuntu的鏡像後,然後使用run命令docker run -i -t ubuntu /bin/bash直接運行該鏡像時,會出現下面的錯誤信息,後來我又嘗試著使用官方演示使用的learn/tutorial鏡像,還是出現同樣的問題,現在懷疑可能是由於我安裝的DOcker是32位的,而Image是64位的不匹配造成的。前面說過Docker默認提供的都是64位,其中提供的Image自然也都是64位,所以會出現下面的錯誤信息。在Docker Hub Registry里的大多數鏡像都是64位。這里有一個關於該錯誤的討論帖「Ddocker.io: Docker should recommend
linux-image-amd64 」。所以,如果想在32位的Docker基礎上運行Ubuntu的Image那要求Ubuntu的image也必須是32位。這就需要製作32位Ubuntu的Image。這里有一個官方提供的可用的Ubuntu image的列表,Ubuntu Image tag。
6. linux怎麼安裝docker
1 在 CentOS 6.4 上安裝 docker
docker當前官方只支持Ubuntu,所以在 CentOS 安裝Docker比較麻煩(Issue #172)。
docker官方文檔說要求Linux kernel至少3.8以上,CentOS 6.4是2.6的內核,於是我哼哧哼哧的編譯安裝了最新的kernel 3.11.6,重啟後運行docker還是失敗,最後找到原因,是因為編譯時忘記集成aufs模塊了。aufs 需要和 kernel 一起編譯,很麻煩。
不過不需要這么麻煩,有強人已經編譯好了帶aufs模塊的內核,見這里Installing docker.io on centos 6.4 (64-bit)
1.1 取消selinux,因為它會干擾lxc的正常功能
sudo vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
1.2 安裝 Fedora EPEL
sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
1.3 添加 hop5 repo地址
cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo
1.4 安裝 docker-io
sudo yum install docker-io
會自動安裝帶aufs模塊的3.10內核,以及docker-io包。
1.5 將 cgroup 文件系統添加到 /etc/fstab , 只有這樣docker才能正常工作
sudo echo "none /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
1.6 修改grub引導順序
sudo vim /etc/grub.conf
default=0
設置default為新安裝的內核的位置,一般是0
1.7 重啟
sudo reboot
1.8 檢查新內核是否引導成功
重啟後,檢查一下新內核是否引導起來了
uname -r
3.10.5-3.el6.x86_64
說明成功了
看一下 aufs是否存在
grep aufs /proc/filesystems
nodev aufs
說明存在
1.9 啟動 docker daemon 進程
sudo docker -d &
如果你在公司,且公司內部都是通過代理上網,則可以把代理伺服器告訴docker,用如下命令(參考這里):
sudo HTTP_PROXY=http://xxx:port docker -d &
1.10 下載 ubuntu 鏡像
sudo docker pull ubuntu
1.11 運行 hello world
sudo docker run ubuntu /bin/echo hello world
hello world
安裝成功了!!
7. dockerfile 編譯好 還是 yum好
1.安裝Docker在開始前,我們首先得確保在Linux主機中已經安裝了Docker。這里,我運行的是CentOS7主機,我們將運行yum管理器和下面的命令來安裝Docker。#yuminstalldocker#systemctlrestartdocker.service2.創建Dockerfile現在
8. 安裝Docker為什麼不需要先安裝GO
部署簡單。Go 編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關系,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於歷史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題】。官方 PyPI 源又經常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。
9. 請教,如何在ubuntu環境下編譯Docker的安裝文件
Docker 的基本用法
在本節中,我將向您介紹 Docker 命令的常用選項。例如如何下載一個 docker image,打造一個容器,以及如何訪問容器。
要創建一個新的容器,你應該選擇一個基本 image 的操作系統,例如啟動 Ubuntu 或者 CentOS 或其他系統。您可以搜索一個基本 image 使用 Docker 搜索命令:
docker search ubuntu
該命令將顯示所有 ubuntu images,你可以自己嘗試一下搜索 centos Images。
現在我們現在 base image到我們的服務中,使用命令:
docker pull ubuntu
現在,您可以通過使用命令來查看所有已下載的images:
docker images
Ubuntu 鏡像從DockerHub/Docker Registry下載。下一步驟是創建從該鏡像的容器。
要創建容器,可以使用docker create 或 docker run
docker create ubuntu:14.04
docker create 命令會創建一個新的容器,但不會啟動它。所以現在你需要使用運行命令:
docker run -i -t ubuntu:14.04 /bin/bash
此命令將創建並運行一個基於 Ubuntu14.04 鏡像的容器,容器內並運行一個命令/bin/bash,您將在容器內自動運行命令。
當你輸入 Exit 命令退出容器時,容器也是停止運行,如果你想容器在後台運行需要在命令後面添加 -d 參數。
docker run -i -t -d ubuntu:14.04 /bin/sh -c 「while true; do echo hello world; sleep 1; done」
/bin/sh -c 「while true; do echo hello world; sleep 1; done」 this is bash script to echo 「hello word」 forever.
現在你可以看到容器在後台運行通過命令:
docker ps
如果你想從 bash 命令看日誌結果,使用命令:
docker logs NAMES/ContainerID
怎樣在後台訪問容器 shell?這個命令將會連接你的容器 shell:
docker exec -i -t NAMES/ContainerID
你可以看到主機名和容器ID是相等的,這意味著你在容器shell內。當你在shell 上鍵入』exit`,會離開的shell,但容器仍在運行。
你會經常使用的另一個命令是:
docker stop NAME/ContainerID
這將停止容器而不將其刪除,這樣你就可以用命令重新啟動它:
docker start NAME/ContainerID
如果你想刪除的容器,先停止它,然後用命令將其刪除:
docker rm NAME/ContainerID
10. 跪求一個編譯好的dockerui,環境如圖linux。(實在不會編譯github上的dockerui項目)
https://github.com/kevana/ui-for-docker
這個往下看有如何使用說明哦哈哈