目录
Docker
项目部署问题
总结
镜像与容器
Docker的安装
Docker基本操作
镜像相关命令
拉取镜像
镜像保存
删除镜像
镜像加载
容器相关命令
删除容器
数据卷
数据卷命令
数据挂载
自定义镜像
Dockerfile
案例
Docker-Compose
Compose文件
Docker-Compose安装
修改文件权限
Base自动补全提示
Docker
项目部署问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异
Docker如何解决依赖的兼容问题的
- 将应用的Libs (函数库)、Deps (依赖)配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相干扰
Docker解决不同操作系统的方法
Ubuntu与CentOS系统函数库的实现都是基于Linux。那么Docker就将它们的系统函数库与程序一起打包,避免Ubuntu中没有CentOS的函数方法而无法使用程序的问题
总结
Docker是一个快速交付应用、运行应用的技术
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的差异
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
镜像与容器
镜像:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Docker的安装
我这里使用的是CentOS7虚拟机,使用FinalShell连接虚拟机后。输入安装指令
yum install -y docker-ce
docker的指令
systemctl start docker # 启动docker服务systemctl stop docker # 停止docker服务systemctl restart docker # 重启docker服务systemctl enable docker # 开启自动开启docker服务systemctl status docker # docker服务的状态docker -v # 查看docker版本
配置Docker镜像(针对CentOS)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors":["https://n0dwemtq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker基本操作
镜像相关命令
镜像名称一般分为两部分组成:[repository]:[tag]
在没有指定tag时,默认代表最新版本镜像
拉取镜像
docker pull xxx
我先拉取Nginx测试
镜像保存
删除镜像
镜像加载
容器相关命令
访问虚拟机的80端口
使用命令进入容器内部
docker exec -it mn bash
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn:要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
容器中的nginx被安装在/usr/share/nginx目录下(查询Docker镜像文档知道的),修改Nginx的起始页面
在容器中没有vi的命令。只能通过sed指令来替换文本内容
sed -i 's#Welcome to nginx#hello world#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
再次访问80端口
需要注意的是,ps命令默认只展示运行中的容器。如果需要查询全部容器,需要添加指令-a
删除容器
注意:并不推荐在容器内部修改文件内容,因为不会留下任何日志,无法知道究竟做过什么操作
数据卷
一个数据卷可以被多个容器挂载。一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。同时,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了(双向绑定)。这样我们就可以不进入容器内部修改其数据文件了。
数据卷命令
docker volume命令是数据卷操作
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
数据挂载
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \--name mn \-v html:/root/html \-p 8080:80nginx \
以上命令就是将html数据卷挂载到容器中的/root/html目录
自定义镜像
Dockerfile
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer,而第一行必须是FROM,从一个基础镜像来构建。基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
案例
案例链接:https://pan.baidu.com/s/1MjiIuhNF90iWWIHQ_C8uPQ?pwd=zmbw
将下载好的文件移动到linux系统下的docker-demo文件下
接下来创建镜像
docker build -t javaweb:1.0 .
镜像名称为Javaweb,版本为1.0 Dockerfile在当前目录下
执行后结果
启动容器
docker run --name web -p 8090:8090 -d javaweb:1.0
访问地址yourIP:8090/hello/count
在Dockerfile中内容如下
大部分操作都是在构建Java环境,我们可以直接在构建我们镜像时引入Java的镜像将上面文件修改为后,重新构建
# 指定基础镜像
FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
可以看到,使用其他镜像更加轻量。
Docker-Compose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。
Compose文件
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。格式如下
version: "3.8"services:mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123 volumes:- "/tmp/mysql/data:/var/lib/mysql"- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"web:build: .ports:- "8090:8090"
Docker-Compose安装
将上面链接中的Docker-Compose下载完成后,放入linux中的/usr/local/bin目录下
修改文件权限
进入目录/usr/local/bin目录下
执行如下命令
chmod +x /usr/local/bin/docker-compose
Base自动补全提示
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
在编辑compose文件时会像IDEA编辑yml文件一样提示配置名称
如果情况如上,则需要添加一行命令
echo "199.232.68.133 raw.githubusercontent.com">> /etc/hosts