Docker参考手册

Docker17.6参考手册
一. 离线安装
Docker 的在线安装非常简单,更新源后,使用apt-get 或yum 都可以直接安装。但离线安装要麻烦一些。
Docker的离线安装,需要下载以下安装包(基于Centos6.6):
docker-engine-1.7.1-1.el6.x86_64.rpm
libcgroup-0.40.rc1-23.el6.x86_64.rpm
libcgroup-devel-0.40.rc1-23.el6.x86_64.rpm
libcgroup-pam-0.40.rc1-23.el6.x86_64.rpm
net-tools-1.60-110.el6_2.x86_64.rpm
iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm (必须,需要强制安装 --force)
使用 rpm –ivh 命令安装即可。
如果提示缺少依赖,根据提示继续在网上下载其依赖包即可。

 Centos7改动:
docker-ce-17.06.0.ce-1.el7.centos.x86_64.rpm
libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm
policycoreutils-2.5-11.el7_3.x86_64.rpm
container-selinux-2.19-2.1.el7.noarch.rpm
net-tools-2.0-0.17.20131004git.el7.x86_64.rpm --可能已存在
iproute-3.10.0-74.el7.x86_64.rpm --可能已存在

二. 启动
修改Docker镜像和容器保存的目录:
通常docker会把镜像和容器保存在var/lib/docker下面,但这个分区通常空间都比较小.这时候可以按以下方法,把目录换为较大的home目录.
1):停止docker服务: service docker stop
2):复制现有镜像到home cp –r /var/lib/docker /home
3):修改docker配置文件: vi /etc/sysconfig/docker 在里面加上 other_args="–graph=/home/docker"
4):启动docker
Docker是以Linux服务存在的

		service docker start 

 Centos7改动:
修改docker默认镜像保存位置:
1).在/etc/systemd/system目录,创建docker.service.d目录,然后在其下创建docker.conf 文件,添加以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker_image --storage-driver=devicemapper
然后,执行: systemctl daemon-reload
Systemctl start docker

三.使用
1.Docker的概念:
1)容器 docker的容器概念,可以理解为一个容器就是一个运行中的操作系统,里面可以跑N个第三方程序。实际上也正是如此,所有的容器都是一个最小版本的LINUX。类似于vmware虚拟机的概念。docker是轻量级的,启动快,但配置相对复杂。
2)镜像 和容器的区别在于,镜像就是关闭的操作系统,可以在里面安装N个应用。可以通过命令生成、修改、删除、导出、导入镜像。
3)仓库 ,类似于MAVEN仓库,保存镜像的地方。
2.起步
通常情况下,安装完Docker,只要有镜像,就可以启动镜像成为一个容器。而初始镜像,则需要从网上下载。
使用 docker search centos6 类似的命令,就可以查找到官网仓库中所有可用的镜像, 再使用 “docker pull 镜像完整名称” 即可下载镜像。
下载成功的镜像,默认保存在docker的目录结构中,需要使用导出命令导出为文件,再迁移到别的机器上进行修改,打包,等等。
使用如下语句导出: docker save caio2k/centos6 | bzip2 -9 -c>cent6.tar.bz2
使用如下语句导入: docker load < ./centos6.tar.gz
四.网络配置
(如果使用主机模式,则可跳过这段)
Docker的使用,最麻烦的就是网络配置
因为对于镜像的操作,其实就是LINUX操作,比较简单。但是对于多个容器之间的通信,以及容器对外提供网络服务,则都需要网络配置正确。
通常的配置:
Docker有四种网络支持。通常情况下,我们会使用自定义的配置。容器启动时使用 –net=none 参数。
自定义网络步骤如下:
1) 创建自定义网桥:br0 (名字随意)
Vi /etc/sysconfig/network-scripts/ifcfg-br0
输入如下内容:
TYPE=“Bridge”
BOOTPROTO=static
IPADDR=192.168.110.7
NETMASK=255.255.255.0
GATEWAY=192.168.110.1
PREFIX=24
NAME=br0
ONBOOT=yes
DEVICE=br0
2) 修改服务器自身的网络配置如下:
Vi /etc/sysconfig/ network-scripts/ifcfg-em1
改为如下内容:
DEVICE=em1
HWADDR=14:18:77:71:23:82
TYPE=Ethernet
UUID=a1d8f1a6-5a33-4b9d-a93a-8fb701d692c1
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
#IPADDR=192.168.110.7
#GATEWAY=192.168.110.1
#DNS1=202.106.0.20
#NETMASK=255.255.255.0
DEFROUTE=“yes”
PEERDNS=“yes”
PEERROUTES=“YES”
NAME=em1
BRIDGE=“br0”
解释如下:
新建一个网桥叫br0,它会替换掉原来的网络配置(注意红色被注释的部分),然后把这个配置和网桥连接起来(bridge=”br0”)。这样子,外网访问首先会到网桥,然后由网桥跳到本地网络。
Docker的容器在启动时,会创建一个虚拟网络设备,默认情况下,这个虚拟网卡只能和本机通信。而我们想让它被外部网络发现,就需要把这个虚拟设备和新建的网桥联系起来。这就是网桥的作用。
我们在启动容器时,会用pipework软件指定一个IP:
pipework br0 containerName 192.168.110.60/[email protected]
然后这个配置里的IP为60的容器,就能被网络中其他机器识别并通信了。
端口映射:
1) -P 大写,表示
常用命令列表:
#起服务
service docker start

#查看DOCKER信息
docker info

#下载镜像 1.搜索 参数为镜像名
docker search centos6

#下载镜像 2.下载 参数为完整镜像名
docker pull liti/centos6

#查看当前机器所有镜像
docker images

#查看镜像详细
docker inspect liti/centos6

#创建容器
启动镜像 ,交互式,退出shell时,容器关闭
docker run --name centos6 -it liti/centos6 /bin/bash

#创建容器,守护进程式 -d
docker run -itd liti/centos6 /bin/bash

#启动容器
docker start container_id

#进入启动的容器
#如果使用exit退出,容器不停止
docker exec -it container_id /bin/sh
#查看容器日志
docker logs container_id

#删除已经停止的容器
docker stop container_id

docker rm container_id

#停止所有容器
docker stop $(docker ps -q -a)

docker rm $(docker ps -q -a)

#列出所有容器
a 所有 l 最近使用的,包括未运行的 q 仅列出ID,不包括未运行的
docker ps [-a -l -q]

#从主机挂载文件夹到容器 -v
示例为将本机的home目录挂到镜像的mnt目录

docker run -v /home:/mnt -it sinoaudit/base-centos6.6 /bin/bash

#提交镜像
(此步可生成自定义镜像) -m 镜像信息 -a 创建人
docker commit -m “new images for sino” -a “hjc” Contanter_ID name/id

#删除镜像
-f 强制删除
docker rmi imageid

#导出镜像
(包括镜像编辑的历史信息,出来是个压缩文件)
docker save caio2k/centos6 | bzip2 -9 -c>cent6.tar.bz2
#导入镜像
docker load < /home/centos6.tar.gz
五.自定义网络启动容器
一.启动Service 不包括文件发送和自动入库

  1. 所有Service
    –自定义网络模式
    docker run -itd --net=none --hostname services --add-host services:192.168.110.61 -v /home:/mnt --name serviceall sino/service-all /bin/bash
    pipework br0 serviceall 192.168.110.61/[email protected]

–主机模式
docker run -itd --net=host -p 20820:20820 -p 20821:20821 -p 20822:20822 -p 20824:20824 -p 20825:20825 -p 20826:20826 -p 20827:20827 -p 20831:20831 -p 20832:20832 -p 20833:20833 -p 20834:20834 -p 20835:20835 -v /home:/mnt --name service-all sino/service_all /bin/bash

2.文件发送:
docker run -itd --net=none --hostname filesendserver --add-host filesendserver:192.168.110.62 -v /opt:/mnt --name filesend sino/file-send-service /bin/bash

pipework br0 filesend 192.168.110.62/[email protected]

3.自动入库
docker run -itd --net=none --hostname autoimportserver --add-host autoimportserver:192.168.110.63 -v /opt:/mnt --name autoimport sino/auto-import-data-service /bin/bash

pipework br0 autoimport 192.168.110.63/[email protected]

自定义网络模式下,解释如下:
–net=none:使用自定义网络模式启动
-p映射所有需要的端口到主机,如果需要在一台机器跑多个这样的服务,则端口映射要不一样 端口的顺序:前面是主机,后面是容器
–name 容器名称
–hostname 容器主机名,重要
–add-host 向/etc/hosts 写入一行主机配置,重要
添加最后两个参数的原因是因为dubbo ,dubbo在向zookeeper注册时,使用的是主机名找IP的方式,而 docker启动容器默认的主机名是容器ID,如果没有这两个参数,则dubbo注册时会提示找不到IP,注册不了
二.启动WEB
docker run -itd --net=none --name serviceweb -p 12080:12080 -p 11180:11180 -p 7080:7080 -p 10080:10080 -p 5080:5080 -p 13080:13080 -p 11080:11080 -p 8989:8989 -p 14000:14000 -p 4080:4080 --add-host webserver:192.168.110.60 -v /opt:/mnt --hostname webserver sino/service-web-all /bin/bash

pipework br0 serviceweb 192.168.110.60/[email protected]

主机模式:

docker run -itd --net=host --name web-all -p 12080:12080 -p 11180:11180 -p 7080:7080 -p 10080:10080 -p 5080:5080 -p 13080:13080 -p 11080:11080 -p 8989:8989 -p 14000:14000 -p 4080:4080 -v /home:/mnt sino/all-web /bin/bash

最重要的事: 在容器中如果做了一些正确且必要的修改,记得提交到镜像,否则-----你懂的

启动Redis/mq
docker run -itd -v /home/:/mnt --net=host -p 6379:6379 -p 8161:8161 --name redis-mq sino/redis-mq /bin/bash

启动 Zookeeper / kafka
docker run -itd -v /home:/mnt --net=host --name zk-kafka -p 2181:2181 -p 9092:9092 sino/zk-kafka /bin/bash

启动WEB

平台 案件
docker run -itd -p 12080:12080 -p 10080:10080 --net=host -v /home:/mnt --name 12080-10080 sino/web-12080-10080 /bin/bash

SOLR 消息服务
docker run -itd -p 4080:4080 -p 5080:5080 -p 14000:14000 -p 14010:14010 --net=host --name 4080-5080-14000-14010 -v /home:/mnt sino/web-4080-5080-14000-14010 /bin/bash

导侦 非法集资
docker run -itd -p 8989:8989 -p 11180:11180 --net=host --name 8989-11180 -v /home:/mnt sino/web-8989-11180 /bin/bash

分析
docker run -itd -p 7080:7080 -p 11080:11080 -p 13080:13080 --net=host --name 7080-11080-13080 -v /home:/mnt sino/web-7080-11080-13080 /bin/bash

A&Q

  1. 使用网桥模式,已经使用pipework配置了IP,过一段时间之后发现IP不能PING通.
    解决办法:先删除该IP绑定的虚拟网卡.
  1. 使用pipework br0 service-01 192.168.110.30/[email protected] 命令,会提示类似如下结果: Link vth1pl20251 is exists and up .
  2. 使用 ifconfig vth1pl20251 down 下线此设备
  3. 使用 brctl delif br0 vth1pl20251 可删除此设备
  4. 再次使用 pipework br0 service-01 192.168.110.30/[email protected] 绑定IP.
  1. 容器时间和主机时间相差8小时
    解决方案: 使用-v参数挂载主机时间到容器

例: docker run –itd –v /etc/localtime:/etc/localtime IMGID /bin/bash

进容器验证:使用 date命令打出主机和容器的时间进行对比
3. 容器停止一段时间后,不能再启动,提示 IP地址已经被阻塞
使用如下命令释放IP,再启动
calicoctl ipam release –ip=192.168.3.2
附1:Calico for Docker
Calico,一个第三方虚拟网络解决方案,纯三层协议,性能优势明显.
把它用到docker之后,可以实现docker容器跨主机通信,并且是脱离本地网络的方式,以达到在不同网络环境中的镜像不需要任何修改,即可部署应用 .
Calico要与Docker集成,要求Docker运行在集群模式下.
方法:在docker配置文件:/etc/system/system/docker.service.d/docker.conf 中加入以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker_image --cluster-store=etcd://192.168.110.3:2379
注意最后一句话,指定了cluster以 etcd存储.IP地址是本机IP(不是etcd主节点)。修改之后重启Docker: systemctl daemon-reload
Systemctl restart docker
安装 etcd
Etcd,一个键值存储仓库,用于配置共享和服务发现.需要在组成docker集群的所有主机上安装
下载: https://github.com/coreos/etcd/releases/download/v3.2.5/etcd-v3.2.5-linux-amd64.tar.gz
解压到/usr/local : tar –zxvf etcd-v3.2.5-linux-amd64.tar.gz –C /usr/local
进入目录, cd /usr/local/etcd-v3.2.5
权限: chmod 777 *
在集群各节点启动:
nohup ./etcd -name node1 -initial-advertise-peer-urls http://192.168.110.3:2380 -listen-peer-urls http://0.0.0.0:2380 -listen-client-urls http://0.0.0.0:2379,http://127.0.0.1:4001 -advertise-client-urls http://0.0.0.0:2379 -initial-cluster-token etcd-cluster -initial-cluster node1=http://192.168.110.3:2380,node2=http://192.168.110.7:2380 -initial-cluster-state new &
需要注意的几点:

  1. 主机防火墙开端口:2380,2379,上面的命令中,注意修改 –name的值,每个节点名称不一样,这个是后面的initial-cluster所定义的.
  2. 其中的IP地址,换成本地IP,后面的node集群配置,按事前规划的etcd集群机器配置IP和端口.

安装 Calico
下载: http://www.projectcalico.org/builds/calicoctl
复制到 /usr/local/bin : cp calicoctl /usr/local/bin
权限:chmod 777 /usr/local/bin/calicoctl
启动Calico
在Docker环境中Calico服务是做为容器来运行的,使用host的网络配置。所有容器配置使用Calico服务,做为calico节点互相通信。需要下载一个docker的镜像 “quay.io/calico/node”.
这个镜像是必须的,所以,如果是离线环境,要先在docker的在线环境中找到这个镜像并下载,加载到本机的docker环境中去.

  1. 配置:在 /etc下创建目录: calico,并在目录中创建 calicoctl.cfg,输入以下内容:

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
datastoreType: etcdv2
etcdEndpoints: http://192.168.110.3:2379,http://192.168.110.7:2379

其中,最后的etcdEndpoints是etcd集群的节点配置.

  1. 配置:在/etc/calico目录创建 ipPool.yaml 文件.(文件名随意)
    此文件是配置IP池,其中的cidr:192.168.3.0/24,即是要创建的IP池.也就是虚拟网络的IP段,这个配置是可以多个的
    输入以下内容:
    apiVersion: v1
    kind: ipPool
    metadata:
    cidr: 192.168.3.0/24
    spec:
    ipip:
    enabled: false
    nat-outgoing: true
    disabled: false
  2. 运行:
    calicoctl node run --ip=192.168.110.7 --config=/etc/calico/calicoctl.cfg

这会调用docker启动之前下载的那个镜像,参数:IP是本地IP, config 是指定配置文件.
如果这是calico集群的第一个节点启动,则会自动创建一个 192.168.0.0/16的IP池,如果不是第一个节点,则不会创建.
calicoctl node status 可查看当前calico状态.
IPv4 BGP status
±----------------±------------------±------±---------±------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
±----------------±------------------±------±---------±------------+
| 192.168.110.7 | node-to-node mesh | up | 00:08:19 | Established |
±----------------±------------------±------±---------±------------+

IPv6 BGP status
No IPv6 peers found.

这其中的IP不是本地IP,而是calico所连接到的集群中其他主机的IP.
注意里面的 Established 状态,如果不是,则要检查docker和calico的配置文件,尤其是etcd的启动配置,出错则连不上
使用Calico

  1. 添加IP池
    Calicoctl create –f /etc/calico/ipPool.yaml
    查看池: calicoctl get ipPool
  2. 给Docker添加虚拟网络
    上一步添加的IP池,只是在calico中存在,要使用它,还需要在Docker里执行如下命令:

sudo docker network create --driver calico --ipam-driver calico-ipam --subnet 192.168.3.0/24 calico-net1

最后一个是池的名称,一个IP池,可认为是一个可分配IP的IP段
(如果此IP池需要对外访问,需要添加 –nat-outgoing参数,然并卵)
(如果Docker没有使用集群模式,此处会报错)
2)应用IP到容器:
docker run -itd --net=calico-net1 --ip=192.168.3.2 –hostname test02 --name=test02 gas/base_gcc /bin/bash

使用docker的运行命令,并指定 --net=IP池名称,–ip=要分配的IP地址,即可运行启动容器,并且给容器分配好了IP .–hostname 同样重要,通常容器要有主机名,这条命令还会在/etc/hosts文件里加一条主机和IP的映射.SSH命令必备.

猜你喜欢

转载自blog.csdn.net/weixin_43609734/article/details/85127143