docker容器虚拟化平台
1.什么是容器
容器就是在隔离的环境运行的一个过程,如果过程进行,容器就会销毁.隔离的环境领有本人的系统文件,ip地址,主机名等
系统文件:kvm虚拟机,linux,系统文件
程序:代码,命令
过程:正在运行的程序,代码运行起来的时候就是一个过程
2.容器和虚拟化的区别
Linux容器技术:.容器虚拟化和kvm虚拟化的区别
kvm虚拟化:须要硬件的反对,须要模仿硬件,能够运行不同的操作系统,启动分钟级(开机启动流程)
1)Linux开机启动流程
bios开机自检
依据bios设置的优先启动项u盘 boot 网卡 硬盘 光驱
读取mbr疏导2T UEFI(gpt分区) mbr硬盘分区信息,内核加载门路
加载内核
启动第一个过程/sbin/init systemd
零碎初始化实现
运行服务
……
2)容器启动流程
容器共用宿主机内核
第一个过程,服务nginx,httpd,mysql 过程号为1
容器:共用宿主机内核.容器的第一个过程间接运行服务,轻量级..损耗少,启动块,x性能高
虚拟机:须要硬件反对,须要模仿硬件,须要走开机流程,能够运行不同的操作系统
3.容器技术的倒退历史
1)chroot技术,新建一个子系统(领有本人残缺的系统文件)
CHROOT就是Change Root,也就是扭转程序执行时所参考的根目录地位。CHROOT能够增进零碎的安全性,限度使用者能做的事。
wget https://mirrors.tuna.tsinghua...
chroot /opt/
作业一:应用chroot监狱限度ssh用户拜访指定目录和应用指定命令
2)linux容器(lxc)linux container(namespaces 命名空间 隔离环境 及cgroups 资源限度)
cgroups限度一个过程可能应用的资源cpu 内存 硬盘io
namespaces 资源隔离
kvm虚拟机资源限度(1c 1G 20G)
装置lxc
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
3)docker容器
10.0.0.11 docker01 host解析
10.0.0.12 docker02 host 解析
Docker是通过过程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与平安保障等.因为Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不须要相似虚拟机(vm)额定的操作系统开销,进步资源利用率
namespace资源隔离
cgroups 过程的资源限度
kvm 虚构磁盘文件,资源隔离 qemu-img create test.raw 10G
kvm 资源限度,--cpus –memory
docker 初期把lxc二次开发,libcontainer
docker 进行资源隔离的6种namespace
docker最佳的运行环境是centos7 3.10
centos6 2.6
docker在起初做了centos的docker
4)docker和lxc的关系
在2013年Docker刚公布的时候,它是一款基于LXC的开源容器治理引擎。把LXC简单的容器创立与应用形式简化为Docker本人的一套命令体系。随着Docker的一直倒退,它开始有了更为远大的指标,那就是反向定义容器的实现规范,将底层实现都抽象化到Libcontainer的接口。这就意味着,底层容器的实现形式变成了一种可变的计划,无论是应用namespace、cgroups技术抑或是应用systemd等其余计划,只有实现了Libcontainer定义的一组接口,Docker都能够运行。这也为Docker实现全面的跨平台带来了可能。
(1)Docker并不是LXC的替代品,Docker的底层就是应用了LXC来实现的。LXC将Linux过程沙盒化,使得过程之间互相隔离,并且可能管制各过程的资源分配。
(2)在LXC的根底之上,Docker提供了一系列更强的性能。
4.部署docker容器化平台
4.1 yum源装置
1)配置yum源
yum install -y yum-utils device-mapper-persistent-data lvm2 #yum管理工具
yum-config-manager --add-repo http://mirrors.aliyun.com/doc... #增加阿里源
yum-config-manager --add-repo https://download.docker.com/l... #增加官网源
2)列出docker-ce可装置的版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-19.03.9-3.el7 #装置1903版本
systemctl start docker #启动docker
systemctl enable docker #退出开机自启动
4.2本地rpm包装置
下载地址https://download.docker.com/l...
注:如果装置的是17版本要下载docker-ce-selinux下载
5.docker架构
docker是传统的c/s架构,有docker clinet和docker server端组成
[root@docker01 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.6
API version: 1.41
Go version: go1.13.15
Git commit: 370c289
Built: Fri Apr 9 22:45:33 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:43:57 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@docker01 ~]# docker system info/docker info #docker的后盾信息,Zabbix取值能够在这里
docker次要组件有:镜像、容器、仓库、网络、存储
docker 容器必须须要一个镜像,仓库中只存储镜像
容器—镜像—仓库
6.docker初始体验
咱们传统nginx搭建nginx要有以下步骤
1)下载压缩包
2)解压
3)创立启动用户,装置依赖
4)编译装置
而咱们docker只须要执行一条命令
docker run –name nginx -d -p 80:80 nginx
Options
Mean
-i
以交互模式运行容器,通常与 -t 同时应用;
-t
为容器重新分配一个伪输出终端,通常与 -i 同时应用;
-d
后盾运行容器,并返回容器ID;
7.docker镜像治理
7.1.搜寻镜像
docker search 搜寻镜像
只有一个名称,没有/宰割代表他是官网镜像
抉择镜像倡议:
1.)官网
2)stars数量多
官网仓库hub.docker.com
7.2.获取镜像
docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker中国官网镜像减速https://registry.docker-cn.com
docker pull centos6.8(没有指定版本,默认会下载最新版本)
配置减速:阿里云
7.3查看镜像命令
docker images
docker image ls
7.4删除镜像
docker rmi
docker image rm
7.5导出镜像
docker save
docker image save > /opt/nginx.tar.gz nginx
docker image save -o /opt/nginx.tar.gz nginx
7.6导入镜像
docker load
docker image load -I /opt/nginx.tar.gz
docker image load < /opt/nginx.tar.gz
7.7镜像改名
docker image tag nginx:latest wakuang:latest
8.容器治理
8.1启动一个容器
docker run
docker container run –name centos -it /bin/bash
-it 调配一个交互式终端,启动容器,并进入 到这个容器里
-d 是指后盾启动
8.2查问容器
docker ps -a
docker container ls -a
-a 显示所有
-q 只显示id,通常状况下在批量删除时候应用
-l 只显示最新创立的容器
--no-trunc 长格局显示所有信息
8.3进行容器
docker stop Id
docker container stop ID
docker kill container_name/ID
8.4启动容器
docker start container_n ame/ID
docker container start container_name/ID
8.5进入容器
docker exec -it container_name/ID /bin/bash
docker container exec -it container_name/ID /bin/bash
docker attach #弃用
nsenter #须要装置一个软件包
8.6删除容器
docker rm -f container_name/ID
docker container rm -f container_name/ID
-f 强制删除,能够删除启动中的容器
8.7容器重命名
docker rename old_container_name new_container_name
列子: docker container rename nginx nginx01
9.docker容器的网络拜访(端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-P 指定监听所有IP的随机端口映射到容器的端口
-p ip::configtainerPort
-p hostPort:containerPort:udp
-p 10.0.0.10::53/udp
-p 81:89 -p 443:443
iptables -l nat -L -n
sysctl -a | grep ipv4 | grep rang
net.ipv4.ip_local_port_range = 32768 60999 一个端口池
10.docker存储卷治理
docker volume 卷治理命令
10.1挂载目录卷
docker run --name nginx -d -p 80:80 -v /html:/usr/share/nginx/html nginx:latest
10.2 挂载卷名
docker volume create test
默认生成到/var/docker/volumes卷的ID名中
docker run -v test:/usr/share/nginx/html -d -p 80:80 nginx #如果没有卷会创立
10.3多网站
[root@docker01 ~]# cat /data/blog.conf
server{
listen 81;
server_name localhost;
location / {
root /data;index index.html;
}
}
[root@docker01 ~]# cat /html/index.html
<HTML>
<H1>1</H1>
</HTML>
docker run --name nginx -it -p 80:80 -p 81:81 -v /data/blog.conf:/etc/nginx/conf.d/blog.conf -v /html/:/data nginx
10.4容器卷
第一个日志,
网站配置
conf.d
站点
docker run --name test-volumes --volumes-from nginx
docker restart #
11.前台守护过程
docker容器必须有一个前台守护过程,比方tail -f 就会始终不退出在前台,如果没有就会间接退出容器
tail -f
sshd -D
nginx -g “daemon off”
运行的命令,不退出,会在前台运行这个过程
-d 的前提也是有一个前台守护过程
12.容器做成镜像
将容器制作镜像
docker commit ID/container_name new_containername[:版本号]
-a :提交的镜像作者;
-c :应用Dockerfile指令来创立镜像;
-m :提交时的阐明文字;
-p :在commit时,将容器暂停。
12.1制作单服务镜像
1)启动制作零碎并装置服务
docker run --name centos6.9 -it centos:centos6.9
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-...
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456 | passwd --stdin root
制作sshd镜像必须要先在制作实现之后启动一下sshd因为他会生成一些文件
2)讲容器制作成镜像
docker container commit ID/containername centos6:v1
3)测试
docker run --name test1 -d -p 1022:22 centos6.9:v1 /usr/sbin/sshd -D
12.2制作多服务镜像
1)启动制作零碎并装置服务
docker run --name test -it centos:centos6.9
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://file.kangle.odata.cc/r...
curl -o /etc/yum.repos.d/epel.repo http://file.kangle.odata.cc/r...
yum install openssh-server nginx -y
/etc/init.d/sshd start
echo 123456 | passwd --stdin root
2)讲容器制作成镜像
docker container commit ID/containername centos6:v2
3)测试
docker run --name test1 -d -p 80:80 -p 1022:22 centos:v4 su -s /bin/bash -c "/etc/init.d/sshd start;nginx -g 'daemon off;'" root
12.3写脚本制作镜像简洁docker命令
/bin/bash
/etc/init.d/sshd start
/usr/sbin/nginx -g "daemon off;"
docker run -d -p 1025:22 -p 88:80 centos:v7 /bin/bash /init.sh
12.4搭建lnmp环境
yum install php-fpm php-mbstring php-gd nginx -y
作业一:搭建一个lnmp容器
13.dockerfile主动构建镜像
13,1意识dockerfile指令
相似于ansibleplaybook剧本,大小几kb
手动做镜像:大小几百M+
docker image history
写之前先手动装置一遍
1.FROM
格局为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创立多个镜像时,能够应用多个FROM指令。
2.MAINTAINER
格局为MAINTAINER user_name user_email,指定维护者信息
LABEL:
代替MAINTAINER
3.RUN
格局为RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";后者应用exec执行,指定其余运行终端应用RUN["/bin/bash","-c","echo hello"],在一个dockerfile中只能呈现一个CMD
4.CMD
反对三种格局:
CMD ["executable","param1","param2"],应用exec执行,这是举荐的形式。
CMD command param1 param2 在/bin/sh中执行。
CMD ["param1","param2"] 提供给ENTERYPOINT的默认参数。
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最初一个。若容器启动时指定了运行的命令,则会笼罩掉CMD中指定的命令。
5.EXPOSE
格局为 EXPOSE port [port2,port3,...],例如EXPOSE 80这条指令通知Docker服务器裸露80端口,供容器内部连贯应用。
在启动容器的应用应用-P,Docker会主动调配一个端口和转发指定的端口,应用-p能够具体指定应用哪个本地的端口来映射对外开放的端口。
6.ENV
格局为:EVN key value 。用于指定环境变量,这些环境变量,后续能够被RUN指令应用,容器运行起来之后,也能够在容器中获取这些环境变量。
例如
ENV word hello
RUN echo $word
7.ADD
格局:ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src能够是是一个绝对路径,也能够是一个URL或一个tar文件,tar文件会主动解压为目录。
8.COPY
格局为:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会主动创立。
9.ENTRYPOINT
格局有两种:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数笼罩。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最初一个失效。
10.VOLUME
格局为 VOLUME ["/data"]
作用是创立在本地主机或其余容器能够挂载的数据卷,用来存放数据。
11.USER
格局为:USER username
指定容器运行时的用户名或UID,后续的RUN也会应用指定的用户。要长期应用管理员权限能够应用sudo。在USER命令之前能够应用RUN命令创立须要的用户。
例如:RUN groupadd -r docker && useradd -r -g docker docker
12.WORKDIR
格局: WORKDIR /path
为后续的RUN CMD ENTRYPOINT指定配置工作目录,能够应用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定门路。
13.ONBUILD
格局ONBUILD [INSTRUCTION]
该配置指定当所创立的镜像作为其余新建镜像的根底镜像时所执行的指令。
例如上面的Dockerfile创立了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
则基于镜像A创立新的镜像时,新的Dockerfile中应用from A 指定基镜像时,会主动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中减少了两条指令:
FROM A
ADD ./app
RUN python app.py
14.docker build
创立好Dockerfile之后,通过docker build命令来创立镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常倡议搁置Dockerfile的目录为空目录。另外能够在目录下创立.dockerignore文件,让Docker疏忽门路下的文件和目录,这一点与Git中的配置很类似。
通过 -t 指定镜像的标签信息,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的门路
13.2dockerfile构建一个上一个sshd镜像
FROM centos:centos6.9
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-...
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456 | passwd --stdin root
docker run -d ssh:v1 /usr/sbin/sshd -D
13.3排除文件.dockerignore
vim .dockeriginre
13.4构建nginx配置文件