概念和理解
一个项目的生成,需要经历几个不同环境,也就是一个项目需要经过好几个环境的运行
从开发环境到测试环境再到生产环境(运行环境/实际应用环境)
而这几个环境都不一样,所以项目运行会造成项目出错,或者项目不能运行
解决问题的办法就是,将开发环境一起打包送到测试服务器上运行,不需要管测试服务器上的环境,最后没有bug再放到应用服务器上
Docker的概念
Docker就是基于Go语言实现的云开项目
Docker的主要目标就是 Build,Ship and Run Any App,Anywhere(意思就是一次编译(镜像),到处运行)也就是通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户的APP以及其运行环境能够做到 一次镜像,到处运行
LInux容器技术的出现就解决了这样一个问题,而Docker就是在他的基础上发展过来的,将应用打包成镜像,通过镜像成为运行在Doker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台性,跨服务器,只需要一次配置好环境,换到别的服务器上也可以一键部署好,极大的简化了操作
Docker借鉴了集装箱的概念,表示这些集装箱一样的应用,可以被鲸鱼一样的docker,运送到各种海洋(服务器)使用
安装Docker
# 1、yum包更新到最新
yum -y update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功 会默认为最新版本,需要在后年设置版本号
docker -v
docker镜像(image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
容器(Container):Docker利用容器独立运行的一个或一组应用,就像是java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开启、停止、删除、每个容器都是相互隔离,保证安全的平台
仓库(Repository)是集中存放镜像文件的场所
类似于
Maven厂库,存放各种jar包的地方
github仓库,存放各种git仓库的地方
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方
仓库分为公开仓库(PUblic)和私有仓库(Private)两种形式
最大的公开仓库是Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载,国内的公开仓库包括阿里云、网易云
1.配置Docker镜像加速器
默认情况下,将来从dcoker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
==阿里云== 网易云
腾讯云
2.Docker常用命令
2.1 Docker服务相关命令
启动docker服务 systemctl start docker
停止docker服务 systemctl stop docker 重启docker服务 systemctl restart docker
查看docker服务状态 systemctl status docker
开机启动dockeh服务 systemctl enable docker
查看docker命令帮助文档: docker 具体命令 --help
2.2Docker镜像相关的命令
查看镜像:
docker images
查看远程仓库的镜像:
docker search redis
拉取镜像到本地
docker pull 【镜像名】:【版本号】 ---如果没有则指定为最新版本
删除本地镜像
docker rmi 【镜像名】:【版本号】
docker rmi 【镜像的id】
帮助命令
docker 【命令】--help
2.3docker容器相关的命令
运行容器
docker run -it --name=【容器名】 【系统号】 /bin/bash
-i 保持容器一直运行,因为容器没有客户端链接胡自动关闭
-t 给容器分配伪终端接收命令
--name 给容器起名字
cenost:7 镜像加版本号
/bin/bash 进入容器的初始化指令,这里相当于是到打开一个窗口
exit:退出容器 --- 关闭当前容器
ctrl+q+p:退出容器---不会关闭容器
查看本地容器
dockers ps -- 查看运行的容器
docker pa -a --查看所有的容器
进入容器--运行的容器
docker exec -it 【容器id】|【容器名】 /bin/bash
exit // 他不会关闭容器
启动一个容器
docker start 【容器id】| 【容器名】
关闭容器
docker stop 【容器id】|【容器名】
删除容器
docker rm 【容器id】|【容器名】 //删除的为停止的容器
docker rm -f 【容器id】|【容器名】 //强制删除容器
查看容器的日志
docker logs 【容器id】|【容器名】
3.容器的数据卷
3.1数据卷的概念和作用
当docker容器被删除后,容器中的数据还能存在吗?
docker容器和外部机器可以直接交换文件吗?
容器之间可以进行数据交互吗?
数据卷的概念
数据卷是宿主机中的一个目录或文件
当容器目录和数据目录绑定后,对方的修改会立即同步
一个数据卷可以被多个数据同时挂载
一个容器也可以挂载多个数据卷
作用:
解决数据持久化问题
解决外部机器和容器的间接通讯问题
解决容器之间的数据交换
3.2配置数据卷
volume
创建启动容器时,使用-v参数 设置数据卷
docker run -v 【宿主机目录(文件)】:【容器内目录(文件)】
注意事项:
1、目录必须是绝对路径
2、如果目录不存在,会自动创建
3、可以挂载多个数据卷
===宿主机容器卷中的内容发生改变对应容器内中的目录页跟着改变===
4、删除容器后,子啊此开启容器并挂载容器卷。数据依然存在
5、多个容器挂载多个容器卷
4、Docker应用部署
4.1Docker安装mysql
容器内部的网络服务器和外部机器不能直接通信
外部机器和宿主机可以直接通信
就像是,1(外部ip)和2(宿主机)相连接,2(宿主机)和3(宿主机的内部容器)相连接,但是1不能直接连接3,
所以容器中的网络服务需要直接连接到外部机器时,可以将容器中提供服务的端口应黑色到宿主机的端口上,外部(1)服务器,访问宿主机时(2)时,就可以间接的通过宿主机访问容器端口号(3) 这个操作就叫:端口映射
从远程仓库拉取mysql镜像
docker pull mysql:5.7
4.2运行mysql容器
docker run -id --name= 容器名 -p 【 宿主机端口】 :【 容器的端口】 -eMYSQL_ROOT_PASSWORD=【 密码】 【镜像名:端口号 】== -p :表示宿主机的端口和容器内部端口映射
== -e :表示环境设置
4.3 外界navicat连接mysql容器
如果删除容器后,容器内部的数据是否还存在,必须使用数据卷
docker run -id -p 3308:3306 -v/app/mysql/log:/var/log/mysql -v/app/mysql/data:/var/lib/mysql -v/app/mysql/conf:/etc/mysql/conf.d -eMYSQL_ROOT_PASSWORD=123456 --name=mysql70 mysql:5.7-p 3307:3306 将 宿主机的端口号,和容器的端口号做一个映射-v $PWD/conf:/etc/mysql/conf.d :将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf 配置目录-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
删除容器后,再创建容器,绑定原来的主机
4.2Docker安装tomcat
5.1拉取镜像
docker pull
5.2运行容器
docker run -id --name=t01 -p 8088:8080 tomcat:9.0创作t01:容器的名车名称8088:外部访问接口8080:内部泄露的接口
5.3测试
主机ip:8088
如果出现以下情况
原因是:tomcat容器内部没有webapps目录
docker exec -it t01 /bin/bash
删掉现在的webapps目录
rm -rf webapps
再次使用IP地址测试
4.3Docker安装redis
docker run -id --name=redis6 -p 6380:6379redis:6.0.20
连接redis --window图形化界面
4.4Docker配置Nginx镜像
搜索镜像(可写可不写)
docker search nginx
拉取nginx镜像
docker pull nginx
创建容器,设置端口映射,目录映射
在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
在~/nginx/conf下创建nginx
vi nginx.conf
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
配置映射关系
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
-p 80:80 将主机的80端口连接到容器的80端口
(如果出现错误无法访问,可能是端口被占用的问题)
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf 将主机当前目录下的
/conf/nginx.conf 挂载到容器的 /etc/nginx/nginx.conf
使用代理服务器(nginx)+Docker部署springboot项目
前情提要:
宿主机上安装docker,mysql,redis
项目:
配置文件
【】为需要改的地方,不需要输入
需要在服务器的根目录下创建能和容器映射的文件
# 基础镜像使用java FROM openjdk:8 # 作者 MAINTAINER 【自己的名字,随便起】 # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为【】 ADD 【项目jar包名】 【起的名字.jar】 #运行端口号 EXPOSE 8080 # 运行jar包 cmd java -jar 【起的包名】
yml配置环境
yml文件
#自己定义版本号 ,修改【】里面的内容并删除【】
version: "【?】"
services:
micro_service:
container_name: 【自己起的名字】
build:
context: ./project
dockerfile: Dockerfile
ports:
- "【IP访问端口号:8080】"
volumes:
- /app/microService:/data
networks:
- aaa_net
depends_on:
- 【起的redis名字】
- 【起的mysql名字】
【redis服务名字】:
image: 【版本号:redis:6.0.20】
ports:
- "6379:6379"
volumes:
# 必须在宿主机中存在redis.cnf文件,创建的是宿主机下的文件,映射容器中的redis.conf
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- aaa_net
command: redis-server /etc/redis/redis.conf
【mysql服务名字】:
image: 【mysql:5.7】
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'qy168'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf # 必须在宿主机中存在my.cnf文件
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- aaa_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
aaa_net:
在宿主机的根目录下创建app文件夹
宿主机的文件关系:
my.cnf文件内容:
[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
redis.conf文件内容:是一个文件,太长了不发了
就可以使用服务器id加端口号访问项目了
使用cokder+数据库(mysql)/redis(nosql)+nginx
项目:
一般项目都是配置好,数据库,redis数据库,依赖,所有东西写好之后才会进行测试
项目配置文件
#redis spring.redis.host=192.168.220.223 spring.redis.port=6379 #mybatis-plus mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置依赖
1.项目出现错误,修改内容后需要重新打成jar包,在拉到虚拟机上
2.修改东西之后需要访问虚拟ip:9000,杀掉镜像和服务,再次重启服务
进入这个项目
然后再次运行这个项目
docker-compose up
从服务器端访问
设置的虚拟ip:端口号访问项目