docker

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配置文件