Docker基礎之三: 安裝docker+HelloWorld
安裝Docker
(提示:對Docker感興趣的朋友可以加我的微信ghostcloud2016,然後我把你加到我們的一個Docker愛好者社群裏麵。)
Docker最核心的程序是Docker Engine,根據參數,它既可以作為後台daemon運行,也可以作為命令行工具使用。
1 Linux上安裝
Docker本身是基於linux內核的,因此隻要內核版本足夠新,一般大於3.10左右,就可以運行。各種係統的安裝方式基本相同,隻是針對各係統的進程管理或者目錄結構略有不同。下麵是docker在linux係統下的物理邏輯結構:
2 Ubuntu上安裝Docker
在所有係統中,Docker對ubuntu的支持是最好的,因此如果使用docker,我推薦都適用ubuntu係統。Ubuntu係統的可視化、安裝以及內核的更新,我認為都是最好的。Docker支持的Ubuntu係統:
- Ubuntu Wily 15.10
- Ubuntu Vivid 15.04
- Ubuntu Trusty 14.04 (LTS)
- Ubuntu Precise 12.04 (LTS) 環境要求:
- 64位係統
- 3.10以上linux內核,具體可以根據uname –r進行查看
具體安裝步驟:
- 更新apt源
#添加gpg key sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
#增加/etc/apt/sources.list.d/docker.list
#增加下麵一行(選擇你的具體版本) Ubuntu precise 12.04: deb https://apt.dockerproject.org/repo ubuntu-precise main Ubuntu trustry 14.04: deb https://apt.dockerproject.org/repo ubuntu-trusty main Ubuntu trustry 15.04: deb https://apt.dockerproject.org/repo ubuntu-vivid main Ubuntu trustry 15.10: deb https://apt.dockerproject.org/repo ubuntu-wily main
#執行apt-get update,更新源
- 刪除舊版本Docker
apt-get purge lxc-docker
- 檢查Docker的apt源是否正常
apt-cache policy docker-engine
- 不同版本的處理
#Ubuntu Wily 15.10, Ubuntu Vivid 15.04, Ubuntu Trusty 14.04 (LTS) $ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra內核包安裝後,可以使用aufs
#Ubuntu Precise 12.04(LTS) 對於這個版本的ubuntu,需要3.13內核及一些相關的包,執行下麵的命令進行安裝: $ sudo apt-get install linux-image-generic-lts-trusty
- 重啟係統(如果沒有安裝內核包,忽略本條)
reboot -nf
- 安裝docker-engine
$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start $ sudo docker run hello-world #驗證是否安裝成功
-
其他配置
-
創建docker用戶
docker daemon默認綁定在unix socket上,而不是tcp的端口。而unix socket默認是屬於root用戶,所以其他用戶要訪問該 socket需要通過sudo命令。如果想避免使用sudo,你需要將當前用戶添加到docker 用戶組。具體步驟:
$ sudo usermod -aG docker ubuntu #退出當前用戶,並登入當前用戶 $ docker run hello-world#驗證是否成功 #如果失敗會報錯: Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
-
調整Memory和Swap的配額
有時候你在啟動時會出現:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
這個提示說明,你當前的內核不支持cgroup對swap的控製。如果需要支持,會使用大約1%的係統總內存,同時會有10%左右的性能損失。具體步驟如下:
#以root用戶編輯/etc/default/grub #添加GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" #保存文件,並執行sudo update-grub #sync #reboot係統
-
同UFW一起使用
如果你使用了UFW(Uncomplicated Firewall),你需要做額外的配置,因為UFW默認會屏蔽所有的Forwarding流量,所以你需要zuo如下配置:
$ sudo ufw status $ sudo vi /etc/default/ufw DEFAULT_FORWARD_POLICY="ACCEPT" $ sudo ufw reload $ sudo ufw allow 2375/tcp
-
配置docker的DNS
Ubuntu係統默認使用127.0.0.1作為DNS服務器,具體配置文件為/etc/resolv.conf。同時,還使用dnsmasq作為DNS的緩存。當你啟動容器的時候,可能會遇到下麵的警告:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
這個警告說明Docker容器不能使用主機的本地DNS,因此使用外部的默認DNS(8.8.8.8,8.8.4.4)這兩個地址都是google的免費DNS地址。如果想自己指定 DNS,具體步驟如下:
$ sudo vi /etc/default/docker DOCKER_OPTS="--dns 8.8.8.8 192.168.1.1" $ sudo restart docker #或者修改dnsmasq sudo vi /etc/NetworkManager/NetworkManager.conf #注釋掉這一行 dns=dnsmasq # 重啟網絡 $ sudo restart network-manager # 重啟docker $ sudo restart docker
-
讓Docker隨係統啟動
首先需要了解你所使用的係統用的什麼啟動管理工具,在ubuntu 15.04及其以上版本使用的是systemd,在14.10及其以下使用的是upstart。在15.04及以上版本需要執行:
$ sudo systemctl enable docker
在14.10以下,安裝程序會自動將docker加入到upstart中。
- 升級docker
$ apt-get upgrade docker-engine
-
卸載docker
$ sudo apt-get purge docker-engine $ sudo apt-get autoremove --purge docker-engine #刪除 docker的鏡像及工作目錄 $ rm -rf /var/lib/docker
-
3 CentOS上安裝 docker
3.1 環境要求
- CentOS 7.X及其以後版本
- 3.10以後版本
3.2 通過腳本安裝
更新yum源:
$ sudo yum update
下載腳本並安裝:
$ curl -sSL https://get.docker.com/ | sh
啟動服務:
$ sudo service docker start
驗證docker:
$ sudo docker run hello-world
3.3 通過yum安裝
更新源:
$ sudo yum update
添加源及gpg key:
$ sudo tee /etc/yum.repos.d/docker.repo
<<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
安裝docker-engine:
$ sudo yum install docker-engine
啟動docker daemon:
$ sudo service docker start
驗證docker:
$ sudo docker run hello-world
3.4 添加docker用戶組(同ubuntu)
$ sudo usermod -aG docker your_username
3.5 隨係統啟動
$ sudo chkconfig docker on`
3.6 卸載
#檢查是否安裝
$ yum list installed | grep docker
yum list installed | grep docker
docker-engine.x86_64 1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm
#刪除包
$ sudo yum -y remove docker-engine.x86_64
#刪除docker鏡像及中間文件
$ rm -rf /var/lib/docker
4 Mac上安裝
-
背景
Mac OSX下Docker通過Docker Toolbox來進行安裝,Docker Toolbox是Docker公司的一個工具包,裏麵包括:
- Docker Machine: 運行docker-machine程序
- Docker Engine: Docker可執行程序
- Docker Compose: docker-compose程序
- Kitematic: Docker GUI
- 包含預定義的shell腳本,用於命令行運行環境
- Oracle VM VirtualBox
由於Docker Daemon 使用了linux kernel的眾多特性,我們不能在OS X本地運行Docker,所以我們必須使用docker-machine來創建並關聯到一個虛擬機。這個虛擬機就是Docker的實際運行環境。下麵是docker在mac或windows下的物理邏輯結構
-
環境要求: OS X 10.8及其以上版本
-
安裝Toolbox
地址是https://www.docker.com/toolbox, 下載完成後根據提示進行安裝。默認情況,Docker Toolbox安裝在/usr/local/bin,每個用戶都可以使用這些可執行程序,同時會安裝帶有Docker運行環境的Virtual Box。
-
啟動Docker Machine 通過Launchpad啟動程序:
執行程序後,會自動執行一段shell腳本啟動虛擬機並進入一個shell終端。 -
Hello World, Docker
我們先來執行一個最簡單的docker容器:
docker run hello-world
這個命令包含三部分:
- docker - 所有docker命令的可執行程序,默認在/usr/local/bin/docker
- run - docker 的子命令,該命令首先查看本地是否有相應的鏡像,如果沒有將默認從Docker Hub進行拉取,之後再運行該鏡像
- hello-world - 鏡像名稱,這個鏡像就是echo一句hello world
容器本身是一個簡化的經過裁減的linux係統,容器可以運行一個簡單命令,就像上例一樣;也可以運行比較複雜的應用程序,比如:數據庫,web後台等。那hello-world鏡像是由誰生成的呢?是Docker官方生成的,通過docker容器,你可以在任何係統容器中運行鏡像。
-
查找Image
你可以在docker hub主頁,或者本機通過命令行進行搜索,一般我喜歡通過命令行進行搜索。例如,搜索ubuntu:
root@gctest:~# docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating s... 2761 [OK] ubuntu-upstart Upstart is an event-based replacement for ... 48 [OK] dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC on po... 28 [OK] torusware/speedus-ubuntu Always updated official Ubuntu docker imag... 25 [OK] sequenceiq/hadoop-ubuntu An easy way to try Hadoop on Ubuntu 24 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components... 20 [OK] tleyden5iwx/ubuntu-cuda Ubuntu 14.04 with CUDA drivers pre-installed 18 [OK] neurodebian NeuroDebian provides neuroscience research... 15 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 15 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC sessi... 7 [OK] n3ziniuka5/ubuntu-oracle-jdk Ubuntu with Oracle JDK. Check tags for ver... 5 [OK] nuagebec/ubuntu Simple always updated Ubuntu docker images... 4 [OK] ioft/armhf-ubuntu [ABR] Ubuntu Docker images for the ARMv7(a... 4 [OK] nimmis/ubuntu This is a docker images different LTS vers... 3 [OK] maxexcloo/ubuntu Docker base image built on Ubuntu with Sup... 2 [OK] sylvainlasnier/ubuntu Ubuntu 15.04 root docker images with commo... 1 [OK] densuke/ubuntu-jp-remix Ubuntu Linuxの日本語remix風味です 1 [OK] seetheprogress/ubuntu Ubuntu image provided by seetheprogress us... 1 [OK] rallias/ubuntu Ubuntu with the needful 0 [OK] tvaughan/ubuntu https://github.com/tvaughan/docker-ubuntu 0 [OK] zoni/ubuntu 0 [OK] partlab/ubuntu Simple Ubuntu docker images. 0 [OK] teamrock/ubuntu TeamRock's Ubuntu image configured with AW... 0 [OK] konstruktoid/ubuntu Ubuntu base image 0 [OK] esycat/ubuntu Ubuntu LTS 0 [OK]
在搜索結果中,你可以看到有的是通過"/"劃分的,有的沒有。凡是沒有"/"分級的就是Docker Hub自帶的鏡像;否則該鏡像就出自於某個Docker Hub用戶,從這裏你也可以看到,Docker Hub是一個Public倉庫,你的任何鏡像,別人都可以搜索到。因此,一定要注意安全,不要把敏感信息放上去了。
-
拉取鏡像
我們嚐試拉取一個centos鏡像:
root@gctest:~# docker pull centos
Using default tag: latest Pulling repository docker.io/library/centos ce20c473cd8a: Pulling dependent layers 47d44cb6f252: Pulling metadata ce20c473cd8a: Download complete 168a69b62202: Download complete 812e9d9d677f: Download complete 4234bfdd88f8: Pulling fs layer 4234bfdd88f8: Download complete Status: Downloaded newer image for centos:latest root@gctest:~# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ghostcloud.cn:5000/gcali 1.5 6ff13e5ab907 29 hours ago 213.9 MB centos latest ce20c473cd8a 7 weeks ago 172.3 MB
- 編譯Image 除了拉取官方的Image,也可以自己編譯Image,編譯的方法和Makefile類似。
- 創建Dockerfile
root@gctest:~# mkdir myimage root@gctest:~# cd myimage/ root@gctest:~/myimage# vi Dockerfile root@gctest:~/myimage# cat Dockerfile FROM centos:latest CMD echo "Hello myimage"
- 編譯Image
root@gctest:~/myimage# docker build -t myimage .
Sending build context to Docker daemon 2.048 kB Step 1 : FROM centos:latest ---> ce20c473cd8a Step 2 : CMD echo "Hello myimage" ---> Running in 1421c66fa1a6 ---> 2408b71c40c0 Removing intermediate container 1421c66fa1a6 Successfully built 2408b71c40c0
root@gctest:~/myimage# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE myimage latest 2408b71c40c0 6 seconds ago 172.3 MB ghostcloud.cn:5000/gcali 1.5 6ff13e5ab907 30 hours ago 213.9 MB centos latest ce20c473cd8a 7 weeks ago 172.3 MB
- 運行自己的Image
root@gctest:~/myimage# docker run myimage Hello myimage
- 創建Dockerfile
最後更新:2017-04-01 13:37:06