zwt00 2020-07-05
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1. 传统服务部署,维护相对繁琐。 2. 资源利用存在浪费 3. 扩容、缩容不够及时 4. 服务器迁移,维护相对繁琐 5. 集群环境一致性差 6. 无法应用突发流量 7. 弹性伸缩 docker的出现能够改善以上问题。
1. docker是一个开源的容器引擎 2. 一个操作系统级的虚拟化技术 3. 依赖于系统内核的特性,实现: 1. namespace{资源隔离} 2. cgroup{资源限制} 4. docker也是一个简单的应用程序打包工具。可以将程序封装好,通过docker自身的导出导入能力为迁移提供保障 5. 多环境一致性。docker的出现,从根本解决了环境一致性问题,它能够将环境必备的程序打包到一个容器中,提供他人使用
VM: 硬件-->操作系统-->虚拟机管理程序-->虚拟机-->操作系统-->服务程序 docker: 硬件-->操作系统-->docker-->服务程序
1. 应用程序打包[能够保证所打包的程序在另一个docker环境中完美运行] 2. 应用程序隔离 3. 持续集成 4. 部署微服务 5. 快速搭建一个测试环境 6. 提供平台及服务
1. yum安装 #源添加 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum clean all yum install -y bash-completion.noarch # 安装指定版版本 yum -y install docker-ce-18.09.9-3.el7 #也可以查看版本安装 yum list docker-ce --showduplicates | sort -r #启动docker systemctl enable docker systemctl start docker systemctl status docker 2. 离线版安装 #官方下载docker https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz #个人网站下载: https://www.chenleilei.net/soft/docker/docker-19.03.9.tgz tar zxvf docker-19.03.9.tgz mv docker/* /usr/bin #加入systemd #-------------------------------------------------------- cat > /usr/lib/systemd/system/docker.service << EOF [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF #-------------------------------------------------------- #创建配置文件 mkdir /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF #个人docker源: #这个是阿里云配置的加速,直接添加阿里云加速源就可以了,上面显示了配置办法。 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors #设置开机启动和启动即可 systemctl enable docker systemctl start docker
镜像是一个分层存储的文件,不是一个单一文件
一个软件环境
一个镜像可以创建多个容器
一个标准化的交付概念
一个不包含Linux欸和且精简的Linux操作系统
# 查看命令: docker ps #查看已运行中的容器 docker ps -a #查看所有容器 docker history [容器ID] #查看容器层级 docker image ls #列出镜像,等同于 docker images docker build #使用dockerfile构建镜像 如:docker build -t nginx-test-v001 -f dockerfile-nginx . docker inspect [容器ID] #查看一个容器的详细信息。 #容器删除 docker rm [容器id] #删除容器 docker rmi [容器id] #删除容器同时删除镜像 # 运行命令: docker run #运行一个容器 -d #后台运行,然后返回该容器ID -t #分配一个tty终端 -i #以交互模式运行容器,通常与 -t 同时使用 # 清除镜像 docker image prune #移除没有使用得镜像,并提示 docker image prune -a #移除所有没有被使用的镜像 # 推送镜像 docker push #其他指令 docker tag 给一个镜像打标签,用于推送镜像到私有仓库 docker export 导出容器文件系统到tar包。 如: docker export 1e682c585342 >dashboard.tar.gz [用的不多] docker import 导入容器文件系统tar包。 [这个指挥导出容器里的内容 不会导出整个系统,docker export也是如此] docker save 保存一个或多个[镜像]到tar包 #常用 用法: docker save nginx >nginx.tar docker load 导入一个docker的[镜像]tar包 #常用 用法: docker load < nginx.tar docker info 查看docker版本信息 docker search nginx 搜索镜像 docker pull nginx 下载镜像 ## 停止容器 docker stop 容器名 一次性停止所有容器 docker stop $(docker ps -a -q) ## 干掉容器 docker kill $(docker ps -a -q) #常用参数: -v 挂载磁盘 [ -v 宿主机目录:容器目录 ] #进入容器 docker exec -it [容器id] bash #容器相关操作 docker run 运行一个容器 docker exec 进入一个容器 docker ps 查看运行的容器 docker ps -a 查看所有容器 docker stop 停止一个容器 docker start 启动一个容器 docker kill 关闭一个容器 docker rm 删除一个容器 docker rename 重命名一个容器 如:docker rename nginx nginx1 docker top 查看容器内运行进程信息 docker cp 拷贝容器中的文件 示例: docker cp nginx_leilei01:/etc/nginx/nginx.conf ./ docker pause 暂停一个容器: docker unpause 恢复被暂停的容器 docker stats 显示容器的实时流资源使用统计信息 docker cp /root/1.txt 23er23rs:/www 拷贝文件到docker中,可通过: docker exec nginx1 ls /tmp 查看 #挂载目录和文件 -v /leilei:/usr/share/nginx/html -v /leilei/nginx.conf:/usr/share/nginx/conf/nginx.conf #指定映射端口 -p 90:80 #将80端口映射到公网90端口 默认随机端口是从/etc/sysctl.conf中定义的随机端口范围. -P #大写P 映射为随机端口.
-m,-memory 设定最大内存量 如: -m=‘512m‘ -memory-swap 允许交换分区的大小 -memory-swappiness=<0-100> 允许使用脚本分区的大小0-100 默认禁用 -1 -oom-kill-disbale #禁用oom --cpus #限制容器使用的cpu数量 --cpuset-cpus #限制容器使用那些核心,如: 0-3 0,1 --cpu-shares #cpu共享 #查看限制: docker stats [ ~]# docker stats [id] CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 359042c33b3d zealous_napier 0.00% 1.387MiB / 2.922GiB 0.05% 1.3kB / 0B 0B / 0B 2 资源限制的例子: #只用一个半cpu docker run -d --name nginx01 --cpus=‘1.5‘ nginx #最多使用50%cpu docker run -d --name nginx02 --cpus=".5" nginx #允许最多使用500M内存和100mswap,禁用oom docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx 资源扩容: [对已创建的容器进行在线扩容(仅支持一部分)] docker update
Linux内核在2.4.19版本开始引入namespace概念,它是将特定的全局系统资源通过抽象方法让namespace中的进程看起来拥有自己隔离的资源。 docker借助该机制实现的容器资源隔离。 namespace的6中不同命名空间: IPC: 隔离进程间通信 MOUNT: 隔离文件系统挂载点 NET: 隔离网络协议栈 PID: 隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见 USER: 隔离用户 UTC: 隔离主机名和域名
namespace不会对资源进行限制,如CPU 内存等,如果CPU被频繁调用,它会影响到其他容器的CPU资源。 此时,引入了 CGroups 用于限制容器资源。 cgoups: 所有的人物就是运行在系统的第一个进程,而cgroups以某种标准将一组进程为目标进行资源分配和控制。 例如: cpu 内存 宽带 并且可以动态配置。 cgoups主要功能: 1. 限制进程组使用的资源数量。 设定进程组资源使用上限,例如:限制内存 2. 进程组优先级控制,可以为进程组分配特定的CPU,磁盘I/O吞吐量 3. 记录进程组使用的资源数量: 例如,使用记录某个进程组使用的CPU时间 4. 进程组控制(control): 可以将进程组挂起和恢复
1. 搜索镜像 2. 挂载宿主机三个文件: hostname hosts resolv.conf 3. 挂载容器目录 /var/lib/docker/containers
数据持久化:
volumes: docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes) 保存数据最佳方式。 bind mounts:将宿主机上的任意位置文件或者目录挂载到容器中。 tmpfs : 很少用。 挂载存储在主机的内存中,不会写入到主机的文件系统。
1. 创建volume: [ ~]# docker volume create nginx-volume nginx-volume 2. 检查volume目录: [ docker]# docker inspect nginx-volume [ { "CreatedAt": "2020-07-05T14:08:27+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data", "Name": "nginx-volume", "Options": null, "Scope": "local" } ] 2. 使用volume: 第一种方法: docker run -d -p 80:80 --name=nginx-test --mount src=nginx-volume,dst=/usr/share/nginx/html nginx 第二种方法: docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx 3. volume清理办法: docker stop nginx-test docker rm nginx-test docker volume rm nginx-volume 例子: docker volume create nginx-volume docker inspect nginx-volume |grep ‘Mountpoint‘ 获取volume目录。 1.方法1 bindmount挂载: docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx-volume,dst=/usr/share/nginx/html nginx 2.方法2 挂载[常用]: docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx 两种方法都是将nginx-volume挂载容器中的网页目录中: /usr/share/nginx/html 检查: [ docker]# ls /var/lib/docker/volumes/nginx-volume/_data 50x.html index.html 修改: echo chenleilei01 > /var/lib/docker/volumes/nginx-volume/_data/index.html 注意: bindmount挂载的方式: 如果容器目录非空,则该目录内容会被隐藏,从而使用宿主机目录覆盖容器中的网页目录 volume挂载方式: docker管理宿主机文件系统的一部分。组词杭甬的数据保存方式。
1. 创建volume: [ ~]# docker volume create nginx-volume nginx01-volume 2. 检查volume目录: [ docker]# docker inspect nginx-volume [ { "CreatedAt": "2020-07-05T14:08:27+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data", "Name": "nginx-volume", "Options": null, "Scope": "local" } ] 3. 使用bindmount挂载 docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx01-volume,dst=/usr/share/nginx/html nginx
docker deamon: docker的守护进程,负责与docker client交互,并管理镜像和容器 containerd: 是一个简单的守护进程,向上给docker daemon提供接口,向下通过containerd-shim结合runC管理创建容器。 runC: 一个命令行工具,它根据OCI标准来创建容器和运行容器
总结:
namespace: 一个命名空间,Linux内核提供的一种对资源隔离的机制。 如隔离进程 网络 挂载点等资源 cgroups: Linux内核提供的一种对进程组限制的机制,如: cpu 内存等。 unionfs: 联合文件挂在系统。 支持不同位置的目录挂载到同一个虚拟文件系统,并形成一种分层的模型。