Dockerfile、Docker-Compose

Dockerfile自定义镜像

要自定义镜像,就必须先了解镜像的结构

1.镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

我们以MySQL为例
Dockerfile、Docker-Compose_第1张图片
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

我们要构建镜像,其实就是实现上述打包的过程。

2.Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

Dockerfile、Docker-Compose_第2张图片
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

3.构建Java项目

虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

  • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  • ② 拷贝课前资料提供的docker-demo.jar到这个目录中

  • ③ 编写Dockerfile文件:

    • a )基于java:8-alpine作为基础镜像
    • b )将app.jar拷贝到镜像中
    • c )暴露端口
    • d )编写入口ENTRYPOINT
      内容如下:
      FROM java:8-alpine
      COPY ./docker-demo.jar /tmp/app.jar
      EXPOSE 8090
      ENTRYPOINT java -jar /tmp/app.jar
  • ④ 使用docker build命令构建镜像docker build -t javaweb:2.0 .

  • ⑤ 使用docker run创建容器并运行docker run --name javaweb2 -p 8091:8090 -d javaweb:2.0

小结:

  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

Docker-Compose

1.CentOS7安装DockerCompose

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

重启虚拟机

2.部署微服务集群

① 准备好项目文件
② 启动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 来部署

注意:

  1. 通过docker logs -f xxx及时查看日志信息
  2. 错误1:查看微服务报错failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848]) tried:
    解决方案:先重启nacos,再重启防火墙systemctl restart firewalld.service,
  3. 错误2:查看mysql日志permission denied
    原因分析:linux默认禁止docker-compose挂载数据卷,所以需要给予权限
    解决方案:修改文件vim /etc/sysconfig/selinux,将SELINUX=enforcing 改为 SELINUX=disabled,重启虚拟机
  4. 错误3: Access denied for user ‘root’@‘172.17.0.3’ (using password: YES)
    解决方案:mysql密码错误,目前课前资料给的mysql密码设定的是123
  5. 错误4:Unable to start docker Container from docker-compose “unknown flag: iidfile”
    解决方案:docker-compose版本太高了,需要降下来
    百度网盘下载:https://pan.baidu.com/s/1cxuly3dRoZ8BgVklmxfriQ 密码:rcqi

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

你可能感兴趣的:(笔记,java)