前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile和DockerCompose的使用

Dockerfile和DockerCompose的使用

作者头像
Kiba518
发布2024-03-15 08:29:39
2540
发布2024-03-15 08:29:39
举报
文章被收录于专栏:Kiba518

前言

学习命令的正确方式,其实是先手动操作一个简单的命令,然后了解命令的基本含义,然后再看命令的相关文章。

所以,网上哪些docker的文章,基本上都不适于学习入门。

基础命令

基础命令如下:

代码语言:javascript
复制
FROM openjdk:8-jre-alpine
LABEL author="kiba <xxx@126.com>" # 镜像描述
LABEL describe="test image" #镜像描述
MAINTAINER kiba <xxx@126.com> # 作者
COPY java /opt/program # 复制java文件夹的内容到 /opt/program 不存在的目录自动创建
EXPOSE 8520 #明确指定容器运行时需要暴露的端口。这个指定一般来说不用,因为创建容器时会用 -p来暴露端口
ENTRYPOINT ["java", "-jar", "/opt/program/app-kiba-spring-kafka-1.0.0.jar"]

首先连接linux,然后创建一个文件夹,然后创建一个Dockerfile文件,没有后缀名。

然后编辑这个文件,复制上面的命令进去。

复制时,注意删掉#后面的注释,如下图:

然后CD到这个目录,执行命令。

代码语言:javascript
复制
docker build -t kiba-test-image:latest .

注意最后的 【. 】必须有。

执行结果如下:

然后查询镜像。

代码语言:javascript
复制
docker images

如下图,我们多了一个自定义镜像。

现在,我们再来了解一下命令含义。

  • FROM:指定基础镜像,后续的指令将基于这个基础镜像进行构建。
  • RUN:在容器中执行命令。可以执行任意的命令,例如安装软件包、执行脚本等。run执行的命令都是在创建镜像时执行的,并不是在创建容器时执行的。
  • COPY:将文件从宿主机复制到容器中。可以是单个文件,也可以是整个目录。COPY的目标目录不存在会自动创建。
  • ADD:与 COPY 类似,但还可以从 URL 下载文件并添加到容器中。
  • ENV:设置环境变量。
  • EXPOSE:暴露容器中的端口,使其可以被外部访问。
  • CMD:指定容器启动时执行的命令。
  • ENTRYPOINT:与 CMD 类似,但 ENTRYPOINT 命令会覆盖 Dockerfile 中后续的 CMD 命令。它的参数用逗号分隔,这里的逗号分隔,等于命令里的空格。
  • VOLUME:创建一个数据卷,用于容器与宿主机之间共享数据。
  • USER:指定运行容器时的用户。
  • WORKDIR:设置容器的工作目录 类似于CD到了这个目录 ,该命令后面的命令,如RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目录下作为当前工作目录。例如:WORKDIR /opt
  • ARG:定义构建时的参数,这些参数可以在构建时通过命令行进行传递。

了解了命令内容,就知道了,刚才的命令是从网上下载一个openjdk:8-jre-alpine镜像,然后对其进行编辑,并复制了一个jar包进去,然后,要求该镜像,创建容器时,启动这个jar包。

现在,我们创建一个容器

代码语言:javascript
复制
docker run -it -d --name kiba-test-container -p 8051:8520 kiba-test-image:latest

注意:这里的-d一定要加,不然docker就会在前台运行。

如果不加-d,就是在前台运行,可以使用Ctrl+C退出。

删除容器相关命令如下:

代码语言:javascript
复制
docker rm kiba-test-container # 删除容器
docker ps -a # 查看全部容器
rmi kiba-test-image # 删除镜像
docker images # 查看全部镜像

因为copy命令复制的文件夹下,还有个startup.sh,然后就尝试一下用sh启动。

但结果不尽如人意,一直未能启动成功。

尝试错误命令组合如下:

代码语言:javascript
复制
#RUN chmod 777 /opt/startup.sh
#ENTRYPOINT ["sh", "/opt/startup.sh"] #启动异常  Exited
#RUN chmod u+x /soft/app-kiba-spring-kafka/startup.sh
#RUN chmod 777 /startup.sh
#ENTRYPOINT ["sh", "/startup.sh"] #启动异常  Exited 
#ENTRYPOINT ["./startup.sh"] #启动异常 exec ./startup.sh: exec format error
# CMD ["sh", "/startup.sh"] #启动异常  Exited 
# CMD ["/startup.sh"] #启动异常  Exited docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/startup.sh": permission denied: unknown.
#CMD ["/startup.sh"] 启动异常  Exited

上网调查了一下,有说能运行sh的,有说不能运行sh的。想来是比较麻烦,不过命令可以直接运行,sh运行不了也不用太纠结。

创建镜像

经过测试,感觉还是自动创建镜像更加省心。

创建镜像

创建镜像命令。

代码语言:javascript
复制
docker pull java:openjdk-8u111-jre
docker run -it -d  --name kiba-test-custom -p 8052:8520 java:openjdk-8u111-jre /bin/bash
docker exec -it kiba-test-custom /bin/bash

下面这个命令不成立,因为openjdk:8-jre-alpine没有/bin/bash。

代码语言:javascript
复制
docker run -it -d  --name kiba-test-custom -p 8052:8520 openjdk:8-jre-alpine /bin/bash

openjdk:8-jdk-alpinejava:openjdk-8u111-jre都是Java的安装包,但它们的来源和用途略有不同。 openjdk:8-jdk-alpine是基于Alpine Linux构建的轻量级JDK版本,它包含了Java运行环境所需的基本组件,体积更小巧,适合于资源有限的环境。你可以使用它在Docker容器中运行Java应用程序。 java:openjdk-8u111-jre则是OpenJDK发行的标准JRE(Java Runtime Environment),它包含Java虚拟机(JVM)和Java应用程序所需的类库。它是一个独立的安装包,可以在各种操作系统上安装和使用。

然后使用docker cp复制文件。

代码语言:javascript
复制
docker cp /soft/resources/app-kiba-spring-kafka-1.0.0.jar  kiba-test-custom:/resources/app-kiba-spring-kafka-1.0.0.jar

然后,再手动处理容器,让jar可以运行,再将这个容器提交为新镜像。

代码语言:javascript
复制
docker commit kiba-test-custom kiba-test-custom-image;

然后再使用自定义镜像,这样用起来更方便。

docker compose

再同级目录编写docker-compose.yml文件,编写代码如下:

代码语言:javascript
复制
version: "2.22.0"

services:
  kibaDocker:
    build:
      context: .
      dockerfile: Dockerfile
    image: kiba-tewt-image_10
    container_name: kiba-test-container-10
    ports:
      - 8529:8520 # 宿主:容器

version对应上dockercompose就行,对不上也行。

然后下面的内容,就可以字面理解了,就上面手动创建容器的命令。

然后执行。

代码语言:javascript
复制
docker-compose up -d

-d是后台运行的意思。

然后就正式运行成了。访问http://10.1.0.145:8529/code/doc.html即可

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 基础命令
  • 创建镜像
  • docker compose
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档