docker學習筆記

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

相關文章
相關標籤/搜索