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)
│ └── App2.docker安装
2.1.ubuntu
1.更新系统依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg2.添加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.gpg3.往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/null4.安装docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin2.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.repo3.安装依赖 添加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-ce2.3.通用修改
1.把lu加入到docker用户组
sudo usermod -aG docker lu
newgrp docker2.修改配置
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 -p1233212.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 nginx3.redis
docker pull redis
docker run -id --name=redis -p 6379:6379 redis4.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:guest5.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信息6.zookeeper (分布式服务注册)
docker run -id --name=zookeeper -p 2181:2181 zookeeper:3.4.134.备份迁移(类似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.gz3.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 registry4.上传私有镜像
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.047.生产环境的目录结构
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:ro3. ./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