一、Docker基本介绍
1.Docker为什么出现
以前我们的开发环境和部署环境中的软件版本不一致,那么就可能导致项目上线的时候报错。这个项目如果是单机服务还好,只需要改一台,如果是集群项目,那么就会十分麻烦。
现在我们只需要将开发时候的环境直接打包复制过来,形成镜像文件,然后运维直径运行镜像就行了。从而消除了环境的问题
2.Docker的优点
打包一次镜像,处处运行
3.Docker与虚拟机比较
- 虚拟机:是基于主操作系统的,虚拟出各种硬件(占用资源多、需要一个支持系统)
- 容器:由系统提供Linux内核供容器运行(占用资源少、只需要一个Linux内核)
4.镜像和容器
当我们使用Docker安装应用的时候,Docker会自动搜索并下载应用镜像(image)。
镜像不仅包含了应用本身,还包含了应用运行时所需要的环境、配置、系统函数库等。
Docker会在运行镜像时创建一个隔离环境,称为容器(container)
也就是和其他应用不会产生冲突,软件和软件之间不会产生影响。你甚至可以在一台机器上部署一个MySQL集群。
容器对宿主机以外的机器是隔离的,也就是外部机器不能直接连同容器,但是外部机器可以通过宿主机连接容器
Docker官方维护了一个镜像仓库Docker Hub,几乎包含了我们所能用到的所有软件的镜像,我们甚至可以把自己打包的镜像上传上去
二、快速入门(安装+案例)
1.Docker安装
-
准备Linux环境
-
卸载旧版Docker环境(如果已经安装过)
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
配置yum源(2步)
# 第一步:安装yum-utils工具 yum install -y yum-utils # 第二步:配置Docker的yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
启动和校验
# 查看docker版本 docker -v # 启动Docker systemctl start docker # 查看docker进程是否正常启动 docker images # 停止Docker systemctl stop docker # 重启 systemctl restart docker # 设置开机自启 systemctl enable docker # 执行docker ps命令,如果不报错,说明安装启动成功 docker ps
2.Docker镜像加速
Docker容器中下载各种软件加速的
-
打开阿里云:www.aliyun.com
-
产品—容器----容器镜像服务ACR----管理控制台----开通(个人是免费的)
-
开通之后点击右侧的镜像工具-----镜像加速器—提供了一个加速器地址
-
具体配置下面提供了
#第一步: sudo mkdir -p /etc/docker #第二步: sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["加速器地址"] } EOF #第三步: sudo systemctl daemon-reload #第四步: sudo systemctl restart docker
3.入门案例(部署MySQL)
#只需要下面的这一条命令(下面的是一条命令)
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
4.入门案例命令解读
-
docker run -d
:docker run就是创建并运行一个容器,-d是让容器在后台运行 -
--name mysql
:给容器起了一个名字叫mysql(这个名字可以随便起,但是需要唯一) -
-p 宿主机端口:容器内端口
:设置端口映射(将宿主机的端口映射到容器对应端口中)例如:-p 3307:3306 :意思就是访问宿主机3307端口的时候会映射到容器的3306端口
**说明:**宿主机端口不是固定的,只要不冲突就行。但是容器内端口是固定的,例如MySQL容器的端口就是3306
-
-e key=value
:就是设置环境变量(镜像需要设置什么环境变量可以去官方镜像仓库查看)**说明:**一个-e只能指定一个环境变量,如果需要指定多个环境变量可以设置多个-e
例如:
-e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123
-
mysql:5.7
:指定运行的镜像名以及镜像版本号(Docker搜索、部署、运行都是靠这个名字来的)说明:
-
镜像名称分为两部分:
镜像名称:版本号
例如:
mysql:5.7
-
版本号可以省略,如果没有指定版本号,则默认使用最新版本
-
5.小练习
问题:现在我需要运行nginx,请写出使用Docker运行的命令
docker run -d \
--name nginx
-p 80:80
nginx
三、Docker基础
1.常见命令
镜像命令 | 作用 |
---|---|
docker pull | 下载镜像 |
docker images | 查看本地所有镜像 |
docker rmi | 删除镜像 |
docker buid | 自己构建镜像 |
docker save | 将镜像保存成本地压缩包 |
docker load | 将镜像压缩包加载到本地镜像 |
docker push | 将镜像推送到远程仓库 |
容器命令 | 作用 |
---|---|
docker run | 自动拉取镜像并创建且运行容器 |
docker stop | 停止容器(只停止,容器还在) |
docker start | 启动容器中停掉的进程(不会创建新的容器) |
docker ps | 查看容器运行状态 |
docker rm | 删除容器 |
docker logs | 查看容器运行日志 |
docker exec | 进入容器 |
案例
拉取Nginx镜像,创建并运行Nginx容器
#1.在DockerHub中搜索Nginx镜像,查看镜像的名称
打开DockerHub搜Nginx
#2.拉取Nginx镜像
docker pull nginx
#3.查看本地镜像列表
docker images
#3.1 将镜像保存到本地
docker save -o nginx.tar nginx:latest
#3.2 删除镜像
docker rmi nginx:latest
#3.3 加载本地镜像
docker load -i nginx.tar
#4.创建并运行Nginx容器
docker run -d --name nginx -p 80:80 nginx
#5.查看运行中的容器
docker ps
#5.1 查看所有容器
docker ps -a
#6.停止容器
docker stop nginx
#7.再次启动容器
docker start nginx
#查看容器日志
docker logs nginx
#8.进入Nginx容器
docker exec -it nginx bash #it参数是表示可交互命令
#退出nginx容器内部
exit
#9.删除容器
docker stop nginx #先停止容器
docker rm nginx #再删除
docker rm -f nginx #强制删除容器
2.数据卷
前提案例
利用Nginx容器部署静态资源
要求:
- 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
- 将静态资源部署到nginx的html目录
#1.拉取镜像(如果有就跳过)
docker pull nginx
#2.查看本地的镜像
docker images
#3.运行容器
docker run -d
--name nginx
-p 80:80
nginx
#4.查看运行中的容器
docker ps
#5.进入容器
docker exec -it nginx bash
#查询使用手册,发现html目录再/usr/share/nginx/html下
cd /usr/share/nginx/html
vim /usr/share/nginx/html #发现没有vim编辑器,那么该怎么办?所以看下面
数据卷概念
数据卷是一个虚拟目录,是容器内目录和主机目录之间的桥梁
我们使用docker命令给容器对应的目录创建数据卷,那么宿主机的/var/lib/docker/volumes/
就会生成对应的目录。后面不论是修改宿主机对应的目录中的文件还是修改容器中对应的目录,主机和容器中对应的目录内容都会跟着变化
例如:我们给html和conf创建数据卷,那么宿主机的/var/lib/docker/volumes/目录下就会生成html目录和conf目录
相关命令
数据卷命令 | 作用 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 删除未使用的数据卷 |
docker run -v 数据卷:容器内目录 | 挂载数据卷 |
说明:
- 挂载数据卷命令只能在创建容器时执行,如果容器已经创建了,就没法挂载了
- 数据卷名字随便起
- 如果挂载的时候数据卷不存在,则会自动创建
- 直接删除容器,数据卷和里面的数据依旧会存在
案例完善
#1.先删除之前创建的nginx容器,因为无法再挂载数据卷了
docker rm -f nginx
#2.创建容器同时挂载数据卷
docker run -d
--name nginx
-p 80:80
-v html:/usr/share/nginx/html
nginx
#3.查看数据卷是否创建
docker volume ls
#4.查看数据卷挂载到哪里了
docker volume inspect 卷名
#5.进入挂载的地方
cd /var/lib/docker/volumes/html/_data #可以看见html文件夹中的都系都在这里面了
#6.修改index.html文件,可以发现主机和宿主机的内容都变了
3.本地目录挂载
概念:将本地目录和容器内目录开启关联
引入案例
需求:
- 查看mysql容器,判断是否有数据卷挂载
- 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载
#查看数据卷挂载信息
docker inspect mysql #docker inspect查看指定容器的信息
#可以看到容器自动创建了一个匿名卷
#删除容器之后发现数据卷和数据都存在
#但是当我们创建一个新的mysql容器的时候依旧会生成一个随机名字的数据卷,这个时候我们还需要将之前数据卷的数据拷贝到新的数据卷里面,很麻烦
使用方法
-
在执行docker run命令时,使用
-v 本地目录:容器内目录
可以完成本地目录挂载说明:本地目录挂载必须要以/开头,否则会被认为成数据卷挂载
#案例完善
#主机先创建文件夹
cd /root/mysql
mkdir data
mkdir init
mkdir conf
#创建容器并挂载本地目录
docker run -d
--name mysql
-e TZ=Asiz/Shanghai
-e MYSQL_ROOT_PASSWORD=123
-p 3306:3306
-v /root/mysql/data:/var/lib/mysql
-v /root/mysql/init:/docker-entrypoint-initdb.d
-v /root/mysql/conf:/etc/mysql/conf.d
mysql
4.自定义镜像
4.1 DockerFile语法
DockerFile就是一个文本文件,其中包含一个个的执行,用指令说明要执行什么操作来构建镜像。将来Docker可以根据DockerFile帮我们构建镜像。
常见指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量 | ENV key value |
COPY | 拷贝本地文件到镜像的之地那个目录 | COPY ./jre11.tar.gz /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的(配不配都不影响,只是一个描述) | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
4.2 DockerFile案例
- 麻烦的方法
-
更简单的模板
4.3 构建镜像
-
首先下载好依赖的基础镜像
-
将需要的温江上传到服务器
-
当我们写好DockerFile之后,可以使用下面的命令来构建镜像
#docker build -t 镜像名:版本号 dockerFile所在目录 #例如: docker build -t junqing-oa:1.0 .#.表示dockerfile就在当前目录
5.网络
5.1 概述
Docker安装之后会自动生成一个虚拟网卡,为我们的容器自动分配ip地址。如果我们mysql容器启动了,他就会自动分配一个地址,但是后面mysql容器停止了,再次启动的时候就有可能发生容器ip地址变了的行为。那么我们的项目就会连不上mysql。
为了解决这个问题Docker允许容器加入自定义网络,加入了自定义网络的容器允许通过容器名互相访问。
5.2 相关命令
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清楚未使用网络 |
docker network connect | 使指定容器加入某网络 |
docker network disconnect | 使指定容器离开某网络 |
docker network inspect | 查看网络详细信息 |
5.3 案例
#1.查看所有网络
docker network ls
#2.创建网络(后面的网络名随便起)
docker network create junqing
#3.容器加入
docker network connect junqing mysql
#4.新建容器,要求直接加入junqing网络
docker run -d --name junqing-oa -p 8080:8080 --network junqing docker-demo
四、项目部署
1.部署Java
-
创建自定义网络
-
运行mysql容器
-
修改配置文件中的mysql的url中的host为容器名
-
将项目打包
-
准备好DockerFile
FROM openjdk:11.0-jre-buster ENV TZ=Asiz/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY junqing-oa.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]
-
把项目的jar包和Dockerfile上传到服务器
-
构建镜像
docker build -t junqing-oa .
-
运行镜像
docker run -d --name junqing-oa -p 8080:8080 --network junqing junqing-oa
-
查看日志
docker logs -f junqing-oa
2.部署前端
-
创建nginx容器,挂载本地镜像
docker run -d \ --name nginx \ -p 18080:18080 \ -p 18081:18081 \ -v /root/nginx/html:/usr/share/nginx/html \ -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \ --network hmall \ nginx
-
将对应的文件上传到本地奖项中
3.Docker Compose
思考:上面那样单独部署前端、后端是不是很麻烦,很容易出错,那么怎么样统一部署。
Docker Compose通过一个单独的docker-compose.yml来定义一组相关联的应用容器,帮助我们实现多个相关联的Docker容器的快速部署。
一个Docker Compose就是一个项目。
3.1 docker-compose文件格式
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
3.2 docker compose部署
# docker compose [options] [command]
dokcer compose up -d
#up:启动
#-d:后台运行
docker compose down