Centos 6.5 安裝和使用docker
基于本人一貫的習(xí)慣米死,關(guān)于“某某某是什么”這樣的問題锌历,請(qǐng)百度吧,會(huì)有更專業(yè)的人士哲身,會(huì)比我說的更詳細(xì)更深辩涝,這里我只給出本人親歷的安裝和使用過程贸伐。
1.安裝
先檢查服務(wù)器環(huán)境勘天,docker要求操作系統(tǒng)CentOS6以上,kernel 版本必須2.6.32-431或更高捉邢,即>=CentOS 6.5脯丝,運(yùn)行docker時(shí)實(shí)際提示3.8.0及以上,必須64bit伏伐,32bit不支持docker宠进。
[root@201 ~]# uname -r
2.6.32-642.1.1.el6.x86_64
docker的存儲(chǔ)驅(qū)動(dòng)是Device Mapper,看下你的驅(qū)動(dòng)是否符合
[root@201 ~]# grep device-mapper /proc/devices
253 device-mapper
看來我們符合以上要求藐翎,然后開始安裝材蹬。
對(duì)于centos 6.5 需要先安裝源
[root@201 ~]# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
注意centos 6要安裝的是docker-io來源于Fedora epel庫实幕,是第三方庫,所以先要確保安裝了epel
[root@201 ~]# rpm -q epel-release
epel-release-6-8.noarch
ok堤器,我們已經(jīng)安裝過epel昆庇,然后yum一下,稍等片刻就安裝成功
[root@201 ~]# yum install docker-io -y
如果系統(tǒng)是centos 7則不用以上步驟闸溃,并且安裝包是docker而不是docker-io
[root@201 ~]# yum install docker -y
2.啟動(dòng)
啟動(dòng)守護(hù)進(jìn)程
[root@201 ~]# service docker start
查看啟動(dòng)信息
[root@201 data]# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:0-286421-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: extfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 305.7 MB
Data Space Total: 107.4 GB
Data Space Available: 3.536 GB
Metadata Space Used: 729.1 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.117-RHEL6 (2016-04-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-642.1.1.el6.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 996.2 MiB
Name: 201.liberalman.cn
ID: BHFO:EYCF:XVAZ:J637:2LUV:RR6Y:UR7Z:MZ43:PR4N:CGUD:7EAJ:5SBI
設(shè)置開機(jī)啟動(dòng)
[root@201 ~]# chkconfig docker on
docker日志路徑
/var/log/docker
3.實(shí)例測(cè)試
測(cè)試1
我們下載一個(gè)centos image
[root@201 data]# docker pull centos
latest: Pulling from centos
3690474eb5b4: Pull complete
342c399b9d0e: Pull complete
915b9d3c92fc: Downloading 23.78 MB/70.58 MB
915b9d3c92fc: Downloading 70.58 MB/70.58 MB
d5c89a2047c8: Download complete
Digest: sha256:14bc8ca808518a2703b6eff1a5f3b7065d4b5d4b388b575ae6a27db8791ab19b
Status: Downloaded newer image for centos:latest
列出鏡像整吆,指定centos關(guān)鍵詞看看我們下載的鏡像
[root@201 data]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest d5c89a2047c8 33 hours ago 196.7 MB
我們下載了一個(gè)近200M的鏡像,好辉川,運(yùn)行container
[root@201 data]# docker run -i -t centos /bin/bash
[root@f41d95a52943 /]#
-t表示傳遞給容器tty終端表蝙,-i是interactive,表示可以交互。可以看到我的終端也由root@201 data變成了root@f41d95a52943幅恋,說明進(jìn)入了容器的終端坎穿,要退出輸入exit就可以。如果要新開一個(gè)終端進(jìn)入我們之前啟動(dòng)的容器脊另,先查詢container id
[root@201 data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f41d95a52943 centos "/bin/bash" 12 minutes ago Up 12 minutes backstabbing_poincare
id是f41d95a52943然后在新終端中登錄
docker exec -it f41d95a52943 /bin/bash
這樣就可以登錄了。
我們?cè)赿ocker中起了一個(gè)centos的最小系統(tǒng),登錄到此系統(tǒng)[root@f41d95a52943 /]后扰法,查看下其ip地址,發(fā)現(xiàn)沒有ifconfig命令毅厚,使用 yum install net-tools 安裝后
[root@f41d95a52943 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:1 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:01 txqueuelen 0 (Ethernet)
RX packets 10375 bytes 12736213 (12.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5643 bytes 309098 (301.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到我們docker中的centos系統(tǒng)塞颁,分配了一個(gè)ip 172.17.0.1,對(duì)外ping百度等網(wǎng)站可以ping通吸耿!是不是到此就結(jié)束了呢祠锣,當(dāng)重啟container的時(shí)候,你就會(huì)發(fā)現(xiàn)咽安,ifconfig命令又沒有了伴网,默認(rèn)是不會(huì)為我們保存修改的,所以需要我們提交對(duì)image的修改妆棒。在宿主機(jī)中查詢?nèi)萜鱥d澡腾,然后提交修改
查看剛運(yùn)行過的容器
[root@201 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e108c90fa11 centos "/bin/bash" 2 minutes ago Up 2 minutes ecstatic_franklin
[root@201 ~]# docker start 4e108c90fa11
4e108c90fa11
然后連上去
[root@201 ~]# docker exec -it 4e108c90fa11 /bin/bash
安裝net-tools包
[root@4e108c90fa11 /]# yum install net-tools -y
退出,在宿主機(jī)上提交評(píng)論
[root@201 ~]# docker commit -m="add net-tools packages,nclude ifconfig command" 4e108c90fa11
129d59168480299c786d0585e9eb74fdbde3dcd00ee2cd2815d11b7749e53ac7
好糕珊,現(xiàn)在重新啟動(dòng)剛才的container动分,連上去試試ifconfig,就會(huì)發(fā)現(xiàn)ifconfig已經(jīng)保存在image中了红选。
測(cè)試2
宿主機(jī)上澜公,我們?cè)赾ontainer上運(yùn)行一個(gè)web服務(wù)器
[root@201 data]# docker run -d -P training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e9e06b06e14c: Pull complete
02a8815912ca: Download complete
Status: Downloaded newer image for training/webapp:latest
f0b7172ab3a14e6f078e7b01310a3b027e28234baf44f4f6f1aa68465e854f60
這個(gè)web應(yīng)用為docker官方提供,本地沒有喇肋,所以自動(dòng)去倉庫下載坟乾,很方便的實(shí)現(xiàn)image迹辐,code 共享,并且到處運(yùn)行甚侣。
image都是分層的右核,所以更改后構(gòu)建比較快速。
[root@201 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
272a09b3f713 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32768->5000/tcp serene_jang
看到web服務(wù)器將docker內(nèi)部的5000端口映射到我們宿主機(jī)的的32768端口渺绒,同時(shí)我們?cè)谒拗鳈C(jī)上查看ip信息
[root@201 ~]# ps -ef|grep docker-proxy|grep -v "grep"
root 3163 3041 0 10:56 pts/0 00:00:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.1 -container-port 5000
[root@201 ~]# netstat -npl|grep 32768
tcp 0 0 :::32768 :::* LISTEN 3163/docker-proxy
[root@201 ~]# ifconfig
docker0 Link encap:Ethernet HWaddr 82:EA:95:80:A9:F3
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::c057:bbff:fe36:55cf/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:612 (612.0 b) TX bytes:468 (468.0 b)
eth0 Link encap:Ethernet HWaddr 08:00:27:DD:0D:82
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fedd:d82/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:469 errors:0 dropped:0 overruns:0 frame:0
TX packets:304 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:46223 (45.1 KiB) TX bytes:67929 (66.3 KiB)
宿主機(jī)的ip是192.168.1.201贺喝,我們?cè)L問這個(gè)web服務(wù)器,通過宿主機(jī)上的瀏覽器訪問http://192.168.1.201:32768/宗兼,看到輸出
Hello world!
4.制作屬于自己的鏡像
突發(fā)奇想躏鱼,制作一個(gè)mysql鏡像,然后在自己服務(wù)器上開一堆mysql的服務(wù)殷绍,提供不同端口來訪問染苛,搞個(gè)集群什么的,呵呵
首先創(chuàng)建一個(gè)目錄/data/mysql主到,并創(chuàng)建一個(gè)Dockerfile文件茶行,文件內(nèi)容如下
vim Dockerfile
FROM centos6:centos6
MAINTAINER liberalman "361509573@qq.com"
RUN yum install -y mysql-server
RUN service mysqld start &&\
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'testpass';"&&\
mysql -u root -e "show databases;"
VOLUME ["/data/volume1"]
EXPOSE 3306
在Dockerfile所在目錄下運(yùn)行build命令來生成image文件,指定文件名mysql_test
[root@201 mysql]# docker build -t mysql_test ./
...
Starting mysqld: [ OK ]
Database
information_schema
mysql
test
...
Successfully built ac45bc85be5e
創(chuàng)建成功登钥,查看鏡像
[root@201 ~]# docker images mysql_test
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mysql_test latest ac45bc85be5e About a minute ago 374.3 MB
這會(huì)創(chuàng)建一個(gè)在centos6系統(tǒng)上安裝的mysql服務(wù)器畔师,鏡像名稱是mysql_test,同時(shí)也會(huì)將centos6系統(tǒng)下載到本地來牧牢。好嘞看锉,啟動(dòng)下
[root@201 ~]# docker run --name=mysqlserver -d -P mysql_test
a903be8b69fe540395e61a6cff3db16cf944ca1177cb581f7e591247a12b0737
[root@201 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a903be8b69fe mysql_test "/usr/bin/mysqld_saf About a minute ago Up About a minute 0.0.0.0:32769->3306/tcp mysqlserver
容器內(nèi)的數(shù)據(jù)庫已經(jīng)啟動(dòng)了,而且映射到宿主機(jī)32769端口塔鳍,連接下
[root@201 mysql]# mysql -hlocalhost -uroot -P 32769
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
連接正常伯铣,mysql可以用了。既然是用docker轮纫,我們就要體現(xiàn)它的牛逼之處腔寡,所以我要啟動(dòng)2個(gè)以上的mysql容器,以后用來做數(shù)據(jù)庫集群也可以啊掌唾,哈哈
[root@201 ~]# docker run -p 3307:3306 --name=mysqlserver1 -d -P mysql_test1
8126d375d2f832a0381704424b45669178bc718598c1c8fa8868587455df6fed
[root@201 ~]# docker run -p 3308:3306 --name=mysqlserver2 -d -P mysql_test
ad920abde38b249e35600bf75f64bc44e7a007b399995e4e0fa17e7c9e5ed1a2
[root@201 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad920abde38b mysql_test "/usr/bin/mysqld_saf 21 seconds ago Up 20 seconds 0.0.0.0:3308->3306/tcp mysqlserver2
8126d375d2f8 mysql_test "/usr/bin/mysqld_saf About a minute ago Up About a minute 0.0.0.0:3307->3306/tcp mysqlserver1
a903be8b69fe mysql_test "/usr/bin/mysqld_saf 34 minutes ago Up 34 minutes 0.0.0.0:32769->3306/tcp mysqlserver
看吧放前,啟動(dòng)三個(gè)容器,分別按32769郑兴、3307犀斋、3308三個(gè)不同的端口連接都OK,數(shù)據(jù)庫相互獨(dú)立不影響情连。
做了以上的活還不夠,如果真的要在生產(chǎn)環(huán)境中使用多個(gè)mysql览效,最好在Dockerfile文件中設(shè)置容器中mysql的datadir目錄掛載宿主機(jī)目錄下却舀,以便將真實(shí)產(chǎn)生的數(shù)據(jù)寫入到宿主機(jī)中虫几,否則容器一關(guān)閉所有的數(shù)據(jù)就丟失了,當(dāng)然不同容器掛載到宿主機(jī)中的目錄一定要不同挽拔,千萬不要數(shù)據(jù)混淆了
VOLUME ["/var/lib/mysql"]
好了辆脸,到此寫了很多,先寫到這里螃诅,接下來研究怎么做彈性伸縮和擴(kuò)容啡氢!
5.docker命令
關(guān)閉容器
- docker stop 容器名
- docker kill 容器名
殺死所有正在運(yùn)行的容器
- docker kill $(docker ps -a -q)
刪除所有已經(jīng)停止的容器
- docker rm $(docker ps -a
刪除所有未打 dangling 標(biāo)簽的鏡像
- docker rmi $(docker images -q -f dangling=true)
通過image id刪除鏡像
- docker rmi -f <image id>
刪除所有鏡像
- docker rmi $(docker images -q)
搜索和centos相關(guān)的鏡像
[root@201 data]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 2453 [OK]
jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 26 [OK]
nimmis/java-centos This is docker images of CentOS 7 with dif... 13 [OK]
million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 10 [OK]
torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK]
nickistre/centos-lamp LAMP on centos setup 4 [OK]
...
查看運(yùn)行中某個(gè)容器的進(jìn)程,容器id是f41d95a52943
[root@201 data]# docker top f41d95a52943
UID PID PPID C STIME TTY TIME CMD
root 5845 5388 0 14:23 pts/2 00:00:00 /bin/bash
查詢?nèi)罩?/p>
- docker logs <容器id>
6.遇到問題
1.啟動(dòng)失敗术裸,查看日志文件后倘是,發(fā)現(xiàn)
symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
解決辦法:執(zhí)行:yum upgrade device-mapper-libs
2.Error response from daemon: Cannot start container d9bf569e3f0db33bc3d800cca4e6be1ccf7ac89e91951ba6486e3239f92516a5: [8] System error: mountpoint for cgroup not found
解決辦法:因?yàn)閏group在宿主機(jī)上沒有掛載。
vim /etc/fstab
none /sys/fs/cgroup cgroup defaults 0 0
重啟機(jī)器袭艺,docker也重啟下即可
3.Conflict. The name "mysqlserver" is already in use by container 19a5ab1401f6
命名沖突問題搀崭,刪掉
docker rm mysqlserver
創(chuàng)建于 2016-07-21 杭州,更新于 2016-07-22 杭州猾编。