1、什么是容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。
隔离的环境拥有自己的系统文件、IP地址、主机名等
系统文件:kvm虚拟机、linux
程序:代码,命令
进程:正在运行的程序
2、容器和虚拟化的区别
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高
kvm虚拟化:需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,需要走开机流程
3、容器技术的发展过程
1):chroot技术,新建一个子系统(拥有自己完整的系统文件)
参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang root
作业1:使用chroot监狱限制SSH用户访问指定目录和使用指定命令
https://linux.cn/article-8313-1.html
ls
2):linux容器(lxc) linux container(namespaces 命名空间 隔离环境 及cgroups 资源限制)
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
kvm虚拟机:资源限制(1c 1G 20G)
##需要使用epel源
#安装epel源
yum install epel-release -y
#编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
##安装lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
##桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
##启动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
方法2:
lxc-create -t centos -n test
#####为lxc容器设置root密码:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd
Changing password for user root.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
##为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
##启动容器
lxc-start -n centos7
3):docker容器
centos7.4 2G 10.0.0.11 docker01 host解析
centos7.4 2G 10.0.0.12 docker02 host解析
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace 资源隔离
cgroups 进程的资源限制
kvm 虚拟磁盘文件,资源隔离
kvm 资源限制,--cpus --memory
docker 初期把lxc二次开发,libcontainer
top
htop
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行
部署服务,环境问题
一次构建,处处运行
docker是一种软件的打包技术
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的系统文件rootfs.
kvm解决了硬件和操作系统之间的依赖
kvm独立的虚拟磁盘,xml配置文件
docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
docker镜像有自己的文件系统。
docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行
4、docker的安装
10.0.0.11:修改主机名和host解析
rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
5、docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,向mysql一样
命令:docker version
docker info(如果要做监控)
docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
6、启动第一个容器
##配置docker镜像加速 vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
docker run -d -p 80:80 nginx
run 创建并运行有个容器
-d 放在后台
-p 端口映射
nginx docker镜像的名字
7、docker的镜像管理
docker search 搜索镜像(优先选择官方的,其次是评分高的)
官方镜像仓库地址:hub.docker.com
docker pull(push) 获取镜像
docker pull centos6.9(官方pull没有指定版本,默认下载最新版本)
docker pull daocloud.io/huangzhichong/alpine-cn:latest (私有仓库)
docker images 或 docker image ls 查看镜像列表
docker rmi 或 docker image rm
例子:docker image rm centos:latest
docker image save centos >docker_centos7.6.tar.gz 导出镜像
docker image load -i docker_centos7.6.tar.gz 导入镜像
8、docker的容器管理
docker run -d -p 80:80 nginx:latest
run 创建并运行一个容器
-d 放在后台
-p 映射端口
docker run -it --name centos6.9 /bin/bash
-it 分配交互式的终端
--name 指定容器的名字
/bin/bash 覆盖容器的初始命令
docker run image_name 启动容器
docker stop CONTAINER_ID 停止容器
docker kill CONTAINER_name 杀死容器
docker rm -f CONTAINER_ID 删除容器
docker rm -f `docker ps -a -q` 批量删除容器
docker ps (-a -l -q) 查看容器列表
docker exec 进入容器(调试、排错)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
9、docker容器的网络访问(端口映射)
-p hostPort:containerPort
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p ip:hostPort:containerPort
多个容器都想使用80端口
-p ip::containerPort
随机端口
-p hostPort:containerPort:udp
-p 10.0.0.100::53:udp 使用宿主机的10.0.0.100的这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 80:80 -p 443:443 可以指定多个p
docker run -P 随机端口
通过iptables 来实现端口映射