1、docker环境搭建,windows、linux、mac这几个主流系统都支持docker环境,这里是指linux环境搭建docker环境;几行命令即可搞定!

uname -r  # 查看linux内核,是否支持docker安装

yum update # 更新 yum 包

yum install -y yum-utils device-mapper-persistent-data lvm2 #yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 设置yum源

yum list docker-ce --showduplicates | sort -r # 查看所有仓库中所有docker版本

yum install docker-ce-17.12.0.ce # 选择版本安装 docker-ce 是系统版本前x86_64的服务,17.12.0.ce是版本

docker sonarqube 实例 运行_docker服务

systemctl start docker # 启动docker

systemctl enable docker # 设置开机自启

docker version # 检查docker是否安装成功 ,有client及server两部分

systemctl status docker #查看docker启动状态

yum list installed | grep docker # 查看docker服务安装过的包

yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y # 删除安装包

rm -rf /var/lib/docker # 删除默认镜像目录

2、docker的常用命令:

docker ps -a # -a 参数 查看所有容器信息、-q 列出所有容器id、-s 查看列出容器使用大小

docker exec -it 容器ID /bin/sh # 进入容器

docker cp # 支持容器与宿主机拷贝文件

docker (stop/start/restart/rm) 容器ID_Name # 操作容器

docker images # 列出所有镜像

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

docker search 服务 # 查找镜像服务

docker pull 服务 # 拉取镜像

docker push 服务 仓库名 # 推送镜像名称

docker run # 启动容器

docker logs 容器ID_name # 查看容器日志 --tail=num 可以指定行数输出

docker login # --username=xxx --password=xxx 登录镜像仓库

docker --help # 帮助文档 可以每一个命令--help查看帮助文档,例如:docker images --help

3、从docker环境搭建到常用基本命令的使用(可以在--help获取),在日常docker部署服务的测试环境正常工作了,但是不排除例外,这些都好说;

例如:docker run 启动容器的参数 -v 、-e、--add-host、-p等参数的应用,

4、单机的docker环境比较容易玩转<目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病!>,那么出现多宿主机的时候呢?第一个问题就是不同宿主机docker容器之间的通讯问题如何解决?需要了解一定的网络知识及docker网桥的概念!

docker sonarqube 实例 运行_docker服务_02

方案原理分析:由于需要使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的docker子网来保证;

描述一下不同宿主机容器之间的数据通讯是如何完成的!

A宿主机的container容器A先是发向容器A的网关docker0,然后在查找A宿主机ip的路由需要发给B宿主机,B宿主机收到数据后再转发到容器B的网关docker0;最后数据才发送到容器B内。

实现操作:

A宿主机编辑/etc/docker/daemon.json 添加"bip":"ip/netmask",例:{"bip":"172.17.1.1/24"} 因为不同宿主机docker0网桥的ip是一样的,为了解决不同宿主机容器通讯需要设置不同docker0网桥的ip地址。

然后重启docker:systemctl restart docker

同理:B宿主机编辑/etc/docker/daemon.json 添加{"bip":"172.17.2.1/24"},重启docker得到docker0网桥的ip为:172.17.2.1

接下来为每个宿主机添加路由规则

A宿主机:ip route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129 # 172.17.2.0为B宿主机docker0网桥的网段,192.168.145.129为B宿主机的ip作为路由的规则

B宿主机:ip route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128 # 172.17.1.0为A宿主机docker0网桥的网段,192.168.145.128为A宿主机的ip作为路由的规则

配置iptalbes规则:

iptables -t nat -F POSTROUTING iptables -t nat -A POSTROUTING

&&

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -F 去掉防火墙的规则

重启容器,然后各宿主机之间互ping,不同宿主机的容器之间互ping都能保证正常通讯;iptables -t nat -vnL 可以查看各宿主机容器的端口转发规则

tips:如果有多台宿主机需要容器之间通讯呢?那么只能将需要通讯的服务器之间搭网桥即可

5、上面是实现了不同宿主机容器通讯的问题,是采用docker其中一种网络模式叫做bridge<默认模式>,那么还有三种网络模式:host模式、container模式、none模式,其中区别可能需要去查看专业的书籍深入理解各个网络模式的优劣!

6、问题:第四点关于解决不同宿主机之间docker容器如何通讯的解决方案,只是临时的?init 6重启linux服务器之后,路由消失,不同宿主机docker容器之间的桥梁不见了,也就无法通讯,接下来如何解决呢?

网络方案一堆,我就不一一试验了,选择了其中一种简单的方式,就是将需要添加的路由规则写入文件,每次启动系统会默认从网卡中加载:/etc/init.d/network

同时在/etc/sysconfig路径下需要创建static-routes文件,写入如下内容:

any net 172.17.1.0 netmask 255.255.255.0 gw 192.168.2.211

分析/etc/init.d/network工作原理有一段内容如下:

 # Add noninterface-specific static-routes.

            if [ -f /etc/sysconfig/static-routes ]; then

              grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do

                /sbin/route add -$args

              done

            fi

解释一下这段: grep "^any" /etc/sysconfig/static-routes # 匹配找到这段any开头的行,| while read ignore args 并忽略第一个参数读取后面的内容;然后循环添加路由规则。

7、这下不用担心会重启路由失效了,因为是物理机必须要考虑关机的状态。docker了解并不是很深入,借此抛出几个问题?

  • a>如何制作Dockerfile,首行From的意义?
  • b>运行docker镜像,容器里的环境与当前容器运行的系统是否有关?
  • c>docker网桥及通信原理?

**日拱一卒无有尽,功不唐捐终入海!**