Docker自定义镜像

发布于:2025-02-10 ⋅ 阅读:(48) ⋅ 点赞:(0)

Dockerfile自定义镜像

一:镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例,来看看镜像的组成结构:

简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文
件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
 

1.2:Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么
文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说
明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使
ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN  执行Linux的shell命令,一般是安
装过程的命令
RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是
给镜像使用者看的
EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运
行时调用
ENTRYPOINT java -jar xx.jar

更新详细语法说明,请参考官网文档:Dockerfile reference | Docker Docs

1.3 案例一
基于Ubuntu镜像构建一个新镜像,运行一个java项目

        *新建一个空文件夹docker-demo
        *拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录
        *拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
        *拷贝课前资料提供的Dockerfile到docker-demo这个目录
        *进入docker-demo

运行命令:docker build -t javaweb:1.0 .

最后访问:http://192.168.112.100:8090/hello,其中的ip改成你的虚拟机ip

1.4 案例二

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


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


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


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


实现思路如下:

        *新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
        *拷贝课前资料提供的docker-demo.jar到这个目录中
        *编写Dockerfile文件:
                基于java:8-alpine作为基础镜像
                将app.jar拷贝到镜像中
                暴露端口
                编写入口ENTRYPOINT
        内容如下:

FROM openjdk:8
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar

        *使用docker build命令构建镜像
        *使用docker run创建容器并运行

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

二.Docker-Compose


5.1 DockerCompose简介

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手
动一个个创建和运行容器!


Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

version: "3.8"
services:
        mysql:
                image: mysql:5.7.25
                environment:
                        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"
 

上面的Compose文件就描述一个项目,其中包含两个容器:
        *mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录

        *web:一个基于docker build临时构建的镜像容器,映射端口时8090
其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语
法稍有差异。

DockerCompose的详细语法参考官网:Compose file reference | Docker Docs

2.2 安装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

如果下载速度较慢,或者下载失败,使用课前资料提供的docker-compose文件
方式二:上传docker-compose文件到/usr/local/bin/目录。
修改文件权限:

# 修改权限
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

1.3 部署微服务集群
1.3.1 数据库迁移

将cloud-demo涉及的相关sql导入到Linux上的mysql容器中

5.3.2 阅读docker-compose.yml文件

version: "3.2"
services:
        nacos:
               image: nacos/nacos-server:1.4.1
                environment:

                        MODE: standalone
                ports:
                        - "8848:8848"
        mysql:
                image: mysql:8.0.30
                environment:
                        MYSQL_ROOT_PASSWORD: 123456
                volumes:
                        - "/tmp/mysql/data:/var/lib/mysql"
                        - "/tmp/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
                ports:
                        - "3306:3306"
                userservice:
                        build: ./user-service
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "8081:8081"
                orderservice:
                        build: ./order-service
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "8080:8080"
                gateway:
                        build: ./gateway
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "10010:10010"

5.3.3 将项目打包

<build>
    <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
</build>

配置文件:

# 所有连接mysql的地方都要修改为mysql的容器名称(需要添加端口号)
# 所有连接nacos的地方都要修改为nacos的容器名称(需要添加端口号)


网站公告

今日签到

点亮在社区的每一天
去签到