我们写的代码会接触到好几个环境: 开发环境,测试环境以及生产环境:
1.Docker是什么?
Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
2.安装Docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS7安装Docker。官网: Docker: Accelerated Container Application Development
# 1、yum包更新到最新--更新centos7系统
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定docker下载路径
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y。 ce:社区版【】 ee:企业版【收费】
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
如果安装yum update中途网络断开导致安装一半失败,再次安装可能会造成(旧的冲突版本)
解决:
卸载冲突的软件包: 首先,卸载与现有软件包冲突的软件包。你可以使用以下命令来卸载软件包。请注意,如果有其他软件包依赖于这些软件包,卸载可能会导致其他问题。
yum remove kmod-14-9.el7.x86_64
yum remove dracut-033-161.el7.x86_64
yum remove initscripts-9.49.17-1.el7.x86_64
清理依赖问题: 运行以下命令来清理依赖问题和冲突:
yum clean all
重新安装软件包: 现在,你可以尝试重新安装需要更新的软件包。运行以下命令:
yum install NetworkManager NetworkManager-glib NetworkManager-tui alsa-firmware alsa-tools-firmware audit authconfig avahi systemd trousers ipset-libs
-
这将尝试安装所有需要更新的软件包以及它们的依赖项。
-
更新系统: 最后,运行以下命令以确保系统的所有软件包都是最新的:
yum update
然后重新执行上面操作
3.Docker架构
-
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
-
容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
-
仓库(Repository)是集中存放镜像文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
3.配置Docker镜像加速器
默认情况下,将来从docker hub (https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
==阿里云== 网易云
腾讯云
4.Docker常用命令
4.1Docker服务常用命令
启动docker服务: systemctl start docker
关闭docker服务: systemctl stop docker
重启docker服务: systemctl restart docker
开启启用docker: systemctl enable docker
查看docker状态: systemctl status docker
docker的帮助命令: docker 命令 --help
4.2Docker镜像相关的命令
docker images --查看本地有哪些镜像
docker search 镜像名 --查看远程仓库的镜像
docker pull 镜像名:版本号 --拉取镜像到本地 ---如果没写版本号默认为新版latest
docker rmi 镜像名:版本号 --删除本地镜像
docker rmi 镜像的id号 --删除本地镜像
docker --help --帮助
4.3Docker容器相关命令:
运行容器:docker run -it --name=c1 centos:7 /bin/bash
-i 保持容器一直运行,因为容器没有客户端连接会自动关闭
-t 给容器分配伪终端接收命令
--name 给容器起名字
centos:7镜像+版本号
/bin/bash 进入容器的初始化指令 这里相当于是打开一个shell窗口
exit:退出容器--关闭当前容器
快捷键:ctrl+q+p 退出容器---不会关闭当前容器
docker ps : 查看当前运行容器
docker ps -a :查看当前所有容器
docker exec -it 容器id|容器名 /bin/bash : 进入容器
exit:此时退出不会关闭容器
docker start 容器id|容器名 :启动一个容器
docker stop 容器id|容器名:关闭一个容器
docker rm 容器id|容器名:删除一个未运行的容器
docker rm -f 容器id|容器名:强制删除一个容器
docker logs 容器id|容器名 : 查看容器的日志
5.容器的数据卷
5.1数据卷作用
docker容器删除后,容器中产生的数据也没有了。使用数据卷可以解决数据的持久化的问题,当容器中的数据和数据卷目录进行绑定后,对方的修改会立即同步,在容器被删除时不会删除挂载的数据卷
Docker容器和外部机器不可以直接交换文件,但可用数据卷,让外部机器来交换宿主机,而宿主机可以和容器来进行数据的交换
作用:
1.解决数据持久化问题
2.解决外部机器和容器的间接通讯问题
3.解决容器之间的数据交换
5.2配置数据卷
docker run -it --name=名字 -v宿主机目录:容器内目录 /bin/bash
6.Docker应用部署
6.1安装mysql
从远程仓库拉取mysql镜像: docker pull mysql:5.7
运行mqsql容器: docker run -id --name=容器名 -p 宿主机端口:容器的端口 -e MYSQL_ROOT_PASSWORD=密码 镜像名:版本号
-i 保持容器一直运行
-d 后台运行
-p 映射宿主机与容器的端口
-e 配置环境 这里配置root的密码
外界使用navicat连接mysql容器
如果删除容器后,容器内部的数据还存在。必须使用数据卷。
docker run -id -p 3307:3306 -v /app/mysql/log:/var/log/mysql -v /app/mysql/data:/var/lib/mysql -v /app/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql70 mysql:5.7
6.2安装tomcat
docker pull tomcat:9 从远程仓库拉取tomcat镜像
docker run -id --name=tom03 -p 8091:8080 tomcat:9 运行tomcat容器
访问8091端口
这是因为如果安装9版本或以上,需要把webapps.dist覆盖webapps
进入容器:docker exec -it tom03 /bin/bash
删除webapps:rm -rf webapps
把webapps.dist重命名为webapps:mv webapps.dist/ webapps
重新访问8091端口:成功!
6.3安装redis
docker pull redis:7 从远程仓库拉取redis镜像
docker run -id --name=redis7 -p 6380:6379 redis:7 运行redis容器
使用mybatisplus测试连接:成功
现在如果redis存储了数据,但容器重启了,数据就丢失了。如果想修改redis配置文件也没办法。
所以需要将配置文件和持久化文件放在数据卷中。
1.创建一个目录/app/redis 并把redis.conf放入到该目录中,因为我们下载的是redis7版本的,所以配置文件也要为对应的,找到之前的redis.conf文件,放入/app/redis下。
2.创建一个目录/app/redis/data 用来存放redis持久化数据。
步骤:
1.创建一个目录/app/redis
mkdir /app/redis
2.把redis7的redis.conf文件拖到/app/redis下
注意这个配置文件需要修改一些配置(注意注意注意)
bind * -::* #允许远程连接
protected-mode no #保护模式关掉,不然得输入密码
appendonly yes #持久化
3.创建一个目录/app/redis/data
mkdir /app/redis/data
启动
docker run -id --name=redis7 -v /app/redis/redis.conf:/usr/redis/redis.conf -v /app/redis/data:/app/redis/data -p 6380:6379 redis:7 redis-server /usr/redis/redis.conf
-i:保持一直运行
-d: 后台运行
--name:设置容器名为redis7
-v /app/redis/redis.conf:/usr/redis/redis.conf :把redis.conf的配置显示在宿主机
-v /app/redis/data:/app/redis/data :把持久化文件映射到宿主机,做数据卷,用来备份
-p 6380:6379 把容器内的6379端口映射到宿主机6380端口
redis-server /usr/redis/redis.conf :(重要)这个是让redis按照redis.conf配置启动,默认就是无配置启动
6.4安装nginx
docker pull nginx 从远程仓库拉取nginx镜像 这里没写版本拉取的则是最新版
docker run -id --name=ng01 -p 89:80 nginx:latest 运行nginx容器
访问端口:
跟redis一样,需要配置为根据自己的配置文件启动
创建挂载目录
mkdir -p /app/nginx/conf 存放配置文件
mkdir -p /app/nginx/log 存放日志文件
mkdir -p /app/nginx/html 存放默认网页
这里直接将容器的配置文件复制到宿主机 注意我上面启动了一个容器叫ng01,这里复制ng01的文件到宿主机
docker cp ng01:/etc/nginx/nginx.conf /app/nginx/conf/nginx.conf
docker cp ng01:/etc/nginx/conf.d /app/nginx/conf/conf.d
docker cp ng01:/usr/share/nginx/html /app/nginx/
删除ng01容器:
docker rm -f ng01
运行nginx容器:
docker run -id --name nginx -p 89:80 -v /app/nginx/conf/:/etc/nginx/conf/nginx.conf -v /app/nginx/log:/var/log/nginx -v /app/nginx/html:/usr/share/nginx/html nginx:latest
6.5安装rabbitMQ
docker pull rabbitmq:management 从远程仓库拉取rabbit镜像
docker run -id --name=rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management 运行rabbit容器
7.自定义镜像
上面我们讲解的镜像都是现成---别人制作的镜像---下载下来的。
7.1dockerfile的概念
-Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作
-文件包含了一条条的指令
-每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
-对于开发人员:可以为开发团队提供一个完全一致的开发环境
-对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
-对于运维人员:在部署时,可以实现应用的无缝跨平台移植
7.2案例一:
创建目录: mkdir /root/qy168
创建centos7_dockerfile文件 touch centos7_dockerfile
编写centos7_dockerfile
#基于centos7制作
FROM centos:7
#作者
MAINTAINER gjc
#这里我一直安装不上vim怀疑是镜像源的问题 所以指定了
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
sed -i 's|^#baseurl=http://mirror.centos.org/centos|baseurl=http://mirrors.aliyun.com/centos|g' /etc/yum.repos.d/CentOS-Base.repo && \
yum makecache
#安装vim
RUN yum install -y vim
#默认登录进来的目录,落脚点
WORKDIR /usr
#最后容器启动后执行
CMD ["/bin/bash"]
镜像源:
- 阿里云镜像源:
http://mirrors.aliyun.com/centos/7/os/x86_64/
- 华为云镜像源:
http://mirrors.myhuaweicloud.com/centos/7/os/x86_64/
- 清华大学镜像源:
https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/
启动镜像:
docker run -it --name=zdycentos zdycentos:01
就可以使用vim命令了
7.3案例二:
把jar和dockerfile都放在/root/qy168中
编写dockerfile:
FROM java:8
MAINTAINER gjc
ADD qy168-nginx01-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
CMD java -jar app.jar
制作镜像:
docker build -f ./springboot_dockerfile -t app .
启动镜像:
docker run -id -p 8080:8080 app
7.4案例三
需求: Centos7镜像具备vim+ifconfig+jdk8
要求: 落脚点: /usr/local 使用vim 并且还能用ifconfig 并且配置好jdk环境变量
在/root/qy168创建dockerfile文件
touch contos7plus_dockerfile
把jdk拉取到当前目录
编写dockerfile
FROM centos:7
MAINTAINER gjc
WORKDIR /usr/local
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#创建目录
RUN mkdir -p /usr/local/java
#ADD 把宿主机中的压缩文件放入到/usr/local/java 并会自动解压
ADD jdk-8u161-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
CMD /bin/bash
7.5将自己的镜像文件上传到远程仓库
作为开发: 我们需要把自己的项目----通过dockerfile 变成一个镜像----上传到远程仓库【hub.docker或者阿里云镜像仓库】
作为测试:
作为运维: 从远程仓库下载镜像---通过镜像运行容器。部署项目。
采用:阿里云镜像仓库
教程:
8.Docker Compose 安装使用
安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
案例:使用docker compose编排springboot+redis+mysql项目
编写docker-comppse.yml (名字必须叫docker-comppse.yml)
docker-comppse.yml:
version: "2.3"
services:
micro_service:
container_name: ms01
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
volumes:
- /app/microService:/data
networks:
- aaa_net
depends_on:
- tm_redis
- tm_mysql
tm_redis:
image: redis:6.0.20
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf # 必须在宿主机中存在my.cnf文件
- /app/redis/data:/data
networks:
- aaa_net
command: redis-server /etc/redis/redis.conf
tm_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:
编写启动jar包的dockerfile文件 因为dockerfile: Dockerfile绑定的Dockerfile,这里名字也得一致为Dockerfile:
# 基础镜像使用java
FROM openjdk:8
# 作者
MAINTAINER gjc
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为 docker.jar
ADD qy168-springboot-redis-02-0.0.1-SNAPSHOT.jar docker.jar
# 运行jar包
CMD java -jar docker.jar
#暴露8080端口作为微服务
EXPOSE 8080
项目打包的名:qy168-springboot-redis-02-0.0.1-SNAPSHOT.jar
my.cnf:
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
redis.conf: