1.概述
1.1.使用docker的好处
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2.容器与虚拟机的比较
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
1.3 Docker会比VM虚拟机快
docker有着比虚拟机更少的抽象层:docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。 docker利用的是宿主机的内核,而不需要加载操作系统OS内核:新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核 .
1.4.官网
2.docker安装
2.1.运行要求
linux系统上,64位,linux内核3.8以上
[root@node1 ~]# uname -r
3.10.0-957.el7.x86_64
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@node1 ~]#
2.2.docker的基本组成
镜像:它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
容器:容器是用镜像创建的运行实例,为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。可以把容器看做是一个简易版的 Linux 环境。
仓库:放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来
2.3 docker安装
官方安装文档https://docs.docker.com/engine/install/centos/
2.2.1 查看系统版本
命令:uname -r和cat /etc/redhat-release
2.2.2 卸载就版本
命令:yum remove docker
2.2.3 安装gcc和软件包
gcc命令1:yum -y install gcc
gcc命令2:yum -y install gcc-c++
软件包命令:yum install -y yum-utils
2.2.4 设置stable镜像仓库和更新yum软件包索引
设置stable镜像仓库:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引:yum makecache fast
2.2.5 安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
2.2.6 docker启动
systemctl start docker
2.2.7 docker验证
[root@node1 ~]# docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:48:42 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
hello world测试
[root@node1 ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
2.2.8 docker卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
3 docker命令
3.1 启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
3.2 镜像命令
列出本地主机上的镜像:docker images
查找镜像:docker search 某个XXX镜像名字
下载镜像:docker pull 镜像名字[:TAG]
查看镜像/容器/数据卷所占的空间:docker system df
删除镜像(单个):docker rmi -f 镜像ID
删除镜像(多个):docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除镜像(全部):docker rmi -f $(docker images -qa)
3.3 虚悬镜像
仓库名、标签都是
3.4 容器命令
下载镜像:docker pull 镜像名
查看容器日志:docker logs 容器ID
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID
进入容器内部:docker exec -it 容器ID /bin/bash
启动已停止运行的容器:docker start 容器ID或者容器名
重启容器:docker restart 容器ID或者容器名
停止容器:docker stop 容器ID或者容器名
强制停止容器:docker kill 容器ID或容器名
删除已停止的容器:docker rm 容器ID
一次性删除多个容器实例:docker rm -f $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm
新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
比如运行centos镜像:docker run –name myCentos -it -d centos
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
#使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash
#启动守护式容器(后台服务器)
docker run -d 容器名
文件拷贝
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径
比如:docker cp myCentos:/incontainer/test.txt /myfile
将容器内的文件 /incontainer/test.txt 拷贝到主机的/myfile 目录
导入和导出容器
export 导出容器的内容留作为一个tar归档文件: docker export 容器ID > 文件名.tar
举例:
[root@node1 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf2d6c1d15ad centos "/bin/bash" 22 minutes ago Up 22 minutes myCentos
[root@node1 /]# docker export cf2d6c1d15ad > myCentos.tar.gz
import 从tar包中的内容创建一个新的文件系统再导入为镜像:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
举例:
[root@node1 /]# cat myCentos.tar.gz | docker import - xie/mycentos:1.0
docker images会多一个镜像
[root@node1 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xie/mycentos 1.0 650d40dfa9cc 33 seconds ago 231MB
4 Docker容器数据卷
4.1 概述
将docker容器内的数据保存进宿主机的磁盘中。
举例:运行一个带有容器卷存储功能的容器实例:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
加上 –privileged=true 原因:linux目录挂载的情况被默认为不安全,使用该参数扩大容器的权限解决挂载目录没有权限的问题,
让container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
4.2 作用
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
4.3 使用方法
1.直接添加:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功:docker inspect 容器ID
查看里面的mounts目录
2.读写(默认)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
默认就是rw
3.只读(容器实例内部被限制,只能读取不能写)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
- 数据卷共享
容器2继承容器1的卷规则:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
5 DockerFile解析
5.1 概述
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网:https://docs.docker.com/engine/reference/builder/
构建步骤:编写Dockerfile文件–>docker build命令构建镜像–>docker run依镜像运行容器实例
5.2 DockerFile构建过程解析
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交
5.3 DockerFile常用保留字指令
FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,
第一条必须是from
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令,在 docker build时运行
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定容器启动后的要干的事情,Dockerfile 中可以有多个 CMD 指令,但只有最后
一个生效,CMD 会被 docker run 之后的参数替换。
它和前面RUN命令的区别:CMD是在docker run 时运行,RUN是在 docker build时运行。
ENTRYPOINT 也是用来指定一个容器启动时要运行的命令,类似于 CMD 指令,但是ENTRYPOINT不会
被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令
指定的程序,如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
5.4 使用案例
## 基础镜像java
FROM java:8
## 作者是xie
MAINTAINER xie
## 将jar包添加到容器中并更名为ccc-sys.jar
ADD ccc-sys-0.0.1-SNAPSHOT.jar ccc-sys.jar
## 就是在容器中以多少端口号运行
EXPOSE 8001
## 容器启动之后执行的命令,java -jar ccc-sys.jar 即启动jar
ENTRYPOINT ["java","-jar","ccc-sys.jar"]
构建命令:docker build -f sysDockerFile -t sys:1.0 .
sysDockerFile是dockerFile的名字,注意最后的 . 表示Dockerfile文件在当前目录下,sys:1.0构建之后镜像名称,可以随便起
5.5 运行镜像
docker run -d -p 8001:8081 –name xie-sys sys:1.0
6.生产问题
6.1 服务器空间爆满
6.1.1 问题现象
近期服务器经常出现空间爆满问题,经排查发现是由于docker日志路径overlay2爆满,每日增长25%左右空间数据,执行命令 docker stop 服务;docker rm 服务;docker run 服务 后空间恢复正常。经排查是服务运行的日志写入了docker,docker的日志一直在增大。
6.2.2 解决办法
方法1. 限制docker的日志大小
启动命令添加 日志大小和日志个数限制:–log-opt max-size=50m –log-opt max-file=3
docker run -d -it -p 8081:8081 -e TZ=Asia/Shanghai -v /soft/xie/logs:/app/madp/log/logs -v /soft/xie/home:/home -v /etc/localtime:/etc/localtime:ro --log-opt max-size=50m --log-opt max-file=3 --net=host --name my-server my-server:v1.0
方法2.编写shell脚本,定时清理docker日志
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /soft/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"