Kiba518

Kiba518

沈阳-架构-开发。

Fork me on GitHub

Dockerfile和DockerCompose的使用

前言

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

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

基础命令

基础命令如下:

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文件,没有后缀名。

image

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

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

image

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

docker build -t kiba-test-image:latest .

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

执行结果如下:

image

然后查询镜像。

docker images

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

image

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

  • 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包。

现在,我们创建一个容器

docker run -it -d --name kiba-test-container -p 8051:8520 kiba-test-image:latest

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

然后访问,我们的jar包的网站即可,如下:

http://10.1.0.100:8051/code/doc.html

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

删除容器相关命令如下:

docker rm kiba-test-container # 删除容器
docker ps -a # 查看全部容器
rmi kiba-test-image # 删除镜像
docker images # 查看全部镜像

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

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

尝试错误命令组合如下:

#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运行不了也不用太纠结。

创建镜像

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

创建镜像

创建镜像命令。

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。

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复制文件。

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可以运行,再将这个容器提交为新镜像。

docker commit kiba-test-custom kiba-test-custom-image;

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

docker compose

dockerfile是根据已有镜像,创建自定义镜像,docker compose是使用这个镜像创建一个容器。

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

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就行,对不上也行。

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

然后执行。

docker-compose up -d

-d是后台运行的意思。

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

数据卷 volume

创建数据卷命令。

docker volume create volume1

创建的卷位置默认在 /var/lib/docker/volumes/volume1/_data 下面,可以用下面命令查看。

cd /var/lib/docker/volumes/volume1/_data
ls

然后创建容器用下面命令,容器里的soft/data文件夹会自动创建。

docker run -it -d -v volume1:/soft/data --name kiba-test-container10-1 -p 8051:8520 kiba-test-image-10:latest

然后去/var/lib/docker/volumes/volume1/_data下面新建一个1.txt。

然后进入容器,执行ls,就能查看到1.txt。

docker exec -it kiba-test-container10-1 /bin/bash
cd /soft/data
ls

注:不能将容器生成时创建的文件夹,外放为数据卷,因为该文件夹初始化时不存在。

例如:镜像创建时,复制了一个文件夹到镜像里,然后想把这个文件夹外放成数据卷是不行的。

一些系统默认文件夹,如opt、bin、usr之类也是不行的。但/opt/1这样的子文件夹是可以的。

查看当前数据卷命令

docker volume ls

使用compose添加数据卷

使用compose添加数据卷命令如下,这里没有使用创建数据卷的模式,而是采用了文件夹对文件夹映射模式。

version: "2.22.0"

services:
testDocker:
image: kiba-test-image-10
container_name: kiba-test-container-11
ports:
- 8528:8520 # 宿主:容器
volumes:
- /soft/dockervolume:/soft/dockervolume

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18072670

posted @ 2024-03-14 17:16  kiba518  阅读(216)  评论(0编辑  收藏  举报