docker是一个lxc升级版的容器类虚拟环境,具有快速部署,灵活,易迁移的虚拟机模式,现在各大公司已经开始广泛使用
为了自己方便学习linux,需要多台虚拟机环境,但是vmware开启多台虚拟机时需要花费大量内存,所以研究了一下docker,操作方便,真的很好用
发现好多文章都是使用ubuntu的,但是在真实环境中,使用centos居多(国内形势。。。。。。)

使用环境:Centos6.8 x64

1.安装eprl
  yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.禁用selinux
  vim /etc/sysconfig/selinux
  SELINUX=disabled
  setenforce 0
3.检查内核是否符合标准
  uname -r
  2.6.32-431.el6.x86_64 内核最低标准
4.安装docker-io
  yum -y install docker-io
5.启动docker
  service docker start
  查看是否有docker接口
  4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
  link/ether 66:b2:39:4c:25:46 brd ff:ff:ff:ff:ff:ff
  inet 172.17.42.1/16 scope global docker0
  inet6 fe80::64b2:39ff:fe4c:2546/64 scope link
  valid_lft forever preferred_lft forever
6.创建容器,因为以前都是使用的openvz,就尝试导入,发现可以使用(现在网上都是别人修改过的容器,并不是自己想要的,想要一个干净的环境)  

  我选用的是centos-6-x86_64-devel.tar.gz,这个包含编译需要的环境,方便编译安装需要的工具
  导入容器
  cat centos-6-x86_64-devel.tar.gz | docker import - centos:v1.0
  查看镜像是否导入
  docker images
  这个环境是干净环境,没有服务,所以需要自己去定制服务(docker在定制方面很灵活,好多地方以后好好研究)
  定制自己的环境(我的环境只启用了ssh服务,能登录即可)
  docker run -h test -it centos:v1.0 /bin/bash 创建虚拟机,并登录

  在root目录下增加文件run,加入如下内容
  #!/bin/bash
  service sshd restart
  /bin/bash

  这个时候启动ssh是无法登录的,修改/etc/ssh/sshd_config

  UsePAM no   修改yes为no

  同时设置root密码,docker默认是没有root密码的

  passwd  root

  然后退出,exit,这个时候容器会停止关闭
  这个时候我们的容器就定制好了,现在保存容器到image中以后使用
  docker commit test centos:latest
  docker images 查看是否多了一个centos latest的镜像

  上面已经定制好了自己的镜像,这个时候就可以创建自己的容器了
  docker run -h node1 --name=node1 --ulimit nofile=65535:655350 -m 512M --memory-swap=1024M --net=none -d -it centos:latest /root/run
  这个时候容器就已经启动,但是不符合我的环境
  -h 主机名
  --name 给容器定义名字
  -ulimit 配置ulimit,当容器启动后就无法更改
  -m 分配内存
  --net=none 不使用docker网络,如果不配置会docker会自动分配ip地址给容器,但是每次重启后ip地址会改变,导致不符合我的环境,也可以用-p把端口映射出去,这样 端口不会改变,使用端口即可,但是正如我所说,不符合我的环境要求,后面采用脚本控制命名空间给容器配置静态ip

7.使用脚本控制所有

  1. .创建网桥接口br0
  2. brctl addbr br0
  3. brctl addif br0 eth0
  4.  
  5. .创建容器脚本create_container.pl
  6. #!/usr/bin/perl
  7. use strict;
  8. use warnings;
  9. my $num;
  10. my $name;
  11. print "input images name[default->centos]: ";
  12. chomp(my $c_img=<STDIN>);
  13. unless ($c_img) {$c_img='centos'};
  14. print "input container name: ";
  15. chomp($name=<STDIN>);
  16. $num=substr($name,-);
  17. my $cmd = "docker run -h $name --name=$name --ulimit nofile=65535:655350 -m 512M --memory-swap=1024M --net=none -d -it $c_img /root/run"; #该行是创建命令,可自己根据要求修改
  18. system($cmd);
  19.  
  20. .配置容器为静态ip地址脚本start_container.pl,该脚本修改后可用ln建立软链接到bin目录下,方便以后调用
  21. 需要添加目录mkdir -pv /var/run/netns/
  22. 调用方法: ./start_container.pl node1 后面需要跟容器名,
  23. #!/usr/bin/perl
  24. use strict;
  25. use warnings;
  26. my $num = @ARGV;
  27. if ($num == ) {
  28. print "error\n";
  29. exit;
  30. }
  31. (my $hostname) = @ARGV;
  32. system("docker start $hostname");
  33. my @host_info;
  34. for (<DATA>){
  35. if (/^$hostname/) {
  36. @host_info = split('=',$_);
  37. }
  38. }
  39. ($hostname,my $ip) = @host_info;
  40. chomp($ip);
  41. my $pid = readpipe("docker inspect -f '{{.State.Pid}}' $hostname");
  42. chomp($pid);
  43. system("ln -sf /proc/$pid/ns/net /var/run/netns/$pid");
  44. system("ip link add neto_$hostname type veth peer name neti_$hostname");
  45. system("brctl addif br0 neto_$hostname");
  46. system("ip link set neto_$hostname up");
  47. system("ip link set neti_$hostname netns $pid");
  48. system("ip netns exec $pid ip link set dev neti_$hostname name eth0");
  49. system("ip netns exec $pid ip link set eth0 up");
  50. system("ip netns exec $pid ip addr add $ip/24 dev eth0"); #这里为虚拟机添加ip,如果是别的掩码,可以自行修改
  51. system("ip netns exec $pid ip route add default via 192.168.89.2"); #这里调用shell,如果网关ip是别的,可以自行修改
  52.  
  53. __DATA__
  54. node1=192.168.89.11
  55. node2=192.168.89.12
  56. node3=192.168.89.13
  57. node4=192.168.89.14
  58. node5=192.168.89.15
  59. node6=192.168.89.16
  60. #脚本会根据__DATA__下面的配置设置ip,前面是容器名--name定义的,后面=,在后面是ip地址,格式是必须严格按照样例配置,
  61. #如果懂perl,可以自行修改

docker学习笔记一:基本安装和设置容器静态ip的更多相关文章

  1. DOCKER 学习笔记9 Kubernetes (K8s) 弹性伸缩容器 下

    前言 从上一篇看来,我们已经对于Kubernetes ,通过minikube 建立集群,而后使用kubectl 进行交互,对Deployment 部署以及服务的暴露等.这节,将学习弹性的将服务部署到多 ...

  2. Docker学习笔记之创建安装了nginx服务器的镜像

    操作步骤: 1. 编辑Dockerfile 2. 使用build命令创建镜像 3. 使用run命令测试创建的镜像 编辑Dockerfile 首先,需要使用文本编辑器编辑Dockerfile文件(注意没 ...

  3. docker学习笔记1-- 用Toolbox安装Docker--介绍Docker Machine

    使用的是Docker Toolbox,非Docker for Windows 一.docker的认识与安装(windows安装) http://blog.csdn.net/tina_ttl/artic ...

  4. DOCKER 学习笔记9 Kubernetes (K8s) 生产级容器编排 上

    前言 在上一节的学习中.我们已经可以通过最基本的 Docker Swarm 创建集群,然后在集群里面加入我们需要运行的任务 以及任务的数量 这样我们就创建了一个服务. 当然,这样的方式在我们本地虚拟机 ...

  5. docker学习笔记:修改无法启动的容器中的内容

    我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题.导致容器关闭后,无法启动. 这事需要重新修改配置文件. 正常情况下可以通过 docker exe ...

  6. Docker学习笔记之浅谈虚拟化和容器技术

    0x00 概述 相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识. ...

  7. Docker学习笔记_创建和使用Centos容器

    实验:创建和使用Centos容器 步骤: 1.搜索                                                     sudo docker search cen ...

  8. docker学习笔记-1

    docker学习笔记一:安装 mac安装docker docker官方文档上有这么一段话: Because the Docker daemon uses Linux-specific kernel f ...

  9. docker学习笔记(一)—— ubuntu16.04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

随机推荐

  1. 问题: ActivityManager: Warning: Activity not started, its current task has been brought to the front

    运行程序时看控制台有这样的错误,应用程序没跑起来. 解决办法:project-->Clean

  2. Selenium2+python自动化11-定位一组元素find_elements

    前言 前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象. webdriver 提供了定位一组元素的方法,跟前面八种定位方式 ...

  3. background-orgin属性

    重点内容是:背景的显示范围是在元素的内边距之内的,如果要想改变显示范围,可以使用background-orgin和background-clip进行调整. (1)background-orgin有三个 ...

  4. VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)

    最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:ArcGIS9.3,ArcEngine9.3,Oracle10g,Ar ...

  5. Maven重复类的解决

    1. 设置仓库,我的Settings里设置使用了公司的Nexus <?xml version="1.0"?> <settings xmlns="http ...

  6. 对象转型 casting

    一个基类的引用类型变量可以"指向"其子类对象. 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法). 基类强制转型成子类,则能访问子类独有的成员. 可以使用 引用变量in ...

  7. unreal3脚本stacktrace的问题

    在unrealscript里获取调用栈,有下面两函数: /** * Dumps the current script function stack to the log file, useful * ...

  8. try catch finally return之间的关系

    一.try catch finally return之间的关系: 正在写dsoFramer的时候,同事突然说面试的时候问的一个问题,catch和return那个先执行,我瞬间迷茫了,然后整理了整理,稍 ...

  9. cocos2d-x源码分析(1)

    class CC_DLL CCCopying { public: virtual CCObject* copyWithZone(CCZone* pZone); }; class CC_DLL CCZo ...

  10. java项目@override报错问题

    有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...