1.docker和vm的区别
- vm是虚拟一整台电脑 docker容器是隔离运行一个服务
- 容器和进程的关系:比如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
- 更新系统依赖
sudo apt update sudo apt install -y ca-certificates curl gnupg - 添加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 - 往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 - 安装docker
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.2.centos
- 备份yum源(忽略)
sudo mkdir -p /etc/yum.repos.d/bak sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ - 下载阿里云yum源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo - 安装依赖 添加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.通用修改
- 把lu加入到docker用户组
sudo usermod -aG docker lu newgrp docker - 修改配置
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" #每个日志文件的大小 } } - 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.容器
运行
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策略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.案例
- 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 - 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 - redis
docker pull redis docker run -id --name=redis -p 6379:6379 redis - 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_managementhttp://192.168.10.234:15672/ #rabbitmq后台 user:guest pw:guest - 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 elasticsearchhttp://192.168.10.234:9200/ #elasticsearch信息 - 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)
- 定义:由一系列的命令和参数构建的脚本,这些命令应用于一个基础镜像构建出一个新的镜像
- 宿主机目录
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 - 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是否可用 - 构建新的镜像
docker build -t='jdk1.8' . #构建jdk1.8的镜像 在当前目录找Dockerfile docker images #查看镜像
6.docker私有仓库
registry私有仓库镜像
docker pull registry docker run -id --name=registry -p 5000:5000 registry http://192.168.10.234:5000/v2/_catalog #查看私有仓库的镜像vim /etc/docker/daemon.json
"insecure-registries": [ #私有仓库镜像下载源 "192.168.10.234:5000" ],重启docker
systemctl restart docker docker start registry上传私有镜像
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 #上传到私有仓库另外一台机器下载私有镜像 先操作23步骤
docker pull 192.168.10.234:5000/ubuntu:18.04
7.生产环境的目录结构
tree
/data/docker/mysql-cluster/ #mysql集群 ├── docker-compose.yml #多容器管理 ├── env/ #环境变量 │ ├── mysql1.env │ ├── mysql2.env │ ├── mysql1/ │ ├── data/ #数据 │ ├── conf/ #配置 │ ├── logs/ #日志 │ ├── mysql2/ │ ├── data/ │ ├── conf/ │ ├── logs/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./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常用命令
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
