文章目录
Docker
Docker和虚拟机的差别
镜像只能只读 需要写文件要拷贝到独立文件系统中实现隔离
dockerlinux_17">docker在linux安装配置
linux安装Docker文档
镜像命令
导出的意思 导出成一个压缩文件 :docker save -o[压缩文件名称] [名称]:[版本号]
加载压缩文件:docker load -i [文件名称]
查看镜像(文件):docker images
删除:docker rmi [文件名称]:[版本]
容器命令介绍
docker run --name mn -p 80:80 -d nginx
查看容器运行状态:docker ps
查看日志:docker logs [容器名称]
Docker-容器(基本操作)
###运行安装练习
systemctl start docker # 启动docker服务
- 查看镜像文件
docker images
3.创建容器 根据官网复制
docker run --name [mr](容器名称) -p 6379:6379 -d redis[镜像名称]
4.查看开启容器
docker ps
docker exec -it mr bash
5.进入容器然后之后就可以操作了
docker_73">docker基本操作(数据卷)
(3.6) 挂载本地目录
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
-
带数据卷模式:宿主机目录 --> 数据卷 —> 容器内目录
-
直接挂载模式:宿主机目录 —> 容器内目录
目录挂载与数据卷挂载的语法是类似的: -
-v [宿主机目录]:[容器内目录]
-
-v [宿主机文件]:[容器内文件]
特点:
- 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
如图:
数据卷挂载
直接挂载
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
四.Dockerfile自定义镜像
常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。
而要自定义镜像,就必须先了解镜像的结构才行。
(1) 镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例,来看看镜像的组成结构:
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
(2) Dockerfile语法
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer,而第一行必须是FROM,从一个基础镜像来构建。基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
更多详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
(3) 案例
(3.1) 基于Ubuntu构建Java项目
需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目
步骤1:在电脑上新建一个空文件夹docker-demo
步骤2:拷贝资料中的docker-demo.jar文件到docker-demo这个目录
步骤3:拷贝资料中的jdk8.tar.gz文件到docker-demo这个目录
步骤4:拷贝资料提供的Dockerfile到docker-demo这个目录
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
步骤5:将上述准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下
步骤6:构建镜像:
docker build -t javaweb:1.0 .
注意:(空格)加(.) : 代表所在的目录路径下 (这样才能构建当前目录)
五.Docker-Compose
上面的Compose文件就描述一个项目,其中包含两个容器:
mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
web:一个基于docker build临时构建的镜像容器,映射端口时8090
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
使用基本类似
2) 安装
(2.1) 下载
在Linux下使用需要通过命令下载:
安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
1
2
(2.2) 修改文件权限
修改文件权限,让其变成可执行文件:
修改权限
chmod +x /usr/local/bin/docker-compose
1
2
(2.3) Base自动补全命令:
在使用时会有提示
1. # 补全命令2. curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
(3) 部署微服务集群
需求:将资料中的cloud-demo微服务集群利用DockerCompose部署
实现思路:
① 查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名
③ 使用maven打包工具,将项目中的每个微服务都打包为app.jar
④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
(3.1) compose文件
查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:
内容如下:
version: "3.2"services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- "8848:8848"mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123#$PWD:表示当前路径(前面一页的意思)volumes:- "$PWD/mysql/data:/var/lib/mysql"- "$PWD/mysql/conf:/etc/mysql/conf.d/"userservice:build: ./user-serviceorderservice:build: ./order-servicegateway:build: ./gatewayports:- "10010:10010"
可以看到,其中包含5个service服务:
nacos:作为注册中心和配置中心
image: nacos/nacos-server: 基于nacos/nacos-server镜像构建
environment:环境变量
MODE: standalone:单点模式启动
ports:端口映射,这里暴露了8848端口
mysql:数据库
image: mysql:5.7.25:镜像版本是mysql:5.7.25
environment:环境变量
MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123
volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
userservice、orderservice、gateway:都是基于Dockerfile临时构建的
查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:
查看微服务目录,可以看到都包含Dockerfile文件:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar