docker

docker是一个开源的应用容器引擎,由Go语言开发

docker镜像:用来创建docker容器的模板,镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来
docker容器:容器是独立运行的一个或一组应用
docker客户端:docker客户端通过命令行或其他工具使用docker api与docker的守护进程通信
docker主机:一个物理或虚拟的机器用于执行docker守护进程和容器
docker守护进程:是docker服务器端进程,负责支撑docker容器的运行以及镜像的管理
docker仓库DockerHub(Registry) 中央仓库

安装与卸载
卸载:
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
安装:
1.检测环境centos7及以上
2.安装gcc和g++:
yum -y install gcc
yum -y install gcc-c++
3.安装一些必要的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
4.添加软件源信息(配置阿里云镜像,提高下载速度)
yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum软件包索引并安装docker-ce
yum makecache fast

    yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动与停止:
systemctl status docker 查看状态
systemctl start docker 启动服务
systemctl stop docker 停止服务
systemctl enable docker 设置服务自启动
systemctl disable docker 设置服务不自启动

镜像使用:
配置仓库(配置阿里云镜像仓库,下载更快)
创建文件 vim /etc/docker/daemon.json
添加如下内容:
{
“registry-mirrors”:[“https://registry.dockermirror.com","https://registry.dockermirror.com"]
}
常用命令:
docker search 镜像关键字:版本号 会从中央仓库搜索镜像,版本号可省略,默认最新版本
docker pull 镜像关键字:版本号 会从仓库拉取镜像,版本号可省略,默认最新版
docker images 查看所有镜像
docker images -qa 查看所有镜像id
docker load -i xxx.tar 加载本地的镜像
docker rmi -f 镜像ID 删除镜像,-f为强制删除(不加标记默认删除最新的镜像)
docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个镜像(不加标记默认删除最新的镜像)
docker rmi $(docker images -q) 删除所有的镜像
容器使用:
查看容器
docker ps 查看所有正在运行的容器
docker ps -qa 查看所有容器,-a表示查看所有,-q表示查看id
创建容器:
交互型容器:具有和用户交互的输入和输出的终端,创建后自动进入容器,首次退出(exit)关闭容器
docker run -it –name xxx centos:7 /bin/bash run相当于create+start,-i表示运行容器,-t表示容器启动后进入命令行,-name表示为创建的容器命名,centos是容器关键字,:7是版本号,/bin/bash表示交互方式为命令行交互
守护型容器:没有交互终端,需要使用docker exec进入容器,退出不会关闭容器
docker run -id –name xxx centos:7 去掉了/bin/bash,参数-t换成-d,-d表示创建守护型容器

    启动、停止与登录:
        docker exec -it xxx /bin/bash   与xxx容器进行交互,命令行方式(登录容器)
        docker start xxx   启动xxx容器
        docker stop xxx   停止xxx容器
        docker restart xxx   重启xxx容器
    删除容器:
        docker rm 容器名称/容器id
        docker rm $(docker ps -qa)  删除所有容器
    参数:-f  强制
         -v  为宿主机和容器建立映射
            -v redis-data:/data 容器名称:版本号    redis-data为数据卷名称,/data为映射文件夹,数据卷可以提前创建或-v时自动创建
            -v /redis-data:/data 容器名称:版本号   /redis-data为宿主机目录,/data为映射目录,目录挂载
示例:
    docker run -id --name mytomcat -p 8090:8080 tomcat:latest   -p为指定端口,8090:8080表示内部使用8080端口启动tomcat,外部访问用8090,会自动映射到内部的8080  
其他命令:
    docker logs -f 容器名称/容器id   查询容器内进程日志,-f参数表示实时监控日志信息
    docker inspect 容器名称/容器id   查看容器的详情信息
    docker cp   完成容器和宿主及直接的文件copy
        docker cp /opt/mv.jpg mytomcat:/usr/local   宿主机->容器
        docker cp mytomcat:/usr/local/mv.jpg /opt   容器->宿主机

备份与迁移:
docker commit 容器名称/容器id 镜像名称 把docker容器保存成一个镜像
docker save -o 镜像tar文件名称 镜像名称/镜像id 把镜像保存为tar文件
docker load -i 镜像tar文件名称 把tar文件恢复成为一个镜像
数据卷:
docker volume ls 查看数据卷
docker volume create 数据卷名称 创建数据卷
docker volume inspect 数据卷名称 查看指定的数据卷详细信息
docker volume rm 数据卷名称 删除指定的数据卷
数据卷固定的宿主机位置:/var/lib/docker/volumes/数据卷名称/data
数据卷挂载:docker run -id –name redis01 -p 6380:6379 -v redis-data:/data redis:7/0/10
注意:
1.如果数据卷没有提前创建,那么在创建容器的时候会自动创建对应的数据卷
2.数据卷挂载的时候数据卷名称签名没有/
3.容器目录不存在会自动创建
4.数据卷目录如果不为空,此时会使用数据卷目录内容覆盖容器目录内容
5.数据卷目录如果为空,容器目录不为空,此时会使用容器目录内容覆盖数据卷目录
目录挂载:
docker run -id –name redis01 -p 6380:6379 -v /redis-data:/data redis:7/0/10
docker run -id –name redis01 端口 6380:6379 -v 宿主机目录:容器目录 镜像名称
注意:
1.如果宿主机目录没有创建,那么在创建容器时会自动创建对应的宿主机目录
2.宿主机目录挂载的时候宿主机目录名称前面有/
3.容器目录不存在会自动创建
4.宿主机目录如果不为空,此时会使用宿主机目录内容覆盖容器目录内容
5.宿主机目录如果为空,容器目录不为空,此时会将容器目录内容清空

制作镜像(重要)
dockerfile 用于制作docker镜像的指令集文本文件
FROM:
用法:FROM image name:tag 指定一个构建镜像的基础源镜像,如果本地没有就会从仓库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个dockerfile中构建多个镜像
MAINTAINER:
用法:MAINTAINER user_name 描述镜像的创建者,名称和邮箱
RUN:
用法:RUN “command” “param1” “param2” 用来执行一些命令,可以写多条
ENV:
用法:ENV key value 设置容器的环境变量,可以写多条
ADD:
用法:ADD source dir/file 将宿主机的文件复制到容器内,如果是压缩文件,则复制后自动解压
ENTRYPOINT:
用法: ENTRYPOINT “command” “param1” “param2” 用来指定容器启动时所执行的命令
docker build -t centos7-jdk17 .
build表示构建镜像
-t表示tag,标记
centos7-jdk17为名称
. 表示dockerfile的路径,.表示当前目录下

docker与maven集成的插件(用于在某个阶段执行制作docker镜像功能)
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>

                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>

                <!--将插件绑定在某个phase执行-->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!--将插件绑定在package这个phase(阶段)上。也就是说,用户只需执行mvn package,就会自动执行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>

                    <!--指定生成的镜像名-->
                    <imageName>${project.artifactId}</imageName>

                    <!--指定标签,也就是版本号,可以自定义-->
                    <imageTags>
                        <imageTag>v2.0</imageTag>
                    </imageTags>

                    <!--指定远程 docker api地址 也就是服务器ip+docker的端口号-->
                    <dockerHost>http://192.168.6.131:2375</dockerHost>

                    <!-- 指定 dockerfile 路径-->
                    <dockerDirectory>${project.basedir}</dockerDirectory>

                    <!-- 是否跳过docker构建 -->
                <!--  <skipdockerBuild>false</skipdockerBuild>-->

                </configuration>

            </plugin>
        </plugins>
    </build>


docker开启远程连接访问功能:
    修改文件:vim /lib/systemd/system/docker.service
    找到ExecStart行,修改成如下内容
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
    systemctl daemon-reload				#重启守护进程
    systemctl restart docker			#重启docker

特殊:docker update 参数名 参数值      可以修改一些配置

创建mysql容器:docker run -di --name=mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.30

compose(插件)
docker compose用于定义和运行多容器应用程序的工具
docker compose通过yml文件定义多容器的docker应用
docker compose通过一条命令根据yml文件的定义取创建或管理多容器
安装:
创建指定目录存储docker compose
mkdir -p /usr/local/lib/docker/cli-plugins

    下载并移动
    curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose

    给docker-compose文件赋予可执行权限
    sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

    查看docker compose的版本
    docker compose version
使用:
    编写yml配置文件:(示例)
    services:
        redis:
            image: redis:7.0.10
            container_name: redis
            ports:
                - "6379:6379"
            volumes:
                - redis-data:/data
    volumes:
        redis-data: {}
    docker compose相关命令:  
        docker compose -f docker-compose.yml up -d     启动容器(如果不存在容器就创建、存在则修改)
        docker compose -f docker-compose.yml down      删除所有容器
        docker compose -f docker-compose.yml stop      停止所有容器
        docker compose -f docker-compose.yml start     启动所有容器
        docker compose -f docker-compose.yml restart   重启所有容器
部署超多中间件:(解除一些限制)
    #Disable memory paging and swapping performance
    sudo swapoff -a
    # Edit the sysctl config file
    sudo vi /etc/sysctl.conf

    # Add a line to define the desired value
    # or change the value if the key exists,
    # and then save your changes.
    vm.max_map_count=262144

    # Reload the kernel parameters using sysctl
    sudo sysctl -p

    # Verify that the change was applied by checking the value
    cat /proc/sys/vm/max_map_count

补充命令

docker inspect xxx //检查容器详情
docker volume inspect xxx //检查卷信息