那位先生

个人站

前世五百次回眸,才能换得今生的一次擦肩而过。


docker学习

1.概述

1.1.使用docker的好处

解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

1.2.容器与虚拟机的比较

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

1.3 Docker会比VM虚拟机快

docker有着比虚拟机更少的抽象层:docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。 docker利用的是宿主机的内核,而不需要加载操作系统OS内核:新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核 .

1.4.官网

docker官网:
Docker Hub官网:

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 虚悬镜像

仓库名、标签都是的镜像,俗称虚悬镜像dangling image。在构建或者删除镜像时出错会有一定概率出现虚悬镜像。 对于虚悬镜像,一旦发现,必须删除,因为它可能对系统造成一些潜在的风险。

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 镜像名

  1. 数据卷共享
    容器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 ========"

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
你说多少就多少

比五毛钱特效专业哦