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
文档更新时间: 2026-06-10 13:53   作者:morninglu