最近疫情闹的,在家温习之前在私塾在线买的cc老师的课程Docker,为了加深印象及鞭策一下自己换高薪工作,坚持做系列笔记,记录自己成长的点点滴滴。不过看到消息cc老师最新一期的高级架构师课程也要推出了,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像是由一系列文件系统叠加而成:
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
指定一个已经存在的镜像,也是构建的基础镜像,Dockerfile的第一条必须是FROM
设置作者,联系邮件
指定要运行的命令,建议使用数组的格式,也是exec的格式,如:
RUN[“apt-get”,”install”,”-y”,”nginx”]
向容器外部公开容器内的端口
指定在创建容器的时候,在容器内部设置一个工作目录,entroypoint和CMD指定的程序会在这个目录执行
可以在docker run中使用-w来覆盖工作目录
指定该镜像以什么样的用户去执行,可以单独指定用户,也可以指定用户和组,格式:USER uid:gid,可以在docker run中通过-u来覆盖,如果都不指定,默认是root
指定一个容器启动时要运行的命令,如果指定了多条CMD,只有最后一条会执行
例如:CMD[“/bin/bash”,”-l”]
如果在docker run 后面跟上要执行的命令,会覆盖Dockerfile里面的cmd指定的命令
也用来指定一个容器启动时要运行命令
用来在构建镜像过程中设置环境变量,例如:
ENV MY_PATH /usr/my
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,比如:
WORKDIR $MY_PATH
可以在docker run 命令中使用 –e来指定环境变量,这些变量只在运行时有效
小技巧:
可以在不需要构建缓存的前面,添加一个ENV语句,这样,要后面更新的时候,就修改一下这个ENV的值
用来将构建环境下的文件或目录复制到镜像中。
注意:ADD会使得构建缓存无效,ADD后续指令都不能使用之前的构建缓存了
类似于ADD,COPY只做构建上下文中复制文件,而不会去做文件提取和解压的工作
如果源文件是目录,那么这整个目录会被复制到容器中
用来向镜像创建的容器添加卷,一个卷是可以存在于一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化:
指定当镜像做为其它镜像的基础镜像时,该镜像触发执行的功能。
ONBUILD在子镜像build的时候,在FROM之后就先执行,并且只能被执行一次,不会被孙镜像继承
以制作一个tomcat9的镜像为例。
下载好要使用的jdk和tomcat,这里下载的是:
jdk-8u144-linux-x64.tar.gz
apache-tomcat-9.0.1.tar.gz
FROM ubuntu MAINTAINER cc #把java与tomcat添加到容器中 ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.1 /usr/local/apache-tomcat-9.0.1 #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.1 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.1 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # CMD ["/usr/local/apache-tomcat-9.0.1/bin/catalina.sh","run"] # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.1/bin/startup.sh" ] CMD /usr/local/apache-tomcat-9.0.1/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.1/bin/logs/catalina.out
docker build -t cctomcat9 . ,注意后面有个 . ,表示在当前路径找Dockerfile
apache-tomcat-9.0.1
apache-tomcat-9.0.1.tar.gz
Dockerfile
jdk-8u144-linux-x64.tar.gz
docker run -i -t -d -p 9080:8080 --name myt9 -v /ccdockermake/tomcat9/test:/usr/local/apache-tomcat-9.0.1/webapps/test -v /tomcat9logs/:/usr/local/apache-tomcat-9.0.1/logs --privileged=true cctomcat9
centos 7 Docker 启动一个web服务 但是启动时 报WARNING: IPv4 forwarding is disabled. Networking will not work.
编辑 /usr/lib/sysctl.d/00-system.conf
添加如下代码:net.ipv4.ip_forward=1
重启network服务:systemctl restart network
查看是否修改成功:sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了
关于web应用放的位置
静态引入:可以把web应用直接copy到容器中,分发方便
动态引入:就是如上这样把宿主机上的目录挂载到容器,方便调试
1:先把tomcat9镜像运行起来
2:进入运行中的容器:docker exec -it 容器id /bin/bash,当然,先通过docker ps获取容器号
3:进入运行起来的tomcat容器,删除掉webapps里面的东西,
然后再把自己的server.xml从宿主机拷贝到容器中,如:
docker cp ./server.xml 容器id:/usr/local/apache-tomcat-9.0.1/conf/server.xml
4:制作镜像
docker commit -m=“remove default webapps” -a=“cc” 容器id cctomcat:9.0