docker容器
什么是容器
Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像运行,并由该镜像提供支持进程所需的全部文件(环境文件)。
Linux容器就是一个隔离的空间中,运行的进程,这个隔离的空间有着自己的根文件系统,自己的网络,主机名等.
容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。 来源:https://www.redhat.com/zh/topics/containers/whats-a-linux-container
容器是否是虚拟机?
虚拟化是让许多操作系统同时在一个系统上运行. 容器只能共享操作系统内核,将应用进程与系统其他部分隔离开.
"Linux容器需要内核支持 namespace和cgroup" namespace为容器提供空间隔离 cgroup容器提供硬件资源限制
容器与虚拟化的区别
Linux容器技术与kvm虚拟化技术的区别? kvm: kvm和VMware类似,需要模拟硬件,可以运行不同操作系统,启动时间为 "分钟级别" 容器虚拟化: 不需要硬件支持,不需要模拟硬件,公用宿主机内核. 没有开机启动流程.秒级启动.
总结:
- docker与宿主机共用一个内核,性能损耗小.
- 容器可以在CPU核心的本地运行命令,不需要任何专门的解释机制
- 不需要指令级的模拟.
- 避免了准虚拟化和系统调用,替换的复杂性.
- 轻量级的隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享.
容器的发展过程
cgoup安装, 体验早期容器.
参考资料: https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
cgoup下载链接:https://pan.baidu.com/s/1t0FGEpGkTEf-gT-k-NWatQ 提取码:o70l
上传 rootfs.tar.xz 到 /opt 目录
[root@node1 opt]# ls
rootfs.tar.xz
解压到 /opt/rootfs/ 目录
[root@node1 opt]# tar xf rootfs.tar.xz -C /opt/rootfs/
进入这个rootfs系统:
[root@node1 opt]# chroot /opt/rootfs
root@node1:/# <-- 这样就进入了这个chroot系统
进入系统后发现命令会不可用
[root@node1 opt]# chroot /opt/rootfs
root@node1:/# ls
bash: ls: command not found
原因: 没有环境变量
rootfs添加环境变量:
export PATH='/bin:/usr/local/sbin:/us/local/bin:/usr/sbin:/usr/bin:/root/bin'
再次测试命令可用性:
root@node1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
命令已经可用了
rootfs现容器上网配置:
lxc默认hosts文件没有解析,所以需要上网的话,只要添加dns服务
但是你通过 ls -al 会发现这是一个 link 文件.
删除link文件,重新创建一个/etc/resolv.conf 文件,并添加dns
nameserver 223.5.5.5
结果:
root@node1:/# cat /etc/resolv.conf
nameserver 223.5.5.5 ### 这是文件里的内容
测试:
root@node1:/# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79: icmp_seq=1 ttl=50 time=8.86 ms ## 网络正常
lxc容器
linux容器(lxc) linux container(namespaces 网络命名空间 隔离环境 及cgroups 资源限制)
lxc安装需要epel源的支持,需要添加epel源
yum install epel-release.noarch -y wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
lxc安装
##安装lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
lxc启动
systemctl start lxc
systemctl status lxc cgconfig
lxc 桥接网卡
##桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.0.200
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=223.5.5.5
##修改lxc默认配置,注意噢 这里的网段,如果你是在阿里云配置的,需要指定当前网段网关
##不要随便指定,不知道就去看一下,不然配置错了就无法连接到服务器了,此时就要登录阿里云后台配置
vi /etc/lxc/default.conf
修改第2行为:lxc.network.link = br0
##启动cgroup
systemctl start cgconfig.service
##启动lxc
systemctl start lxc.service
创建lxc容器
方法1. 从网上下载
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
lxc-create -t download -n centos7 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 7 -a amd64
方法2(重点) test名字可以随意取:
lxc-create -t centos -n test
lxc-create -t centos -n test1
这样创建后,会一步一步询问.
注意第一次启动会下载容器运行的镜像和配置
下载lxc容器包
lxc源地址: https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/ubuntu/trusty/amd64/default/ 用于下载rootfs.tar.xz
[root@node1_docker opt]# cd /opt #rootfs.tar.xz包上传到这里
[root@node1_docker opt]# ls
rootfs rootfs.tar.xz
解压包:
[root@node1_docker opt]# mkdir ubuntu
[root@node1_docker opt]# tar xf rootfs.tar.xz -C ubuntu/
检查:
[root@node1_docker opt]# cd ubuntu/
[root@node1_docker ubuntu]# pwd
/opt/ubuntu
[root@node1_docker ubuntu]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
#注意: rootfs是一个独立的精简版Linux系统.
使用lxc容器
进入rootfs系统: chroot /opt/ubuntu/
[root@node1_docker ubuntu]# chroot /opt/ubuntu/
root@node1_docker:/#
默认没有配置环境变量,无法使用命令,所以需要配置环境变量
export PATH='/bin:/usr/local/sbin:/us/local/bin:/usr/sbin:/usr/bin:/root/bin'
不配置无法使用命令
网络配置:
进入后,没有网络,实际上是没有dns,所以需要配置dns
但是这里有个坑, 你会发现 /etc/resolv.conf 是一个软连接文件.
root@node1_docker:/# ll -la /etc/resolv.conf
lrwxrwxrwx 1 root root 29 Aug 20 2018 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
发生这个错误,解决办法:
1. 删除: rm -f /etc/resolv.conf
2. 创建: touch /etc/resolv.conf
3. 配置: vim /etc/resolv.conf
4. 写入内容:
nameserver 223.5.5.5
5. 保存后尝试ping 一个IP或者网站看看,这时网络已经通了
root@node1_docker:/# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79: icmp_seq=1 ttl=50 time=8.84 ms
64 bytes from 39.156.69.79: icmp_seq=2 ttl=50 time=8.73 ms
此时lxc容器已经可以正常访问网络了
阿里云配置lxc注意:
阿里云需要配置 br0 要指定当前创建的网段 网关地址 我当时配置的是 192.168.0.0网段,但是我配置的IP 是10.0.0.x网段.所以我配置完成后,网络无法出去 因此我也无法连接到阿里云服务器了. 这是一个坑... 需要注意
lxc容器密码配置
chroot /var/lib/lxc/centos6/rootfs passwd
lxc容器进入:
[root@node1_docker ubuntu]# lxc-create -t centos -n 6
或者:
lxc-start -n centos7
这一步会自动下载一个centos6容器进行安装并启动,
lxc运行镜像后设置密码
配置完成后设置密码:
chroot /var/lib/lxc/6/rootfs passwd
启动容器进入:
#进去了就无法退出了.这种形式进去.
[root@node1_docker ubuntu]# lxc-start -n centos -n 6
停止容器
[root@node1_docker ubuntu]# lxc-stop -n centos6
kill -9 [ID]
怎么正常停止 lxc 容器???
lxc到此为止...


发表评论