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文件,没有后缀名。
然后编辑这个文件,复制上面的命令进去。
复制时,注意删掉#后面的注释,如下图:
然后CD到这个目录,执行命令。
docker build -t kiba-test-image:latest .
注意最后的 【. 】必须有。
执行结果如下:
然后查询镜像。
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包。
现在,我们创建一个容器
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-alpine
和java: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
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!