20221203 Docker 6. Dockerfile

参考资料

介绍

Docker 创建镜像主要有三种:

  1. 基于已有的容器创建;

  2. 基于 Dockerfile 来创建;

  3. 基于本地模板来导入;

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进行各种相关操作。

posted @ 2022-12-03 20:08  流星<。)#)))≦  阅读(73)  评论(0编辑  收藏  举报