1,安裝node
CentOS6python
# rpm -ivh http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpmmysql
#rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmlinux
#yum install docker-ionginx
源碼安裝c++
http://blog.rage.net/2013/08/04/installing-docker-on-centos-6/git
CentOS7github
#yum install dockerweb
安裝以後啓動 Docker 服務,並讓它隨系統啓動自動加載。redis
2,啓動docker
#service docker start
#chkconfig docker on
3,獲取鏡像
獲取官方鏡像
+# docker pull centos:latest 官方鏡像
+# docker pull docker.cn/docker/centos:centos6 國內鏡像
搜索鏡像
[root@localhost ~]# docker search centos
定製docker鏡像
+openVZ模板的下載地址爲:http://wiki.openvz.org/Download/template/precreated
+#cat centos-5-x86.tar.gz | docker import - centos:5
本地製做docker鏡像
+安裝鏡像製做工具febootstrap
+#yum -y install febootstrap
+使用febootstrap 製做CentOS5鏡像目錄
+febootstrap -i bash -i wget -i yum -i iputils -i iproute -i man -i vim-minimal -i openssh-server -i openssh-clients -i cronie-anacron -i crontabs centos5 centos5-image http://mirrors.aliyun.com/centos/5/os/x86_64/
+將鏡像導入到Docker
+cd centos5-image && tar -c . | docker import - centos5-base
++執行rpm -qa報錯:http://www.opstool.com/article/318
從dockerfile建立
後面會詳細介紹
節點之間的導入導出docker鏡像
+首先須要運行docker鏡像,若是不運行鏡像,執行docker ps -a,就沒有正在運行的container。
+[root@localhost ~]# docker run -i -t treasureboat/centos6 /bin/bash
+[root@ef6ad6a64086 /]# ifconfig
+[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef6ad6a64086 treasureboat/centos6:latest "/bin/bash" 23 seconds ago Exited (0) 8 seconds ago mad_mclean
+[root@localhost ~]# docker commit ef6ad6a64086 centos6.6.image
4e6e72b4387d8fe6c1c94a0546b105ab738cecee32a7332e93e13edf816cbcf2
+有兩種方法導出
++[root@localhost ~]# docker export centos6.6.image > centos6.6.img
++[root@localhost ~]# docker save centos6.6.image > centos6.6.image
+導入docker鏡像
++[root@localhost ~]# docker load < /root/centos6.6.img
4,搭建私有倉庫
+方法一
++直接pull registry鏡像
[root@localhost ~]# docker pull registry
++默認狀況下,會將倉庫存放於容器內的/tmp/registry目錄下,這樣若是容器被刪除,則存放於容器中的鏡像也會丟失,因此咱們通常狀況下會指定本地一個目錄掛載到容器內的/tmp/registry下,以下:
[root@localhost ~]#docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
35bdd9ed60d8653102ee17cf956099bd6114b68061fcdc172657ea3140a16be6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ec1030ff3bf registry:latest "docker-registry" 3 seconds ago Up 1 seconds 0.0.0.0:5000->5000/tcp desperate_elion
能夠看到啓動了一個容器,地址爲,本地ip地址:5000
+方法二
++使用git上的源碼建立
++首先登錄到docker在git上面的源碼頁面,https://registry.hub.docker.com/_/registry/下載,解壓。
++安裝registry到本地服務器上
++yum install build-essential python-dev libevent-dev python-pip liblzma-dev
++pip install docker-registry
++運行registry
++gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application
+方法三
++基於方法二的源碼,build成image,而後執行image
++在docker——registry目錄裏
++docker build -t registry
++docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
上面的方法都須要指定-v來修改鏡像默認的存放位置,還能夠修改配置文件:
[root@localhost ~]#git clone https://github.com/dotcloud/docker-registry
[root@localhost ~]#cd docker-registry
[root@localhost ~]#cp config_sample.yml config.yml
[root@localhost ~]#vi config.yml
...
# This is the default configuration when no flavor is specified
dev:
storage: local
storage_path: /home/vpsee/registry
loglevel: debug
...
[root@localhost ~]#mkdir /home/vpsee/registry
Docker-Registry 其實是個基於 Flask 的 web app,安裝成功後就cb能夠這樣運行了:
[root@localhost ~]#gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:80 -w 1 wsgi:application
打開瀏覽器,訪問 IP 地址就能夠看到 docker-registry 私有倉庫在運行了
使用私有倉庫
+查看一下現有系統上已經有了哪些鏡像:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos6.6.image latest 4e6e72b4387d About an hour ago 465.7 MB
<none> <none> cf73ddbcb12b 10 days ago 375 MB
treasureboat/centos6 latest 09365809850b 4 months ago 465.7 MB
+將centos6.6.image這個鏡像上傳(pull)到建立的私有倉庫中(ip地址就是本地的ip地址),初次pull會提示設置用戶名/密碼。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos6.6.image latest 4e6e72b4387d About an hour ago 465.7 MB
registry latest 70d8f0edf5c9 7 days ago 413.9 MB
treasureboat/centos6 latest 09365809850b 4 months ago 465.7 MB
+只有images中的鏡像能夠pull。
[root@localhost ~]# docker tag 4e6e72b4387d 10.1.5.96:5000/c6.6
經測試,在centos6.6 docker1.5 沒法push鏡像
[root@localhost ~]# docker push 10.1.5.96:5000/c6.6
FATA[0004] Error: v1 ping attempt failed with error: Get https://10.1.5.96:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 10.1.5.96:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/10.1.5.96:5000/ca.crt
說明:docker1.3.× 之後,docker registry交互默認使用https,然而搭建的私有倉庫只提供http服務,因此當與私有倉庫交互是就會報上面的錯誤,爲了解決這個問題須要在啓動docker server時增長啓動參數爲默認使用http訪問。
解決方法:
修改docker配置文件
vi /etc/sysconfig/docker
DOCKER_OPTS="--insecure-registry 10.1.5.96:5000"
重啓docker
service docker restart
--------------------------------------------------------------------------------
docker數據管理
1,掛載本地目錄
#docker run -it --privileged=true -v /data/test:/usr/local/test treasureboat/centos6 /bin/bash
-v參數,冒號前爲宿主機目錄,必須爲以爲路徑,冒號後爲鏡像內掛載的路徑。
默認掛載的路徑權限爲讀寫,若是指定只讀能夠用:ro
#docker run -it --privileged=true -v /data/test:/usr/local/test:ro treasureboat/centos6 /bin/bash
遇到的問題:
使用docker run -v /data:/mnt -i -t ubuntu 來共享docker容器和主機目錄,可是在docker容器裏文件只能夠讀不能夠寫。若是共享的不是主機data目錄,文件也會變得不能夠讀,用ls命令會得出ls: cannot open directory .: Permission denied這樣的提示,根本查看不了目錄。
解決:
selinux 緣由。
兩種方法:1.selinux模式爲permissive模式 setenforce 0
2.容器啓動,添加--privileged=true
數據卷
數據卷:就是一個正常的容器,專門用來提供數據卷供其餘容器掛載
實例:
#docker run --privileged=true -v /data/test:/usr/local/test --name mydata docker.io/treasureboat/centos6 /bin/bash
建立一個數據卷
#docker run -it --privileged=true --volumes-from mydata docker.io/treasureboat/centos6 /bin/bash
建立一個容器,掛載數據卷容器,並作操做
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c10abf449ad4 docker.io/treasureboat/centos6:latest "/bin/bash" About a minute ago Exited (0) About a minute ago thirsty_mclean
ce8dc9e26363 docker.io/treasureboat/centos6:latest "/bin/bash" 18 minutes ago Exited (0) 18 minutesago mydata
[root@localhost ~]# docker run -it --privileged=true --volumes-from mydata docker.io/treasureboat/centos6 /bin/bash
[root@c10abf449ad4 /]# echo "aaa" > /usr/local/test/aaa.txt
[root@c10abf449ad4 /]# exit
exit
[root@localhost ~]# cat /data/test/aaa.txt
aaa
備份
新建一個數據卷
docker run --privileged=true -v /root/data:/data --name mydata docker.io/plaken/centos6.5:latest data
掛載數據卷,並將數據卷中的/data打包保存到本地目錄/root/test下
[root@localhost ~]# docker run --privileged=true --volumes-from mydata -v /root/test:/backup docker.io/plaken/centos6.5:latest tar zcvf /backup/backup.tar.gz /data
tar: Removing leading `/' from member names
/data/
/data/bbb.txt
[root@localhost ~]# cd test/
[root@localhost test]# ls
backup.tar.gz
恢復
刪除原有的文件
[root@localhost ~]# cd data/
[root@localhost data]# ls
bbb.txt
[root@localhost data]# rm -rf bbb.txt
掛載數據卷,並將本地的備份文件/root/test/backup.tar.gz 解壓到數據卷中的/data中,也就是本地的/root/data/data/bbb.txt
[root@localhost ~]# docker run --privileged=true --volumes-from mydata -v /root/test:/backup docker.io/plaken/centos6.5:latest tar zxvf /backup/backup.tar.gz -C /data
data/
data/bbb.txt
[root@localhost ~]# ll data/data/bbb.txt
-rw-r--r--. 1 root root 4 7月 9 03:12 data/data/bbb.txt
2,docker配置sshd
1>,進入交互模式
[root@localhost ~]# docker run -i -t docker.io/treasureboat/centos6 /bin/bash
2>,安裝sshd服務
[root@c1915e9fa3fc /]# yum install openssh-server
3>,修改密碼
[root@c1915e9fa3fc /]# passwd root
4>,關閉selinux
[root@c1915e9fa3fc /]#setenforce 0
[root@c1915e9fa3fc /]#echo "setenforce 0" >> /etc/rc.d/rc.local
5>,修改配置文件
vi /etc/ssh/sshd_config
UsePAM yes 修改成 UsePAM no
7>,commit改容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1915e9fa3fc docker.io/treasureboat/centos6:latest "/bin/bash" 15 minutes ago Exited (0) 4 seconds ago high_davinci
[root@localhost ~]# docker commit c1915e9fa3fc centos6:sshd
8>,使用docker.io/treasureboat/centos6:latest /usr/sbin/sshd -D
[root@localhost ~]# docker run -d -p 60022:22 docker.io/treasureboat/centos6:latest /usr/sbin/sshd -D
3,使用網絡
外部訪問容器
要讓外部訪問容器的端口能夠經過-p或-P參數來指定端口映射
當使用-P參數時,會隨機一個49000~49900的端口到內部容器開放的網絡端口
格式:
1>hostPort:contarnerPort
docker run -d -p 60022:22 docker.io/treasureboat/centos6:latest /usr/sbin/sshd -D
2>ip:hostPort:contarnerPort
docker run -d -p 127.0.0.1:60022:22 docker.io/treasureboat/centos6:latest /usr/sbin/sshd -D
3>ip::contarnerPort
docker run -d -p 127.0.0.1::22 docker.io/treasureboat/centos6:latest /usr/sbin/sshd -D
4>指定udp端口
docker run -d -p 127.0.0.1:600161:161/udp docker.io/treasureboat/centos6:latest /bin/snmp -D
查看映射端口配置
docker port mydocker 5000
127.0.0.1:5000
容器互聯
A服務器(172.17.0.100)
[root@localhost ~]# docker run -i -t --name client docker.io/nepalez/ubuntu-ssh:latest /usr/sbin/sshd -D
B服務器(172.17.0.101)
[root@localhost ~]# docker run -i -t --link=client:lianjie docker.io/nepalez/ubuntu-ssh:latest /bin/bash
root@84a8b509cd82:/# ping lianjie
PING lianjie (172.17.0.100) 56(84) bytes of data.
64 bytes from lianjie (172.17.0.100): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from lianjie (172.17.0.100): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from lianjie (172.17.0.100): icmp_seq=3 ttl=64 time=0.047 ms
容器間db連接
打開mysql容器
[root@localhost ~]# docker run -a stdout --name mydb -P docker.io/umrigark/centos6-ssh-mysql /run.sh &
========================================================================
ssh -p <port> root@<host>
Password for the root user is : mz0pbPqWgWgD
Please remember to change the above password as soon as possible!
========================================================================
....
========================================================================
MySQL Password for user: admin is : ePpd2cBEXwTn
Please remember to change the above password as soon as possible!
========================================================================
打開應用容器
[root@localhost ~]# docker run -t -i --link mydb:db docker.io/umrigark/centos6-ssh-mysql /bin/bash
安裝mysql客戶端,鏈接mysql服務器
bash-4.1# mysql -h db -P3306 -uadmin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql>
4,高級網絡設置
配置dns
1>默認狀況下容器的dns配置是利用虛擬文件來掛載到容器的三個文件。因此當宿主機的DNS配置改變,容器也跟着改變。
bash-4.1# mount
...
/dev/sda3 on /etc/resolv.conf type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
/dev/sda3 on /etc/hostname type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
/dev/sda3 on /etc/hosts type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
...
2>手動指定容器配置
在建立容器的時候添加如下參數
-h HOSTNAME 或者 --hostname=HOSTNAME 設定容器的主機名。它會被寫到容器內的/etc/hostname和/etc/hosts,但在容器外部看不到,既不會在docker ps中顯示,也不會在其餘的容器/etc/hosts看到
--dns=IP_ADDRESS 添加DNS服務器到容器的/etc/resolv.conf
3>訪問控制
利用iptables對容器的訪問進行控制
iptables使用問題
[root@localhost ~]# docker run -i -t docker.io/plaken/centos6.5 /bin/bash
bash-4.1# iptables -nL
FATAL: Could not load /lib/modules/3.10.0-229.7.2.el7.x86_64/modules.dep: No such file or directory
iptables v1.4.7: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
解決方法:
[root@localhost ~]# docker run -i -t --privileged=true docker.io/plaken/centos6.5 /bin/bash
bash-4.1# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4>自定義docker網橋
建立容器的時候,默認會建立一個docker0的網橋,該網橋和其餘虛擬機的網橋的功能是同樣的,可使用brctl show來查看。
*brctl的安裝包是bridge-utils
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.56847afe9799 no veth40bd9a4
vethee0474f
除了默認的docker0網橋,用戶也能夠指定網橋來鏈接各個容器
在啓動docker服務的時候使用-b BRIDGE或 --bridge=BRIDGE來指定使用的網橋
自定義網橋:
中止docker服務
[root@localhost ~]# service docker stop
[root@localhost ~]# ip link set dev docker0 down
[root@localhost ~]# brctl delbr docker0
建立一個網橋
[root@localhost ~]# brctl addbr bridge0
[root@localhost ~]# ip addr add 192.168.5.1/24 dev bridge0
[root@localhost ~]# ip link set dev bridge0 up
查看新建的網橋
[root@localhost ~]# ip addr show bridge0
231: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 7a:7b:a6:44:4e:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
inet6 fe80::787b:a6ff:fe44:4eeb/64 scope link
valid_lft forever preferred_lft forever
配置 Docker 服務,默認橋接到建立的網橋上。
[root@localhost ~]# echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
[root@localhost ~]# service docker start
啓動 Docker 服務。 新建一個容器,能夠看到它已經橋接到了 bridge0 上。
在容器中可使用 ip addr 和 ip route 命令來查看 IP 地址配置和路由信息。
*工具
pipework
Jérôme Petazzoni 編寫了一個叫 pipework 的 shell 腳本,能夠幫助用戶在比較複雜的場景中完成容器的鏈接。
playground
Brandon Rhodes 建立了一個提供完整的 Docker 容器網絡拓撲管理的 Python庫,包括路由、NAT 防火牆;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服務器。
5>配置固定ip,不是公網ip,docker不能配置公網ip
http://www.xiaomastack.com/2015/02/06/docker-static-ip/
6>點對點鏈接
5,實 例
1>經過supervisor來管理進程
Dockerfile配置
[root@localhost dockerfile]# cat Dockerfile
FROM centos:6.6
MAINTAINER duxuefeng@oasgames.com
RUN yum -y update
RUN yum install -y openssh-server nginx supervisor
#官方源是沒有nginx和supervisor的,須要執行完Dockerfile後進入交互模式安裝,後commit。
|--------------------------------------------------------------------------------------------
|[root@de8aff6c9df4 /]# cat /etc/yum.repos.d/nginx.repo
|[nginx]
|name=nginx repo
|baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
|gpgcheck=0
|enabled=1
|
|yum install nginx -y
|
|#配置supervisor
|yum install python-setuptools
|easy_install supervisor
|-------------------------------------------------------------------------------------------
RUN mkdir -p /var/run/sshd
RUN mkdir /var/log/supervisor
COPY supervisord.conf /etc/supervor/conf.d/supervisord.conf
|--------------------------------------------------------------------------------------
|#supervisord.conf
|[supervisord]
|nodaemon=true
|[program:sshd]
|command=/usr/sbin/sshd -D
|
|[program:nginx]
|command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
---------------------------------------------------------------------------------------
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
#使用
非交互模式
docker run -d -p 22 -p 80 duxuefeng/supervisor:3.0 /usr/bin/supervisord -c /etc/supervor/conf.d/supervisord.conf
交互模式
docker run -d -p 22 -p 80 duxuefeng/supervisor:3.0
-------------------------------------------------------------------------------------
docker run 命令
docker run [OPTIONS] IMAGE[:TAG][COMMAND][ARG...]
OPTIONS分爲兩類
1,設定操做執行方式
+1,設定container的運行方式,前臺仍是後臺執行
+2,設定container的id
+3,設定network參數
+4,設定container的cpu和內存參數
+5,設定權限和LXC參數
2,設定image的默認資源
Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
Run a command in a new container
-a=map[]: 附加標準輸入、輸出或者錯誤輸出
-c=0: 共享CPU格式(相對重要)
-cidfile="": 將容器的ID標識寫入文件
-d=false: 分離模式,在後臺運行容器,而且打印出容器ID
-e=[]:設置環境變量
-h="": 容器的主機名稱
-i=false: 保持輸入流開放即便沒有附加輸入流
-privileged=false: 給容器擴展的權限
-m="": 內存限制 (格式:<number><optional unit>, unit單位 = b, k, m or g)
-n=true: 容許鏡像使用網絡
-p=[]: 匹配鏡像內的網絡端口號
-rm=false:當容器退出時自動刪除容器 (不能跟 -d一塊兒使用)
-t=false: 分配一個僞造的終端輸入
-u="": 用戶名或者ID
-dns=[]: 自定義容器的DNS服務器
-v=[]: 建立一個掛載綁定:[host-dir]:[container-dir]:[rw|ro].若是容器目錄丟失,docker會建立一個新的卷
-volumes-from="": 掛載容器全部的卷
-entrypoint="": 覆蓋鏡像設置默認的入口點
-w="": 工做目錄內的容器
-lxc-conf=[]: 添加自定義-lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
-sig-proxy=true: 代理接收全部進程信號(even in non-tty mode)
-expose=[]: 讓你主機沒有開放的端口
-link="": 鏈接到另外一個容器(name:alias)
-name="": 分配容器的名稱,若是沒有指定就會隨機生成一個
-P=false: Publish all exposed ports to thehost interfaces 公佈全部顯示的端口主機接口
1,設定操做執行方式
++設定運行方式
-d:加上該參數肯定這個容器是在後臺運行。反之在前臺運行,container的全部輸出均可以在當前窗口中看到
+-a=[],指定掛載標準數據流,‘STDIN’,‘STDOUT’,‘STDERR’
+-i -t ,對於執行容器內的交互操做,例如,shell腳本,咱們必須使用-i -t申請一個控制檯同容器進行數據交互。
docker run -a stdin -a stdout -i -t ubuntu /bin/bash
+可是當經過管道同容器交互就不能使用-t,如:echo test | run -i busybox cat
-p 指定container綁定到宿主機的端口,-P從49153-65535中隨機分配未被佔用的端口綁定到宿主機上。--link container間內網訪問
++設定id
+給container命名有三種方式:
1,使用uuid長命名,提交副本時產生的uuid。
2,使用uuid短命名, IMAGE ID。
3,使用name,docker images中的REPOSITORY
+當運行docker時有自動化要求,能夠要求docker將ID輸出到指定的文件中,方便後續操做,--cidfile=「」
++IPC設定
默認狀況先,全部容器都開啓了IPC命名空間。共享那次能夠提升進程數據的交互速度。
++網絡設定
默認狀況下全部的container都開啓了網絡接口,同時能夠接受任何外部數據的請求。
+--dns,默認狀況下,container使用host的DNS設置,經過--dns來覆蓋container內的dns的設置。
+--net=""
none:關閉container內的網絡鏈接,內部只會有一個lookback接口。
bridge:默認選項,經過veth接口來鏈接
host:容許container使用host的網絡堆棧信息
container:使用另外一個container的網絡堆棧信息
+--add-host="",動態向container中的/etc/hosts添加hostname信息
clean up
--rm ,須要短時間運行一個前臺container,產生的數據不須要保留,在使用完畢以後自動清理產生的數據。
安全配置
--security-opt
cpu和內存的配置
-m="",調整內存。
-c="", 調整cpu優先級。默認狀況下全部的container享有相同的cpu優先級和cpu調度週期。-c="0"表示賦予當前container 1024個cpu共享週期。好比說:-c="0"啓動c0,-c="512"啓動c1,這時c0可使用100%的cpu資源,c1可使用50%的cpu資源。
runtime privilege linux capabilities LXC configuration
--privileged 加上該參數後,docker能夠訪問宿主機全部設備的權限。
--device=[],默認狀況下,container對設備的讀,寫,建立設備文件的權限,使用:rwm來配合--device,控制這些權限。
docker run --device=/dev/sda:/dev/xvdc:rwm --rm -it centos fidsk /dev/xvdc
--cap-add/--cap-drop,配合--privileged,你能夠更細緻的控制container,默認使用這兩個參數的狀況下,能夠有修改內核的權限,
例如:若是想讓某個container擁有除了MKNOD以外的全部內核權限:docker run --cap-add=ALL --cap-drop=MKNOD
若是須要修改網絡接口數據:docker run --cap-add=NET_ADMIN centos ip link add dummy0 type dummy
若是要掛載FUSE文件系統:docker run --cap-add SYS_ADMIN --device /dev/fuse sshfs
-v 當docker建立一個數據卷並掛載到容器中時使用-v來標記。
例如:docker -v /opt/app:/home/app -p 80:8000 -d --name centos
2,設定image的默認資源,也就是image使用者能夠用此命令來覆蓋image開發者在build階段所設定的默認值
當開發者使用dockerfile進行build或者commit時,開發者能夠設定一些image參數。這些參數有四個沒法進行覆蓋:FROM,MAINTARNER,RUN,ADD,其他參數均可以經過docker run進行覆蓋。
+cmd,可選,可用用新命令覆蓋舊命令
+--entrypoint="",指定當container執行時,須要啓動那些進程。
例子:docker run -i -t --entrypoint /bin/bash example/redis -c ls -l
+--expose,dockerfile在網絡方面除了提供一個expose以外,沒有提供其餘選項。
-p 指定container綁定到宿主機的端口,-P從49153-65535中隨機分配未被佔用的端口綁定到宿主機上。--link container間內網訪問
+ENV
當container啓動時,會自動在contarner中初始化變量:HOME,HOSTNAME,PATH,TERM。
能夠經過-e來設定任意的環境變量,甚至覆蓋原有的環境變量,或者是在dockerfile中經過ENV設定的環境變量。
+volume
設置共享文件系統
+user
container中默認的用戶是root,-u,來覆蓋默認用戶
+workdir
container中默認的工做目錄是根目錄,-w,來覆蓋默認工做目錄。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
dockerfile講解
[root@localhost centos7]# cat Dockerfile
#
# MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION 1.6.2
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#
FROM centos:centos7.1.1503 #基礎鏡像也就是父鏡像,docker-hub上pull下來
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com> #維護者信息
ENV TZ "Asia/Shanghai" #設置時區環境變量
ENV TERM xterm #
#ADD和copy都是複製文件,add比copy多了兩個功能,1,被拷貝能夠是連接地址,2,能夠是壓縮文件,拷貝到目的地後自動解壓
ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo
#docker每執行一條命令都生成docker鏡像的一層,docker鏡像是分層的
RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
yum install -y --enablerepo=epel pwgen python-pip && \
yum clean all
#安裝服務
RUN pip install supervisor
ADD supervisord.conf /etc/supervisord.conf
RUN mkdir -p /etc/supervisor.conf.d && \
mkdir -p /var/log/supervisor
#映射端口,宿主機隨機匹配一個端口映射到22端口
EXPOSE 22
#docker每次啓動的時候須要執行的命令
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
[root@localhost centos7]# docker build -t csphere/centos:7.1 .
#-t 名字
#最後加dockerfile的路徑
CM和ENTRYPOINT的區別
Dockerfile 用於自動化構建一個docker鏡像。Dockerfile裏有 CMD 與 ENTRYPOINT 兩個功能咋看起來很類似的指令,開始的時候以爲兩個互用沒什麼所謂,但其實並不是如此:
CMD指令:
The main purpose of a CMD is to provide defaults for an executing container.
CMD在容器運行的時候提供一些命令及參數,用法以下:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一種用法:運行一個可執行的文件並提供參數。
第二種用法:爲ENTRYPOINT指定參數。
第三種用法(shell form):是以」/bin/sh -c」的方法執行的命令。
如你指定:
CMD [「/bin/echo」, 「this is a echo test 」]
build後運行(假設鏡像名爲ec):
docker run ec
就會輸出: this is a echo test
是否是感受很像開機啓動項,你能夠暫時這樣理解。
注意點:
docker run命令若是指定了參數會把CMD裏的參數覆蓋: (這裏說明一下,如:docker run -it ubuntu /bin/bash 命令的參數是指/bin/bash 而非 -it ,-it只是docker 的參數,而不是容器的參數,如下所說參數均如此。)
一樣是上面的ec鏡像啓動:
docker run ec /bin/bash
就不會輸出:this is a echo test,由於CMD命令被」/bin/bash」覆蓋了。
ENTRYPOINT
字面意思是進入點,而它的功能也恰如其意。
An ENTRYPOINT allows you to configure a container that will run as an executable.它可讓你的容器功能表現得像一個可執行程序同樣。
容器功能表現得像一個可執行程序同樣,這是什麼意思呢?
直接給個例子好說話:
例子一:
使用下面的ENTRYPOINT構造鏡像:
ENTRYPOINT ["/bin/echo"]
那麼docker build出來的鏡像之後的容器功能就像一個/bin/echo程序:
好比我build出來的鏡像名稱叫imageecho,那麼我能夠這樣用它:
docker run -it imageecho 「this is a test」
這裏就會輸出」this is a test」這串字符,而這個imageecho鏡像對應的容器表現出來的功能就像一個echo程序同樣。 你添加的參數「this is a test」會添加到ENTRYPOINT後面,就成了這樣 /bin/echo 「this is a test」 。如今你應該明白進入點的意思了吧。
例子二:
ENTRYPOINT ["/bin/cat"]
構造出來的鏡像你能夠這樣運行(假設名爲st):
docker run -it st /etc/fstab
這樣至關: /bin/cat /etc/fstab 這個命令的做用。運行以後就輸出/etc/fstab裏的內容。
ENTRYPOINT有兩種寫法:
寫法一:
ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)
寫法二:
ENTRYPOINT command param1 param2 (shell form)
你也能夠在docker run 命令時使用–entrypoint指定(可是隻能用寫法一)。
下面是我把ENTRYPOINT設爲[「/bin/sh -c」]時候運行的狀況:
linux-oj9e:/home/lfly/project/docker # docker run -it t2 /bin/bash
root@4c8549e7ce3e:/# ps
PID TTY TIME CMD
1 ? 00:00:00 sh
9 ? 00:00:00 bash
19 ? 00:00:00 ps
能夠看到PID爲1的進程運行的是sh,而bash只是sh的一個子進程,/bin/bash只是做爲 /bin/sh -c後面的參數。
CMD能夠爲ENTRYPOINT提供參數,ENTRYPOINT自己也能夠包含參數,可是你能夠把那些可能須要變更的參數寫到CMD裏而把那些不須要變更的參數寫到ENTRYPOINT裏面例如:
FROM ubuntu:14.10
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
把可能須要變更的參數寫到CMD裏面。而後你能夠在docker run裏指定參數,這樣CMD裏的參數(這裏是-c)就會被覆蓋掉而ENTRYPOINT裏的不被覆蓋。
注意點1:
ENTRYPOINT有兩種寫法,第二種(shell form)會屏蔽掉docker run時後面加的命令和CMD裏的參數。
注意點2:
網上有資料說ENTRYPOINT的默認值是[」/bin/sh -c」],可是筆者在試驗的時候獲得的結果並非這樣的。
筆者使用ENTRYPOINT [「/bin/sh -c」] 指令構造一個以/bin/sh -c爲進入點的鏡像,命名爲sh,而後我能夠這樣運行:
docker run -it sh 「while(ture ) do echo loop; done」
運行結果就是無限輸出loop。但若是直接運行一個ubuntu:14.10鏡像,狀況不是這樣的:
docker run -it ubuntu:14.10 「while(ture ) do echo loop; done」
獲得這樣的錯誤:
linux-oj9e:/home/lfly # docker run -it ubuntu:14.10 「while(true) do echo this; done」 2014/11/16 18:07:53 Error response from daemon: Cannot start container 4bfe9c6faeec3ed465788a201a2f386cb1af35aba197dbc78b87c0d5dda1f88e: exec: 「while(true) do echo this; done」: executable file not found in $PATH
能夠猜測默認狀況下ENTRYPOINT並非[「/bin/sh -c」]。
並且直接運行ubuntu:14.10列出程序也能夠看到PID爲1的程序並非sh。因此更否認了網友的說法,ENTRYPOINT並不默認爲[「/bin/sh -c」] 。
-------------------------------------------------------
docker命令
搜索鏡像
#docker search centos6
安裝鏡像
#docker pull treasureboat/centos6
查看安裝的鏡像
#docker images
刪除一個鏡像
#docker rmi centos7
查看一個鏡像的歷史
#docker history centos7啊
運行容器的shell界面
# docker run -i -t docker.cn/docker/centos:centos6 /bin/bash
刪除一個容器
#docker rm name/id
中止、啓動、殺死一個容器
#docker stop Name/ID
#docker start Name/ID
#docker kill Name/ID
從一個容器中取日誌
#docker diff Name/ID
顯示一個運行的容器裏面的進程信息
#docker top Name/ID
從容器裏面拷貝文件/目錄到本地一個路徑
#docker cp Name:/container_path to_path
#docker cp ID:/container_path to_path
重啓一個正在運行的容器
#docker restart Name/ID
退出再進
#docker exec -it websit /bin/bash
------------------------------------
滲透執行
若是想經過ssh進入container,須要安裝nsenter,安裝步驟以下:
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar -zxf-cd util-linux-2.24
./configure –without-ncurses
make
cp nsenter /usr/local/bin/
這個地方有個坑,以前我寫的是make && make install,經阿里雲的技術團隊測試,make以後千萬不能make install,make install後會替代操做系統底層的一些東西,直接影響linux操做系統的啓動,在阿里雲上會致使ubuntu14.0.4不能啓動,其實只須要把nsenter 複製到/usr/local/bin目錄下便可。國內其餘文檔介紹安裝nsenter的時候都沒說明這些,在此特別寫篇博客記錄一下。
找到mysql容器的第一個進程的pid
pid=`docker inspect --format "{{ .State.pid }}" mysql_1 `
而後滲入(須要root權限)
sudo nsenter --target $PID --mount --uts --ipc --net --pid