• Docker基本操作【一篇学会项目部署】



    本文均学于“黑马程序员”
    本文所用环境:CentOS7 、HeidiSQL 、MobaXterm、MySQL

    一、Docker简介

    Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

    Docker分为如下三个概念:

    • 镜像(Image): 类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
    • 容器(Container): 类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
    • 仓库(Repository): 类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

    二、Docker安装

    • 1. 安装yum工具
    yum install -y yum-utils
    
    • 1
    • 2. 配置Docker的yum源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    • 1
    • 3. 安装Docker
    yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    • 1
    • 4. 启动Docker
    systemctl enable docker   //设置开机自启
    systemctl start docker    //开启Docker
    
    • 1
    • 2
    • 5. 校验Docker
    docker ps
    
    • 1

    三、配置镜像加速

    这里使用阿里云镜像加速

    - 1. 产品 —> 容器 —> 容器镜像服务ACR
    在这里插入图片描述

    • 2. 管理控制台
      在这里插入图片描述
    • 3. 镜像工具 —> 镜像加速器
      在这里插入图片描述
    • 4. 回到Linux,根据自己的加速器地址 执行如下命令
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    四、Docker部署

    这里以MySQL为例进行部署

    在CentOS下执行如下命令:

    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123456 \
      mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中:

    • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行

    • --name mysql : 给容器起名字叫mysql

    • -p 3306:3306 : 设置端口映射

      • 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
      • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
      • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口
    • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数

      • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定
      • TZ=Asia/Shanghai是设置时区;
    • MYSQL_ROOT_PASSWORD=123456:是设置MySQL默认密码

    • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

      • 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
      • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest
        在这里插入图片描述
        如上 该一条指令MySQL安装完成,可通过任意客户端工具即可连接到MySQL
        这里我采用HeidiSQL进行连接
    • 填入相关信息即可
      在这里插入图片描述

    • 连接成功!
      在这里插入图片描述

    五、Docker基础操作

    1. 常见命令

    在这里插入图片描述

    2. 操作演示

    以下以nginx为例,使用MobaXterm对CentOS进行远程操控

    • 1. 拉取nginx镜像
    docker pull nginx
    
    • 1
    • 2. 查看镜像
    docker images
    
    • 1
    • 3. 打包保存镜像
    docker save -o nginx.tar nginx
    
    • 1
    • 4. 删除镜像
    docker rmi nginx:latest    //:latest表示为最新的
    
    • 1
    • 5. 重新从包中获取镜像,无需重新拉取
    docker load -i nginx.tar
    
    • 1

    在这里插入图片描述

    • 6. 创建并运行Nginx容器
    docker run -d --name nginx -p 80:80 nginx   //第一个nginx为容器名 第二个为依赖的镜像
    
    • 1
    • 7. 查看运行中的容器
    docker ps     //正常查看
    docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"   //格式化查看
    
    • 1
    • 2
    • 8. 访问网页,地址:http://虚拟机地址
    // 浏览器输入
    http://192.168.80.130:80
    
    • 1
    • 2

    在这里插入图片描述

    • 9. 停止容器
    docker stop nginx
    
    • 1
    • 10. 查看所有容器
    docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
    
    • 1
    • 11. 再次启动nginx容器
    docker start nginx
    
    • 1
    • 12. 再次查看容器
    docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
    
    • 1

    在这里插入图片描述

    • 13. 查看容器详细信息
    docker inspect nginx
    
    • 1

    在这里插入图片描述

    • 14. 进入容器,查看容器内目录
    docker exec -it nginx bash
    
    • 1
    • 15. 退出容器
    exit
    
    • 1

    在这里插入图片描述

    • 16. 删除容器
    docker rm nginx
    docker rm -f nginx   //强制删除
    
    • 1
    • 2
    • 17. 给命令起别名
    vi /root/.bashrc   //修改/root/.bashrc文件
    
    //例如:
    alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
    alias dis='docker images'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    source /root/.bashrc    //使别名生效
    
    • 1

    在这里插入图片描述

    3. 数据卷

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

    常见命令:
    在这里插入图片描述
    Tips:

    • 容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
    • /var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
    • 让容器直接与宿主机目录挂载而不使用数据卷

    操作演示

    ①nginx的html目录挂载

    • 1. 删除nginx容器
    docker rm -f nginx
    
    • 1
    • 2. 创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
    docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
    
    • 1
    • 3. 查看数据卷
    docker volume ls
    
    • 1
    • 4. 查看指定数据卷详情
    docker volume inspect html
    
    • 1
    • 5. 查看/var/lib/docker/volumes/html/_data目录
    ll /var/lib/docker/volumes/html/_data
    
    • 1
    • 6. 进入该目录,修改index.html内容
    cd /var/lib/docker/volumes/html/_data
    vi index.html
    // 例如:将第十二行改为" 

    Welcome to 比特冬哥!

    "
    • 1
    • 2
    • 3
    • 7. 重新打开页面,查看效果
    // 浏览器输入
    http://192.168.80.130:80
    
    • 1
    • 2

    在这里插入图片描述

    • 8. 上传一张图片放置 /var/lib/docker/volumes/html/_data目录下
      在这里插入图片描述

    • 9. 进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化

    docker exec -it nginx bash
    cd /usr/share/nginx/html
    ls
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    ②分析匿名数据卷

    • 查看数据卷详情信息
      可知,上面我们是没有对MySQL容器进行挂载操作的
    docker inspect mysql
    
    • 1

    在这里插入图片描述
    可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷。
    在这里插入图片描述
    可以发现,其中有几个关键属性:

    • Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。
    • Source:宿主机目录
    • Destination : 容器内的目录
      上述配置是将容器内的/var/lib/mysql这个目录,与数据卷3756e6eda3cf6fa74dadc79840c6b5ab6063a5fb7b95ca1e48fd659a6e9c5830
      挂载。于是在宿主机中就有了/var/lib/docker/volumes/3756e6eda3cf6fa74dadc79840c6b5ab6063a5fb7b95ca1e48fd659a6e9c5830/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

    ③MySQL的本地目录挂载

    • 1. 删除原来的MySQL容器
    docker rm -f mysql
    
    • 1
    • 2. 进入root目录
    cd ~
    
    • 1
    • 3. 创建文件夹用于本地目录挂载
    mkdir mysql
    cd mysql
    mkdir data
    mkdir conf
    mkdir init
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 4. 将事先准备好的文件拉入文件中
      该两文件主要是用于配置MySQL的默认编码(改为utf8mb4) 和 初始化SQL脚本
      在这里插入图片描述

    • 5. 创建并运行新mysql容器,挂载本地目录

    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 6. 查看容器信息
    dps
    
    • 1
    • 7. 查看data目录,会发现里面有大量数据库数据,说明数据库完成了初始化
    ls -l data
    
    • 1
    • 8. 进入MySQL容器
    docker exec -it mysql mysql -uroot -p   //mysql -uroot -p为进入容器后执行的指令
    
    • 1
    • 9. 查看编码表
    show variables like "%char%";  //发现编码是utf8mb4没有问题
    
    • 1

    在这里插入图片描述

    4. 自定义镜像

    自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包

    ①Dockerfile

    由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile

    常用语法:
    在这里插入图片描述

    ②构建镜像

    这里已提前获取构建镜像需要的基础镜像包

    Dockerfile文件内容如下:

    # 基础镜像
    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝jar包
    COPY docker-demo.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1. 加载jdk镜像
    docker load -i jdk.tar
    
    • 1
    • 2. 查看jdk镜像是否加载成功
    dis
    
    • 1
    • 3. 在demo目录下构建自定义镜像
    cd demo/
    docker build -t docker-demo .
    
    • 1
    • 2

    命令说明:
    docker build : 就是构建一个docker镜像
    -t docker-demo :-t参数是指定镜像的名称(repository和tag)
    . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录

    • 4. 查看自定义镜像(docker-demo)是否加载成功
    dis
    
    • 1
    • 5. 在docker-demo镜像中创建一个容器并运行
    docker run -d --name dd -p 8090:8090 docker-demo    //dd为容器名  docker-demo为镜像
    
    • 1
    • 6. 查看容器的运行情况
    dps
    
    • 1

    在这里插入图片描述

    5. 网络

    用于解决不同容器之间的通信

    ①常见命令

    在这里插入图片描述

    ②自定义网络

    • 1. 创建一个网络
    docker network create bit_dong  //bit_dong为网络名
    
    • 1
    • 2. 然后查看网络
    docker network ls
    
    • 1
    • 3. 查看容器
    dps
    
    • 1
    • 4. 让dd和mysql都加入该网络,网络内各容器可以用容器名互相访问!
    docker network connect bit_dong mysql    //mysql和dd为容器名
    docker network connect bit_dong dd
    
    • 1
    • 2
    • 5. 进入dd容器,尝试利用容器名访问mysql
    docker exec -it dd bash
    ping mysql
    
    • 1
    • 2
    • 6. 也可以通过在创建容器的时候就绑定自定义网络
    docker run -d --name dd -p 80:80 --network bit_dong mysql  
    
    • 1

    在这里插入图片描述

    六、DockerCompose

    Docker Compose可以帮助实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

    docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

    1. 基础语法

    例如,用docker run部署MySQL的命令如下:

    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      --network hmall
      mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果用docker-compose.yml文件来定义,则为:

    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
        networks:
          - new
    networks:
      new:
        name: hmall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    对比如下:
    在这里插入图片描述

    2. 基础命令

    docker compose [OPTIONS] [COMMAND]
    
    • 1

    其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
    在这里插入图片描述

    3. docker-compose示例

    以下是“黑马程序员”提供的docker-compose.yml文件

    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
          - "./mysql/init:/docker-entrypoint-initdb.d"
        networks:
          - hm-net
      hmall:
        build: 
          context: .
          dockerfile: Dockerfile
        container_name: hmall
        ports:
          - "8080:8080"
        networks:
          - hm-net
        depends_on:
          - mysql
      nginx:
        image: nginx
        container_name: nginx
        ports:
          - "18080:18080"
          - "18081:18081"
        volumes:
          - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
          - "./nginx/html:/usr/share/nginx/html"
        depends_on:
          - hmall
        networks:
          - hm-net
    networks:
      hm-net:
        name: hmall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    基于CentOS 7.6安装及配置APISIX 3.0环境
    QLayout布局间消除间隙和QLayout边缘空白调整
    【Linux】操作系统以及虚拟机的安装与配置
    STC 51单片机43——看门狗
    低代码助力企业数字化升级
    【yolov7系列三】实战从0构建训练自己的数据集
    Java设计模式业务场景实战应用
    docker安装部署实战详细手册
    设计模式(六)适配器
    [附源码]java毕业设计新闻发布和评论管理系统
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/133607629