要自定义镜像,就必须先了解镜像的结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。
例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。
需求:基于java:8-alpine镜像,将一个Java项目构建为镜像
实现思路如下:
① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
② 拷贝课前资料提供的docker-demo.jar到这个目录中
③ 编写Dockerfile文件:
④ 使用docker build命令构建镜像docker build -t javaweb:2.0 .
⑤ 使用docker run创建容器并运行docker run --name javaweb2 -p 8091:8090 -d javaweb:2.0
小结:
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改文件权限:
# 修改权限
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
如果这里出现错误,需要修改自己的hosts文件
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
permission denied
永久关闭:
vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启虚拟机
① 准备好项目文件
② 启动nacos微服务
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.4.1
注意: nacos微服务启动之后一定要重启网关,否则在后续微服务会报错“failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848]) tried:”启动网关命令
systemctl restart firewalld.service
③ linux默认不给docker-compose挂载的数据卷读写的权限,需要关闭selinux,mysql的数据卷才可以挂载成功
vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启虚拟机
④ 通过docker inspect查看容器的ip,修改自己的cloud-demo项目,将子项目nacos地址改为容器ip
⑤ 使用maven打包工具,将项目中的每个微服务都打包为app.jar
⑥ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
⑦ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
注意:
6.错误5:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destinatio
启动docker容器时报错:
iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination 172.18.0.4:5000 ! -i br-ff45d935188b: iptables: No chain/target/match by that name. (exit status 1)
解决方案:重启docker
systemctl restart docker
7:ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-2add1a39bc5d -j RETURN: iptables: No chain/target/match by that name.
原因是关闭防火墙之后docker需要重启,执行以下命令重启docker即可:
service docker restart