1. 镜像

是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。

2. docker容器

镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。

3. docker仓库

存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库http://dockerpool.com/ 


安装:

centos6 上安装(6.5之前版本需要升级一下 yum update ) yum install -y epel-release

yum install -y docker-io


如果是centos7 

yum install -y docker


启动docker

/etc/init.d/docker start


镜像管理:

docker pull  centos   //从docker.com获取centos镜像,如果太慢,直接做个加速http://www.apelearn.com/bbs/thread-15126-1-1.html

docker p_w_picpaths //查看本地都有哪些镜像

docker tag centos bob     //为docker镜像设置便签为bob,再使用docker p_w_picpaths查看会多出一行,镜像的id和centos是一样的

docker search centos     //从仓库里面搜索cnetos的镜像

docker run -it bob /bin/bash   //用下载的镜像开启容器,-i 表示让容器的标准输入打开,-t 表示分配一个伪终端,要把-i和-t放在镜像名字的前面

当镜像发生修改后,我们可以吧该镜像提交重新生成一个新版本进行再本地。

docker ps   //查看运行的容器,加上-a可以查看没有运行的容器

docker rmi bob//用来删除指定镜像,其中后面的参数可以是tag,如果是tag时,实际上是删除该tag,只要该镜像还有其他tag,就不会删除该镜像,后面的参数为镜像id时,则会彻底删除真个镜像,连通所有边卡一同删除。

docker tag centos centos:test  //新添加的还可以指定tag


docker start id   启动容器

docker exec -it id号   /bin/bash    进入容器

如果要使用ifconfig 查看ip,则需要安装net-tools包:yum install -y net-tools


使用已有镜像的容器创建新的镜像

docker commit -m "install  network" -a "bob" 3ew bob/centos

-m  加改动的信息

-a   指定作者相关的信息

3ew  容器id    

在后面为新镜像的名字


从容器里面退出来可以使用exit或ctrl+d


docker基于本地模板导入创建镜像

http://openvz.org/Download/templates/precreated

模板导入为镜像

cat centos-6-x86_64-minimal.tar.gz |docker import - centos-6-x86_64

吧现有的镜像导出为一个文件

docker save -o centos_net-64 bob/latest

用文件恢复本地镜像

docker load --input bob-centos.tar  或者

docker load < bob-centos.tar


可以吧自己的镜像上传到dockerhub官网上去,但需要有自己的账户。

docker push p_w_picpaths_name


给镜像改名字

docker tag 45fg centos-net-64:bob


docker的使用和配置

备份docker

docker commit -m "yum net-tools" -a "bob" 12fgfd2462g3 bob/centos

-m  改动的信息

-a  作者的信息

一串为容器id

最后面是新镜像的名字


查看启动的容器

docker ps

查看所有的容器

docker ps -a

创建容器,但容器并没有启动

docker create -it centos

启动一个容器

docker start 容器id   //启动容器后,可以使用docker ps 查看,之前使用的docker run相当于先create,在start

docker run -itd centos-6-x86 /bin/bash   -d在后台运行

进入一个启动的容器

docker exec -it 容器id /bin/bash

   

exec  可以随意的退出和进入,不影响容器的启动和停止

attach 不算好用,退出终端,容器也会停止


docker logs 可以查看容器运行的历史信息

 

给容器定义一个名字

docker run -name bob -itd centos bash


删除容器

docker rm 513g

强制删除容器

docker rm -f  531g


导出容器

docker export container_id > fil2.tar

生成bob镜像

cat file.tar |docker import - bob


创建新的镜像

docker build -t centos:httpd


把现有镜像导出为一个文件

docker save -o bob-centos.tar bob:centos

使用文件恢复本地镜像

docker load --input bob-centos.tar 或者

docker load < bob-centos.tar

docker load - i centos-docker-p_w_picpath.tar    导入镜像到docker里


docker的镜像以及一些数据都在/var/lib/docker目录下

cd /var/lib/docker/


杀死一个容器,或让一个容器退出

docker kill cd5232f    后面是容器id


启动、停止或重启

docker start fa43521dfasdfe

docker stop fasdfefaeae

docker restart dfaeojfa43523



指定端口

docker run -d -p 5000:5000 centos


docker仓库管理

docker pull registry 下载registry镜像

docker run -d -p 5000:5000 registry 启动镜像,并监听5000端口

可以使用telnet 127.0.0.1:5000 测试

curl 127.0.0.1:5000 可以访问它

给镜像标记一下,必须带有私有仓库的ip和port

docker tag centos 192.168.103.131:5000/centos

docker push 192.168.103.131:5000/centos 上传到私有仓库

vim /etc/init.d/docker

把$exec -d $other_args改为

$exec -d --insecure-registry 192.168.103.131:5000 $other_args

然后重启服务

service docker restart

docker start c50  启动registry容器

curl http://192.168.103.131:5000/v1/search  由于版本更改使用这个查看上传的镜像

curl http://192.168.103.131:5000/v2/_catalog

进入registry容器

docker exec -it 953 sh或者bash

docker exec -it 953 /bin/ls 可以查看里面的内容


安装ipconfig功能

yum install -y net-tools


 

数据管理

  1. 挂载本地目录到容器里面去

    docker run -itd -v /data/:/data1/ centos:bob bash

    -v 用来指定挂载目录,前面的是本地目录,后面的data1是容器的目录

  2. 挂载数据卷

    docker run -itd --volumes-from suspicious_ptolemy centos bash

    --volumes-from 后面是名字

    相当于吧容器为suspicious_ptolemy容器的磁盘挂载到cenots上

  3. 创建数据卷容器

    docker run -itd -v /data/ --name centos-test centos bash

    /data/指的是是容器里面的/data跟宿主机没有关系

  docker run -itd --volumes-from centos-test centos bash


备份和恢复

mkdir /data_backup

docker rum --volumes-from centos-test -v /data_backup/:/backup bob:centos 

tar cvf /backup/data.tar /data/


docker网络管理

host模式;使用docker run时,使用--net=host指定

docker使用的网络实际商河宿主机一样,在容器看到的网卡ip是宿主机上的ip

container模式:使用--net=container:container_id  多容器使用共同的网络,看到的ip是一样的。

none模式:使用--net=none 指定,这种模式下,不会配置任何网络

bridge模式,使用--net=bridge指定

默认模式就是使用这种网络模式,类是于vmware的nat的网络模式,中一个宿主机上的所有容器会在同一网段下。相互之间是可以通信的。


外部访问容器

docker run -itd -p 5123:80 centos-http:bob bash

本地的5123端口对应容器的80端口


docker容器互联

先创建一个容器,命名为bob

docker run -itd -p 13306:3306 --name bob centos bash

再新建一个容器,命名abc,并与bob互联

docker run -itd -p 1222:80 --name abc --link bob:abc centos-test bash


docker配置桥接网络 

centos7

l为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。l安装pipwork
git clone https://github.com/jpetazzo/pipework
cp~/pipework/pipework /usr/local/bin/l开启一个容器 docker run -itd --net=none --name aming123 centos  /bin/bashlpipework br0  aming123 172.7.15.201/24@172.7.15.107  #201为容器的ip,@后面的ip为宿主机iplbrctladdif br0 eth0 #eth0为宿主机网卡,这一步为把br0和eth0桥接起来lipaddr add 172.7.15.107/24 br0 #把107的ip绑定在br0上ldocker exec -it aming123 /bin/bash #进去后ifconfig查看就可以看到新添加的ip


centos6

lcd /etc/sysconfig/network-scripts/; cpifcfg-eth0  ifcfg-br0lvi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1lvi ifcfg-br0//修改DEVICE为br0,Type为Bridge,把eth0的网络设置设置到这里来lservice network restartl安装pipwork:git clone https://github.com/jpetazzo/pipework;
cp~/pipework/pipework /usr/local/bin/l开启一个容器: docker run -itd --net=none --name aming123 centos  /bin/bashlrpm -Uvhhttps://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm#不安会报错Object "netns" is unknown,try "ip help"lpipework br0  aming123 172.7.15.201/24ldocker exec -it aming123 /bin/bash #进去后ifconfig查看就可以看到新添加的ip


pipework br0  aming123 172.7.15.201/24@172.7.15.1  //@后面的ip为网关ip


dockerfile创建镜像


l1. FROM   //指定基于哪个基础镜像l格式 FROM <p_w_picpath> 或者  FROM <p_w_picpath>:<tag>, 比如lFROM centoslFROM centos:latest

l2. MAINTAINER  //指定作者信息l格式  MAINTAIN <name> ,比如lMAINTAINER  aming aming@aminglinux.com

l3. RUN   //镜像操作指令l格式为 RUN <command>  或者 RUN [“executable”, “param1”, “param2”],比如lRUN  yum install  httpdlRUN ["/bin/bash","-c", "echo hello"]

l4. CMD // 三种格式:lCMD ["executable","param1", "param2"]lCMD command param1 param2lCMD ["param1","param2"]lRUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。比如lCMD ["/bin/bash", "/usr/local/nginx/sbin/nginx","-c", "/usr/local/nginx/conf/nginx.conf"]

l5. EXPOSE  l格式为 EXPOSE <port> [<port>...] , 比如lEXPOSE 22 80 8443l这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。

l6. ENV  l格式 ENV  <key> <value>, 比如  lENV PATH /usr/local/mysql/bin:$PATHl它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量lENV MYSQL_version5.6

l7. ADD  格式 add <src> <dest>l将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如lADD <conf/vhosts> </usr/local/nginx/conf>

l8. COPY  l格式同addl使用方法和add一样,不同的是,它不支持url

l9. ENTRYPOINT  格式类似CMDl容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:lCMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。比如,容器名字为amingl我们在Dockerfile中指定如下CMD:lCMD [“/bin/echo”, “test ”]l启动容器的命令是  dockerrun aming这样会输出 testl假如启动容器的命令是 docker run -it aming /bin/bash  什么都不会输出lENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行lENTRYPOINT ["echo","test"]ldocker run -it aming  123l则会输入 test  123 ,这相当于要执行命令  echotest  123 

l10. VOLUME l格式  VOLUME ["/data"]l创建一个可以从本地主机或其他容器挂载的挂载点。l
l11. USER  l格式 USER daemonl指定运行容器的用户l
l12. WORKDIR  l格式 WORKDIR  /path/to/workdirl为后续的RUN、CMD或者ENTRYPOINT指定工作目录


l先下载nginx的配置文件 wget http://www.apelearn.com/study_v2/.nginx_conflvim Dockerfile //内容如下l############################################################
# Dockerfile tobuild NginxInstalled Containers
# Based on CentOS
############################################################
# Set the base p_w_picpath to CentOS
FROM centos
# File Author / Maintainer
MAINTAINERamingaming@aminglinux.com

# Install necessary tools
RUN yum install -y pcre-develwgetnet-tools gcc
RUN yum install -y zlibzlib-develmake
RUN yum install -y openssl-devel
l# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN tar zxvfnginx-1.8.0.tar.gz
RUN mkdir -p/usr/local/nginxlRUN cd nginx-1.8.0.tar.gz &&./configure --prefix=/usr/local/nginx&& make && make install
RUN rm -fv /usr/local/nginx/conf/nginx.conf
COPY .nginx_conf /usr/local/nginx/conf/nginx.conf

# Expose ports
EXPOSE 80
# Set the default command to execute
# when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx -c/usr/local/nginx/conf/nginx.confl创建镜像:ldocker build -t centos_nginx .docker p_w_picpaths 可以看到我们新建的镜像