• Docker


    目录

    1 安装Docker

    1.1 安装yum工具

    1.2 卸载旧版

    1.3 删除旧版数据

    1.4 安装依赖包

    1.5 添加Docker的yum源(使用阿里云镜像)

    1.6 配置缓存

    1.7 安装最新稳定版Docker

    1.8 验证安装

    1.9 配置镜像加速器

    1.10 启动Docker

    1.11 验证启动

    2 Docker中部署Mysql

    2.1 镜像仓库

    2.2 Mysql镜像下载

    2.3 运行Mysql镜像

    3 Docker常见命令

    3.1 操作镜像

    3.2 操作容器

    3.3 操作数据卷

    3.4 操作网络

    4 数据卷

    4.1 数据卷与容器挂载

    4.2 宿主机与容器挂载

    5 自定义镜像

    5.1 镜像结构

    5.2 Dockerfile

    5.3 Dockerfile指令

    5.4 自定义镜像

    5.4.1 拉取Ubuntu或centos

    5.4.2 准备文件

    5.4.3 自定义java17镜像包

    5.4.4 自定义jar包镜像

    6 网络

    6.1 网桥

    6.2 自定义网络

    7 DockerCompose

    7.1 docker-compose.yml

    7.2 DockerCompose命令


    1 安装Docker

    1.1 安装yum工具

    yum install -y yum-utils   //别复制,用手打

    1.2 卸载旧版

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine

    1.3 删除旧版数据

    sudo rm -rf /var/lib/docker

    1.4 安装依赖包

    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

    1.5 添加Docker的yum源(使用阿里云镜像)

    sudo yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    1.6 配置缓存

    sudo yum makecache fast

    1.7 安装最新稳定版Docker

    sudo yum install -y docker-ce

    1.8 验证安装

    docker -v  //查看docker安装版本

    1.9 配置镜像加速器

            本文使用网易163加速器,也可以选择阿里云加速器

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    EOF

    1.10 启动Docker

    # 启动docker

    sudo systemctl start docker

    # 停止docker

    sudo systemctl stop docker

    # 重启docker

    sudo systemctl restart docker

    # 设置开机自启

    sudo systemctl enable docker

    1.11 验证启动

    docker images

    2 Docker中部署Mysql

    2.1 镜像仓库

            用于存放和管理镜像的平台,例如网易云镜像仓库、阿里云镜像仓库等

    2.2 Mysql镜像下载

            使用Docker安装应用时,Docker会先找本地镜像(image),如果没有就自动在"镜像仓库"搜索并下载镜像(镜像不仅包含应用本身,还包含应用运行所需的环境、配置、系统函数库等)

            Docker中的镜像应用不用真的安装,因为下载是一堆已经安装好的文件,下载即用(相当于windows的"绿色免安装"应用)

    2.3 运行Mysql镜像

            Docker在运行镜像时会依据镜像创建一个环境隔离的容器(container),一个镜像可以创建多个容器

    docker run -d --name mysql_container_3306 -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

    多开容器  docker run -d --name mysql_container_3307 -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

            docker run  //创建运行一个容器,-d是让容器在后台运行(所有docker命令都是以docker开头)

            --name  //给容器起名(必须唯一)

            -p  //设置端口映射 [宿主机端口]:[容器端口]

            -e  //(enviroment) -e KEY:VALUE

            mysql  //镜像名字,完整写法是[镜像名]:[版本号],如果没写版本号,默认代表最新版本

    3 Docker常见命令

    Docker文档可以在(https://docs.docker.com)查看

    Docker镜像信息可以在(https://hub-stage.docker.com)搜索后查看

    当docker命令不会写时,可以通过--help获取帮助,例如docker save --help查看"将镜像打包成压缩文件"的命令

    如果复制的本文命令不生效,可以尝试自己手打命令

    3.1 操作镜像

    docker pull  //从"镜像仓库"下载镜像

    docker images  //查看已经下载的镜像

    docker rmi  //删除镜像(如果有容器在被使用,要先删除容器)

            docker rmi 镜像id

            docker rmi 镜像名:版本号(latest)

    docker build  //先定义DOCKERFILE,然后构件自定义镜像

    docker save  //将镜像打包成压缩文件,保存到宿主机

            docker save -o nginx.tar nginx:latest  //将nginx:latest打成nginx.tar,保存到宿主机的当前目录下

    docker load  //将宿主机的压缩镜像包文件加载到docker中,生成一个镜像

            docker load -i nginx.tar  //加载镜像包文件  -i指定加载哪个镜像包

    docker push  //将本地镜像上传到"镜像仓库"

    3.2 操作容器

    docker run  //创建运行一个容器(如果docker中没有对应的镜像,就从"镜像仓库"下载镜像)

            docker run -d --name nginx_container_81 -p 81:80 nginx

    docker start 容器名  //启动一个容器

    docker stop 容器名  //停止一个容器

    docker ps  //查看所有运行中的容器      docker ps -a  //查看所有容器

    docker rm  //删除容器

            docker rm 容器id/容器名 -f  //-f表示强制删除,不需要先停止容器

    docker exec  //查看容器内部

            docker exec -it 容器名 bash  //-it表示创造一个"可交互终端",此后的操作都是在环境隔离的容器中的操作     exit退出容器回到宿主机

                    docker exec -it mysql bash  //进入mysql容器中  然后通过mysql -uroot -p连入容器中的mysql   第一次exit退出容器中的mysql回到容器,第二次exit退出容器回到宿主机

    docker inspect 容器名  //查看容器详细信息,挂载信息(Mounts):如果Type是volume,就表示"数据卷与容器挂载";如果Type是bind,就表示"宿主机与容器挂载"

                    网络信息(Networks)

    docker log -t 容器名  //查看容器日志(比如查看jar包运行日志)  //Ctrl+C退出日志

    3.3 操作数据卷

    docker volume ls  //查看所有卷

    docker volume inspect 卷名  //查看某个卷详情

    docker volume create  //创建卷

    docker volume rm 卷名  //删除卷(要确保没有容器使用该卷)

    3.4 操作网络

    docker network ls  //查看所有网络

    docker network create 网络名  //创建网络

    docker network connect 网络名 容器名  //将(已经存在的)容器加入到网络中

            docker run -d --name engineering_container_81 -p 81:80 --network 网络名 engineering_image  //创建容器时就加入到网络中(如果创建容器不加入网络,就会默认加入bridge网桥; 如果创建容器加入网络,就只会加入选定网桥,不会再加入默认的bridge网桥)

    docker notwork disconnect 网络名 容器名  //使指定容器离开网络

    docker network rm 网络名  //删除网络

    docker network inspect 网络名  //查看网络详细信息(查看连入此网络有哪些容器)

    4 数据卷

            数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁

            卷一创建,宿主机的目录就会自动创建,因此只需要将卷与容器目录挂载就可以了

    4.1 数据卷与容器挂载

            "数据卷与容器挂载",新建的数据卷在宿主机的位置固定/var/lib/docker/volumes/数据卷名/_data目录

            通过docker run -v 数据卷名:容器内目录完成数据卷挂载(创建容器时,如果挂载了数据卷且数据卷不存在时,会自动创建数据卷)  //挂载必须是在创建容器时,如果容器已将创建就不能再挂载数据卷

                    docker run -d --name nginx_container_81 -p 81:80 -v html_volume:/usr/share/nginx/html nginx   //数据卷与nginx容器的静态资源目录挂载

    4.2 宿主机与容器挂载

            如果创建容器时没有指定挂载,那容器就会自动创建一些匿名卷,在宿主机上的保存位置依旧是/var/lib/docker/volumes/匿名卷名/_data

            可以宿主机的自定义目录容器目录挂载,docker run -v 宿主机目录:容器内目录,宿主机目录要使用绝对路径(以/开头,或以./开头表示当前目录),不要使用相对路径(相对路径会被认为是"数据卷与容器挂载")

                    (1) 在宿主机的root目录下新建docker_mysql目录,进入目录再分别创建data、conf、init目录,分别与docker中mysql的数据(即使mysql容器被摧毁,数据依旧在宿主机上持久保存)、配置文件、初始化脚本(创建容器执行的sql)目录进行挂载

                    (2) 将my.cnf上传到conf目录,将sql脚本上传到init目录

    1. ############################### my.cnf
    2. [client]
    3. default_character_set=utf8mb4
    4. [mysql]
    5. default_character_set=utf8mb4
    6. [mysqld]
    7. character_set_server=utf8mb4
    8. collation_server=utf8mb4_unicode_ci
    9. init_connect='SET NAMES utf8mb4'
    10. ############################### init.sql
    11. CREATE DATABASE `sunner`;
    12. CREATE TABLE sunner.`teacher` (
    13. `position` varchar(10) DEFAULT NULL,
    14. `name` varchar(10) DEFAULT NULL,
    15. `age` int DEFAULT NULL
    16. );

                    (3) docker run -d --name mysql_container_3307 -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /root/docker_mysql/data:/var/lib/mysql -v /root/docker_mysql/init:/docker-entrypoint-initdb.d -v /root/docker_mysql/conf:/etc/mysql/conf.d mysql

    5 自定义镜像

    5.1 镜像结构

            基础镜像(BaseImage):系统函数库、环境、配置等

            层(Layer):在基础镜像的基础上,将大家通用的依赖、配置等打包成一个镜像,供其他镜像依赖

            入口(Entrypoint):镜像运行入口,一般是程序的脚本和参数(例如:java -jar xx.jar)

    5.2 Dockerfile

            Dockerfile是一个文本文件,其中包含了一个个指令(Instruction),用来构件镜像

            每条指令都必须为大写字母且后面跟随至少一个参数

            指令按照从上到下顺序执行(#表示注解)

            每条指令都会创建一个新的镜像层,并对镜像进行提交(即"镜像叠镜像",然后得到一个最终镜像)

    5.3 Dockerfile指令

    FROM 指定基础镜像

    RUN 容器构建(docker build...)时需要运行的shell命令

    WORKDIR 创建容器(docker run...)后,当前窗口默认处在容器中的哪个文件夹

    ENV key:value结构,在构建镜像环境中设置环境变量(可以在Dockerfile中被用$引用)

    COPY 拷贝文件或目录到镜像中

    ADD COPY+解压(会自动解压tar压缩包)

    ENTRYPOINT 容器运行时调用

    5.4 自定义镜像

            docker build -t 镜像名:版本号(不填默认latest) Dockerfile目录(当前目录用.)

    5.4.1 拉取Ubuntu或centos

    docker pull centos:7

    5.4.2 准备文件

            (1) 下载jdk安装包(jdk-17.0.9_linux-x64_bin.tar.gz)

            (2) 上传jdk安装包到linux

            (3) 与jdk安装包同级目录下,新建Dockerfile文件

    1. # 建立一个新的镜像文件,配置模板:新建立的镜像是以centos为基础模板
    2. FROM centos:7
    3. # 创建一个新目录来存储jdk文件
    4. RUN mkdir /usr/local/java
    5. WORKDIR /usr/local/java
    6. #将jdk压缩文件复制到镜像中,它将自动解压缩tar文件
    7. ADD jdk-17.0.9_linux-x64_bin.tar.gz /usr/local/java/
    8. # 创建软连接 ln -s 源文件 目标文件
    9. # RUN ln -s /usr/local/java/jdk-17.0.9 /usr/local/java/jdk
    10. # 设置环境变量
    11. ENV JAVA_HOME /usr/local/java/jdk-17.0.9
    12. ENV JRE_HOME /usr.local.java/jdk-17.0.9
    13. ENV CLASSPATH .:${JAVA_HOME}/LIB:${JRE_HOME}/LIB
    14. ENV PATH $JAVA_HOME/bin:$PATH

    5.4.3 自定义java17镜像包

    docker build -t jdk17_image .

    5.4.4 自定义jar包镜像

            (1) 准备jar包(demo.jar)

            (2) 准备Dockerfile文件

    1. # 基础镜像
    2. FROM jdk17_image
    3. # 设定是去
    4. ENV TZ=Asia/Shanghai
    5. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    6. #拷贝jar包
    7. COPY demo.jar /demo.jar
    8. #入口
    9. ENTRYPOINT ["java","-jar","/demo.jar"]

            (3) docker build -t demo_image .

            (4) 通过demo_image镜像生成并运行容器

                    docker run -d --name demo_container_81 -p 81:80 demo_image

    6 网络

    6.1 网桥

            docker各个容器之间是相互隔离的,但各个容器之间可以通过网桥相互连接

            可以通过ip addr命令查看linux的网卡,其中docker0网卡是docker创建时就有的,对应默认的bridge网桥(默认网桥中,容器之间只能通过被分配的IP访问)

    6.2 自定义网络

            创建自定义网络后,docker会生成一个新的网桥,加入此网桥的容器之间能通过容器名互联

    7 DockerCompose

    7.1 docker-compose.yml

            之前通过Dockerfile的部署,都是一个个的单独部署,无法体现项目的整体性

            可以通过docker-compose.yml(YAML格式)文件来定义一组相关联的容器,实现多个相互关联的的Docker容器快速部署

    1. version: "1.2"
    2. networks:
    3. # 网络标识
    4. sunner_network:
    5. # 网络名
    6. name: s_n
    7. services:
    8. mysql:
    9. image: mysql
    10. container_name: mysql_container_3307
    11. ports:
    12. - "3307:3306"
    13. environment:
    14. TZ: Asia/Shanghai
    15. # 这个密码只适用于初次创建镜像,后续即使再创建新镜像密码也不会变(因为对/var/lib/mysql进行了数据绑定,新的mysql镜像用的还是老数据)
    16. MYSQL_ROOT_PASSWORD: database@mysql#4991
    17. volumes:
    18. - "/root/docker_mysql/data:/var/lib/mysql"
    19. - "/root/docker_mysql/init:/docker-entrypoint-initdb.d"
    20. - "/root/docker_mysql/conf:/etc/mysql/conf.d"
    21. networks:
    22. - sunner_network
    23. redis:
    24. image: redis
    25. container_name: redis_container_6379
    26. ports:
    27. - "6379:6379"
    28. volumes:
    29. - "/root/docker_redis/data:/home/redis/myredis/data"
    30. - "/root/docker_redis/redis.conf:/home/redis/myredis/redis.conf"
    31. networks:
    32. - sunner_network
    33. engineering_image:
    34. build:
    35. context: .
    36. # Dockerfile文件名
    37. dockerfile: Dockerfile_engineering
    38. container_name: engineering_container_80
    39. ports:
    40. - "80:80"
    41. networks:
    42. - sunner_network
    43. depends_on:
    44. - mysql
    45. - redis
    46. # nginx:
    47. # image: nginx_image
    48. # container_name: nginx_container
    49. # ports:
    50. # - "18080:18080"
    51. # - "18081:18081"
    52. # volumes:
    53. # - "/root/docker_nginx/nginx.conf:/etc/nginx/nginx.conf"
    54. # - "/root/docker_nginx/html:/usr/share/nginx/html"
    55. # depends_on:
    56. # - engineering_image
    57. # networks:
    58. # - sunner_network

    7.2 DockerCompose命令

    docker compose [OPTIONS] [COMMAND]

            OPTIONS:

                    -f 指定compose文件的路径和名称    //当前目录下可以省略

                    -p 指定project名称    //不指定默认root

            COMMAND:

                    up 创建并启动所有所有service容器    //不会对docker中已经有的镜像更新,如果想更新需要先删除对应镜像,然后再执行up命令

                    down 停止并移除所有容器、网络

                    ps 查看所有与project有关的已启动的容器

                    start 启动容器

                    stop 停止容器

                    restart 重启容器

                    top 查看运行的进程

                    exec 在指定的运行着的容器中执行命令

    例:docker compose up -d

  • 相关阅读:
    ubuntu20.04 nerf Instant-ngp (下) 复现,自建数据集,导出mesh
    嵌入式工程师常见面试题2-MCU_STM32
    【Python 之 Numpy】创建数组
    微服务网关选型
    torchvision.datasets.ImageFolder
    oracle-long类型转clob类型及clob类型字段的导出导入
    SpringBoot核心知识点总结【Spring Boot 复习】
    基于SSM的校园驿站管理系统
    java牛客笔试题练习日记 - 集合篇
    Apache Atlas 2.2版本安装
  • 原文地址:https://blog.csdn.net/SunnerChen/article/details/134310497