1.docker和vm的区别

  1. vm是虚拟一整台电脑 docker容器是隔离运行一个服务
  2. 容器和进程的关系:比如nginx里面是有master+work的多进程 则1个容器里面多个进程 容器只关心主进程master
               如果是一个UserService有10个进程则推荐一个容器一个进程,方便日志和配置的管理
    物理机                                            物理机
    └── Host OS(宿主机系统)                         └── Host OS(Linux)
        └── Hypervisor(虚拟化层)                        └── Docker Engine(docker引擎)
            ├── VM1                                           ├── Container1 (容器1)
            │   ├── Guest OS(完整Linux)                      │   └── App
            │   └── App                                       │
            │                                                 ├── Container2 (容器2)
            ├── VM2                                           │   └── App
            │   ├── Guest OS(完整Linux)
            │   └── App

2.docker安装

2.1.ubuntu
  1. 更新系统依赖
    sudo apt update
    sudo apt install -y ca-certificates curl gnupg
  2. 添加docker官方GPG-key (用于apt安装时校验包是不是docker官网发的)
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. 往apt的软件源列表添加docker官方仓库
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
    https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. 安装docker
    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.2.centos
  1. 备份yum源(忽略)
    sudo mkdir -p /etc/yum.repos.d/bak
    sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
  2. 下载阿里云yum源
    sudo curl -o /etc/yum.repos.d/CentOS-Base.repo \
    https://mirrors.aliyun.com/repo/Centos-7.repo
  3. 安装依赖 添加docker包 安装
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum -y install docker-ce
2.3.通用修改
  1. 把lu加入到docker用户组
    sudo usermod -aG docker lu
    newgrp docker
  2. 修改配置
    mkdir -p /etc/docker
    vim /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://docker.m.daocloud.io",         #改镜像下载源
        "https://dockerproxy.com",
        "https://hub-mirror.c.163.com"
      ],
      "insecure-registries": [                  #私有仓库镜像下载源
        "192.168.10.234:5000"
      ],
      "live-restore": false,                    #重启不会启动容器
      "log-driver": "json-file",                #日志改成log
      "log-opts": {
        "max-file": "3",                        #日志文件最大数量
        "max-size": "100m"                      #每个日志文件的大小
      }
    }
  3. docker系统管理
    sudo systemctl enable docker       #开机启动
    sudo systemctl disable docker      #关闭开机启动
    sudo systemctl is-enabled docker   #检查是否开机启动
    sudo systemctl start docker        #启动
    sudo systemctl stop docker         #关闭
    sudo systemctl stauts docker       #状态

3.docker命令

3.1.镜像
docker images                    #查看镜像
docker search ubuntu             #收索镜像 会超时 直接去网站上搜索  https://hub.docker.com
docker pull ubuntu:18.04         #拉取ubuntu(18.04版本)
docker pull ubuntu               #拉取ubuntu(latest最新版本)
docker rmi  镜像id/镜像名         #按镜像id或者镜像名删除镜像
docker rmi `docker images -q`    #删除所有镜像
3.2.容器
  1. 运行

    docker ps                                                                   //查看容器(在运行的)
    docker ps -a                                                                //查看容器(所有)
    docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"  //只看部分信息
    docker run                                         //创建运行容器
    docker exec -it 容器id/容器名 COMMAND               //在运行的容器执行有交互的命令
    docker exec  容器id/容器名 COMMAND                  //在运行的容器执行无交互的命令
    docker stop  容器id/容器名                          //停止容器 可多个
    docker start 容器id/容器名                          //运行容器 可多个
    docker rm    容器id/容器名                          //删除容器 可多个
    docker cp 宿主机文件路径 容器id/容器名:容器文件路径   //拷贝文件宿主机->容器 可以反向
    docker inspect 容器id/容器名                        //查看容器的基本信息\运行状态\ip\网络\目录映射\环境变量\启动命令\资源限制\restart策略
  2. docker run (-短参数可以合并 - -长参数)

    docker run -it --name=u1 ubuntu:18.04 /bin/bash #镜像:ubuntu:18.04 进入容器以后执行的命令 /bin/bash也是默认值可以不加
    docker run -id --name=u2 ubuntu:18.04           #后台运行容器
    docker exec -it u2 /bin/bash                    #在u2运行有交互的命令 bash
参数 说明
-i 表示交互运行容器
-t 表示进入终端
–name 指定容器名称需要唯一
-v 宿主机目录:容器目录 目录映射 容器目录没有会被创建
-d 后台运行
-p 端口映射
-e 设置环境变量
–restart 重启策略 =no不重启(默认值) =always永远重启 =unless-stopped手动停止不重启(生产环境常用) =on-failure:5非0退出码重启最多重试5次
3.3.案例
  1. mysql
    docker run -id --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123321 mysql:5.7   #本地这个镜像运行时 docker会先去远程下载 然后启动
    docker exec -it mysql /bin/bash
      mysql -uroot -p123321
  2. nginx (先运行一个nginx容器把配置拷贝出来->在重新生成一个容器映射配置目录)
    docker pull nginx
    docker run -id --name=nginx -p 80:80 nginx
    docker cp nginx:/etc/nginx /data/docker/nginx/conf
    docker stop nginx
    docker rm nginx
    docker run -id --name=nginx -p 80:80 -v /data/docker/nginx/conf:/etc/nginx nginx
  3. redis
    docker pull redis
    docker run -id --name=redis -p 6379:6379 redis
  4. rabbitmq (队列)(go一般用nsq)
    docker pull rabbitmq:3.7.12
    docker run -id --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15672:15672 -p 25672:25672 rabbitmq:3.7.12
    docker exec -it rabbitmq /bin/bash
      rabbitmq-plugins enable rabbitmq_management
    http://192.168.10.234:15672/  #rabbitmq后台
    user:guest pw:guest
  5. elasticsearch (专门为搜索和海量数据分析而生的数据库)(mysql: 文章->包含哪些词 elasticsearch:词->出现在哪些文章)
    docker pull elasticsearch:7.5.0
    sudo sysctl -w vm.max_map_count=262144
    docker run -id --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e "cluster.name=elasticsearch" -v /data/docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.5.0
    docker exec -it elasticsearch /bin/bash
      elasticsearch-plugin install https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.5.0.zip   #安装中文分词插件
    docker restart elasticsearch
    http://192.168.10.234:9200/  #elasticsearch信息
  6. zookeeper (分布式服务注册)
    docker run -id --name=zookeeper -p 2181:2181 zookeeper:3.4.13

4.备份迁移(类似redis的RDB快照)

docker commit redis redis:0.0.0.1        #容器->镜像 (ps镜像命名规则 redis:tag)
docker save -o redis.tar redis:0.0.0.1   #镜像->tar
docker load -i redis.tar                 #tar->镜像

5.dockerfile(类似redis的AOF)

  1. 定义:由一系列的命令和参数构建的脚本,这些命令应用于一个基础镜像构建出一个新的镜像
  2. 宿主机目录
    ll
    -rw-r--r--. l root root 189       3月  2 23:52  Dockerfile
    -rw-r--r--. l root root 194042837 2月 21 20:53  jdk-8u202-linux-x64.tar.gz
  3. Dockerfile
    FROM centos:7                               #基础镜像
    WORKDIR /usr                                #设置容器的默认工作目录
    RUN mkdir -p /usr/local/java                #容器内创建目录
    ADD jdk-8u202-linux-x64.tar.gz /usr/local/  #文件从宿主机->容器 并解压
    ENV JAVA_HOME /usr/local/jdk1.8.0_202       #设置JAVA_HOME环境变量 要和解压出来的路径一致
    ENV PATH $JAVA_HOME/bin:$PATH               #设置PATH环境变量
    RUN java -version                           #验证java是否可用
  4. 构建新的镜像
    docker build -t='jdk1.8' .      #构建jdk1.8的镜像 在当前目录找Dockerfile
    docker images                   #查看镜像

6.docker私有仓库

  1. registry私有仓库镜像

    docker pull registry
    docker run -id --name=registry -p 5000:5000 registry
    http://192.168.10.234:5000/v2/_catalog                    #查看私有仓库的镜像
  2. vim /etc/docker/daemon.json

    "insecure-registries": [                                  #私有仓库镜像下载源
      "192.168.10.234:5000"
    ],
  3. 重启docker

    systemctl restart docker
    docker start registry
  4. 上传私有镜像

    docker tag ubuntu:18.04 192.168.10.234:5000/ubuntu:18.04   #给镜像打tag 需要带ip(ps:完整的镜像名 ip/用户名/镜像名:版本号)
    docker push 192.168.10.234:5000/ubuntu:18.04               #上传到私有仓库
  5. 另外一台机器下载私有镜像 先操作23步骤

    docker pull 192.168.10.234:5000/ubuntu:18.04

7.生产环境的目录结构

  1. tree

    /data/docker/mysql-cluster/      #mysql集群
    ├── docker-compose.yml           #多容器管理
    ├── env/                         #环境变量
    │   ├── mysql1.env
    │   ├── mysql2.env
    │
    ├── mysql1/
    │   ├── data/                    #数据
    │   ├── conf/                    #配置
    │   ├── logs/                    #日志
    │
    ├── mysql2/
    │   ├── data/
    │   ├── conf/
    │   ├── logs/
  2. docker-compose.yml

    services:
      mysql1:
        image: mysql:8.4
        container_name: mysql
        restart: always
        env_file:
          - ./env/mysql1.dev.env
        ports:
          - "3306:3306"
        volumes:
          - /data/py/third/mysql/conf/my.cnf:/etc/my.cnf
          - /data/py/third/mysql/conf/conf.d:/etc/mysql/conf.d
          - /data/py/third/mysql/data:/var/lib/mysql
          - /data/py/third/mysql/log:/var/log
          - /etc/localtime:/etc/localtime:ro
      mysql2:
        image: mysql:8.4
        container_name: mysql
        restart: always
        env_file:
          - ./env/mysql2.dev.env
        ports:
          - "3306:3306"
        volumes:
          - /data/py/third/mysql/conf/my.cnf:/etc/my.cnf
          - /data/py/third/mysql/conf/conf.d:/etc/mysql/conf.d
          - /data/py/third/mysql/data:/var/lib/mysql
          - /data/py/third/mysql/log:/var/log
          - /etc/localtime:/etc/localtime:ro
  3. ./env/mysql1.dev.env

    MYSQL_ROOT_PASSWORD=123456
    MYSQL_DATABASE=game           #自动创建库
    MYSQL_USER=game               #自动创建user
    MYSQL_PASSWORD=game123        #user使用的密码
    TZ=Asia/Shanghai
    SERVER_ID=1
  4. 常用命令

    docker compose -f ./xx.yml ps            [cont]      //查看容器状态
    docker compose -f ./xx.yml up -d         [cont]      //后台拉起容器
    docker compose -f ./xx.yml up -d --build [cont]      //重构镜像&拉起容器
    docker compose -f ./xx.yml stop          [cont]      //停止容器
    docker compose -f ./xx.yml restart       [cont]      //重启容器
    docker compose -f ./xx.yml down          [cont]      //停止&删除容器
    docker compose -f ./xx.yml logs -f       [cont]      //滚动查看容器日志
    
    docker compose -f ./xx.yml down --rmi all            //停止&删除容器&删除镜像
    docker rmi <img>                                     //删除镜像
文档更新时间: 2026-08-05 14:04   作者:morninglu