此篇为Docker笔记,文章可能存在疏忽,建议直接观看原视频。
视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0
DockerFile
就是脚本。
构建步骤:
- 编写一个dockerfile文件;
- docker build 构建成为一个镜像;
- docker run 运行镜像;
- docker push 发布镜像(发布到DockerHub…)
例如:centos的dockerfile脚本:
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
DockerFile构建过程
DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 作者,一般是姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 例如:添加tomcat镜像
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口,与-p用处相同
CMD # 指定容器启动时要运行的命令,多个CMD只有最后一个会生效,替换
ENTRYPOINT # 指定容器启动时要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile时,会运行ONBUILD指令(触发)
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
构建自己的centos:
# 官方的centos
root@zhucz:~$ docker run -it centos
[root@fbcf12bb6fad /]# ifconfig
bash: ifconfig: command not found
# 1. 编写DockerFile文件
FROM centos
MAINTAINER zhucz<1138609280@qq.com>
ENV MYPATH /usr/local
WORkDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end-----"
CMD /bin/bash
# 2. 通过DockerFile构建镜像
root@zhucz:/home/dockerfile# docker build -f myCentosDockerFile -t mycentos:0.1 .
...
Successfully built 7700dd0256a3
Successfully tagged mycentos:0.1
# 3. 测试运行
root@zhucz:/home/dockerfile# docker run -it mycentos:0.1
[root@f6af41485939 local]# pwd
/usr/local # WORKDIR 设置的工作目录
[root@f6af41485939 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 27 bytes 3152 (3.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
补充:查看镜像的历史变更:
docker history 镜像id
CMD 和 ENTRYPOINT区别
测试CMD:
# 1. 编写 dockerfile 文件
root@zhucz:/home/dockerfile# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
# 2. 构建镜像
root@zhucz:/home/dockerfile# docker build -f dockerfile-cmd-test -t cmdtest .
# 3. 运行镜像 —— 发现 ls -a 生效
root@zhucz:/home/dockerfile# docker run c1f1e542aa13
.
..
.dockerenv
bin
dev
etc
home
lib
# 4. 测试追加命令 -l,报错,实际为 -l 替换了 ls -a 导致无法识别 -l 命令
root@zhucz:/home/dockerfile# docker run c1f1e542aa13 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
测试ENTRYPOINT:
root@zhucz:/home/dockerfile# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls","-a"]
root@zhucz:/home/dockerfile# docker build -f dockerfile-entrypoint-test -t entrypointtest .
root@zhucz:/home/dockerfile# docker run 4a5ea0981c5d
.
..
.dockerenv
bin
dev
etc
home
lib
# 测试追加-l,ls -a ===> ls -al
root@zhucz:/home/dockerfile# docker run 4a5ea0981c5d -l
total 56
drwxr-xr-x 1 root root 4096 Oct 10 03:12 .
drwxr-xr-x 1 root root 4096 Oct 10 03:12 ..
-rwxr-xr-x 1 root root 0 Oct 10 03:12 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Oct 10 03:12 dev
drwxr-xr-x 1 root root 4096 Oct 10 03:12 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
构建Tomcat镜像
- 准备jdk、tomcat压缩文件
-
编写Dockerfile文件(官方命名:Dockerfile,build时会自动寻找这个文件)
FROM centos MAINTAINER zhucz<1138609280@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u202-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.54.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_202 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.54 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
-
构建镜像
root@zhucz:/home/zhuchangzhen/tomcat# docker build -t mytomcat ....Successfully built c705485cda76Successfully tagged mytomcat:latest
-
启动
root@zhucz:/home/zhuchangzhen/tomcat# docker run -d -p 9090:8080 --name zhucztomcat -v /home/zhuchangzhen/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps/test -v /home/zhuchangzhen/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.54/logs mytomcat
-
发布项目(由于做了挂载,可以直接在本地编写项目发布)
# 本地/test/WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> </web-app> # /test/index.html <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>hello zhucz</title> </head> <body>Hello World!<br/> <%out.println("你的 IP 地址 " + request.getRemoteAddr());%> </body></html>
-
访问
发布镜像到DockerHub
# 登录
root@zhucz:/home# docker login -u 18845634889
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
root@zhucz:/home# docker tag c705485cda76 18845634889/mycentos:1.0 # 标签改成 Docker ID + 镜像名:版本号
root@zhucz:/home# docker push 18845634889/mycentos:1.0
The push refers to repository [docker.io/18845634889/mycentos]
925b6392f7c7: Pushed
9eea98a815df: Pushing [====================> ] 6.478MB/16.04MB
34265b5ff1f2: Pushing [> ] 7.12MB/402.5MB
95ee41225d95: Pushed
74ddd0ec08fa: Pushing [==================================================>] 233MB