20221203 Docker 6. Dockerfile
参考资料
介绍
Docker 创建镜像主要有三种:
-
基于已有的容器创建;
-
基于 Dockerfile 来创建;
-
基于本地模板来导入;
Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的集合,Dockerfile可以让用户个性化定制Docker镜像。
docker build
命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f
标志指向文件系统中任何位置的Dockerfile。
Dockerfile 由一行行命令语句组成,并且支持以 #
开头的注释行
Dockerfile 分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令
Docker 以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM
Dockerfile 常见指令
指令 | 描述 |
---|---|
FROM | 指定基础镜像,必须为第一个命令 |
MAINTAINER | 维护者(作者)信息 |
ENV | 设置环境变量 |
RUN | 构建镜像时执行的命令 |
CMD | 构建容器后调用,也就是在容器启动时才进行调用 |
ENTRYPOINT | 指定运行容器启动过程执行命令,覆盖CMD参数 ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递 给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆 盖前面的设置,而只执行最后的ENTRYPOINT指令 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压), 可以访问网络资源,类似wget |
COPY | 功能类似ADD,但是不会自动解压文件,也不能访问网络资源 |
WORKDIR | 工作目录,类似于 cd 命令 |
ARG | 用于指定传递给构建运行时的变量 |
VOLUMN | 容器数据卷,用于数据保存和持久化工作 |
EXPOSE | 指定于外界交互的端口 |
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用 USER 指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户 |
示例
修改mysql官网镜像时区
mysql 镜像默认不是中国时区时间
Dockerfile :
FROM mysql:5.7.31
# 作者信息
MAINTAINER mysql from date UTC by Asia/Shanghai "laosiji@lagou.com"
ENV TZ Asia/Shanghai
build 镜像:
docker build --rm -t lagouedu/mysql:5.7 -f Dockerfile-mysql .
运行容器:
docker run -itd --name mysql --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin lagouedu/mysql:5.7
# 观察时间是否与windows系统的时间一致
docker exec -it mysql date
部署微服项目
MySQL
制作mysql镜像,优化官网镜像
-
优化镜像时区问题
-
在容器启动时,直接导入lagou.sql数据库
FROM mysql:5.7.31
# 作者信息
MAINTAINER mysql from date UTC by Asia/Shanghai "laosiji@lagou.com"
ENV TZ Asia/Shanghai
COPY lagou.sql /docker-entrypoint-initdb.d
# 制作镜像
docker build --rm -t lagouedu/mysql:5.7.1 -f Dockerfile-mysql2 .
# 运行容器
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql lagouedu/mysql:5.7.1 --character-set-server=utf8 --collation-server=utf8_general_ci
Spring Boot 应用
FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER laosiji Docker springboot "laosiji@lagou.com"
# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update --allow-untrusted add curl bash tzdata && \
rm -rf /var/cache/apk/*
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
# 指定参数
ARG JAR_FILE
# 复制文件
COPY ${JAR_FILE} app.jar
# 暴露端口
EXPOSE 8080
# 启动服务
ENTRYPOINT ["java","-jar","/app.jar"]
# 构建镜像
docker build --rm -t lagou/dockerdemo:v1 --build-arg JAR_FILE=dockerdemo.jar -f Dockerfile-springboot .
# 运行容器
docker run -itd --name dockerdemo -p 18080:8080 lagou/dockerdemo:v1
# 测试
curl localhost:18080/f1
# 返回json格式内容
IDEA 集成 Docker
修改 Docker 配置
vim /usr/lib/systemd/system/docker.service
# 在ExecStart行最后增加,开放远程主机访问权限
-H tcp://0.0.0.0:2375
# 最后增加修改内容如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
# 重启docker
systemctl daemon-reload
systemctl restart docker
# 查看docker进程,发现docker守护进程在已经监听2375的tcp端口
ps -ef | grep docker
# 查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听
netstat -tulp | grep 2375
修改 IDEA 配置
设置 -> 构建、执行、部署 -> Docker -> +
新增 docker 服务器配置信息
配置内容如下:
name: Docker-DevCloud
TCP Socket:
Engine API URL: tcp://9.134.72.146:2375
配置成功后,会在idea开发工具下方窗口"8.services"里显示信息,右键点击connect。连接成功可以查
看到container和images等信息。可以对container和images进行各种相关操作。