docker 进阶 一、dockerfiledockerfile是构建自定义镜像的文本文件编写dockerfile文件docker build命令构建镜像dockerfile格式要求① 每条保留字指令都必须为大写字母且后面要跟随至少一个参数② 指令按照从上到下顺序执行③ #表示注释④ 每条指令都会创建一个新的镜像层对镜像进行提交docker执行dockerfile的大致流程docker从基础镜像运行一个容器执行一条指令并对容器作出修改执行类似docker commit的操作提交一个新的镜像层docker再基于刚提交的镜像运行一个新容器执行dockerfile的下一条指令直到所有指令都执行完成语法FROM当前继承的基础镜像以该镜像作为模板MAINTAINER镜像维护者的姓名和邮箱地址RUN容器构建时需要运行的命令等于在终端操作的shell命令EXPOSE当前容器对外暴露出的端口WORKDIR指定在创建容器后终端默认登陆docker exec -it 时进入的工作目录USER指定该镜像以什么样的用户去执行如果都不指定默认是rootENV设置环境变量这个环境变量可以在后续的所有RUN指令中执行或引用举例定义ENV CATALINA_HOME /usr/local/tomcat引用WORKDIR $CATALINA_HOMEVOLUME容器数据卷ADD将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包相当于COPY解压COPY从容器内拷贝文件到主机上docker cp 容器ID:容器内路径 目的主机路径CMD指定容器启动后要干的事情CMD[可执行文件参数1参数2…]举例CMD[“catalina.sh”,“run”]dockerfile中可以有多个CMD指令但只有最后一个生效CMD会被docker run之后的参数替换举例docker run -it -p 8080:8080 容器号 /bin/bash会直接把 CMD[“catalina.sh”,“run”]所以默认运行时最好不要在docker run后带其他参数会覆盖dockerfile中原本的定义CMD与RUN的区别CMD是在docker run时运行RUN是在docker build时运行ENTRYPOINT构建一个自定义镜像测试centos上安装vim、ifconfig和java8① 编写dockerfile文件vimDockerfile 文件内写入 FROM centos MAINTAINER zzyyzzyybs126.comENV MYPATH /usr/local WORKDIR$MYPATH#安装vim编辑器RUN yum-yinstallvim#安装ifconfigRUN yum-yinstallnet-tools#安装java8及libs库RUN yum-yinstallglibc.i686 RUNmkdir/usr/local/data#把外部的java jar包复制到容器中安装包必须要与dockerfile同一位置#ADD命令会自动拷贝并解压ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/#配置java环境变量ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 ENV JRE_HOME$JAVA_HOME/jre ENV CLASSPATH$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHENVPATH$JAA_HOME/bin:$PATHEXPOSE80CMDecho$MYPATHCMDechosuccess-----okCMD /bin/bash② 在dockerfile文件目录下执行build并给镜像命名名字:tagdockerbuild-tcentosjava8:1.5③ 运行dockerrun-it新镜像名字:tag /bin/bash二、docker network网络类型bridge、host、none、containerbridge模式docker服务会默认创建一个docker0的bridge类型网桥将docker下的所有容器都连入这个网桥内docker默认指定了docker0的IP地址和子网掩码查看bridge网络详细信息查看docker0dockernetwork inspect bridge|grepnameifconfig整个宿主机的网桥是docker0交换机的接口是veth而每个容器实例的对应网卡叫eth0两者两两配对命令dockerrun-d-p8081:8080--nametomcat1 billygoo/tomcat8-jdk8host模式与宿主机共享IP地址和端口不经过NAT转换容器没有自己的网卡与host共享网卡命令需要加–network host参数不需要配置端口映射错误dockerrun-d-p8081:8080--networkhost--nametomcat3 billygoo/tomcat8-jdk8正确dockerrun-d--networkhost--nametomcat3 billygoo/tomcat8-jdk8none模式none模式下不对docker容器进行任何网络配置容器内只有127.0.0.1一个回环网络需要手动添加网卡、配置IPcontainer模式容器没有自己的网卡而是其他的某个容器共享网卡只有网卡共享其他还是隔离的与host的区别是host是与宿主机共享网卡而它是与其他的某个容器共享网卡当关闭携带网卡的容器时共享网卡的容器网卡就会失效自定义模式121323213三、docker compose可以管理多个相关联的容器service 服务共同组成一个应用project 工程需要定义配置文件docker-compose.yaml核心来管理需要的容器只需一个命令就可以启停这些容器docker-compose步骤1.编写dockerfile构建各种镜像文件2.使用docker-compose.yml定义一个完整的业务单元安排应用中的各个容器服务redis、mysql、spring3.使用docker-compose up命令初始化并启动整个应用程序完成一键部署启动docker compose常用命令#启动服务dockercompose up#启动服务后台运行dockercompose up-d#开启服务dockercompose start#停止服务dockercompose stop#重启服务dockercompose restart#禁止使用停止并删除容器、网络、卷和镜像dockercompose down禁止使用 查看类#查看当前的所有容器dockercomposeps#查看当前的所有容器进程dockercomposetop#更改yaml文件内容dockercomposeexecdocker-compose.yaml#检查配置有没有语法错误dockercompose config#检查配置有问题才输出dockercompose config-qdockercompose logs四、docker compose下载docker compose的版本有最低支持版本默认下载最新的版本可以使用yum install或apt installyum install docker-compose但不推荐默认安装的版本较旧推荐直接从官网下载官网https://github.com/docker/compose/releases在assets下下载 docker-compose-linux-x86_64将docker-compose-linux-x86_64重命名为docker-compose然后将其放在/usr/bin或/usr/local/bin目录下#直接执行会提示没有权限需要给docker-compose执行权限docker-compose--version# 确认当前安装的版本-bash: /usr/bin/docker-compose: 权限不够#赋予执行权限chmodx /usr/bin/docker-compose#再次尝试执行docker-compose--versionDocker Compose version v5.1.1卸载方式如果是用文件方式安装#直接删除rm/usr/bin/docker-compose五、发布微服务部署到docker容器IDEA里将工程编译打包成jar包编写Dcokerfile将jar包与Dcokerfile放入同一目录下构建镜像docker build -t运行容器docker run -d访问测试有可能会报防火墙错误需开放本机的防火墙端口编写Dcokerfile将jar包与Dcokerfile放入同一目录下#基础镜像使用javaFROM java:8#作者MAINTAINER zzyy#VOLUME指定临时文件为/tmp在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmpVOLUME /tmp#将jar包添加到容器中并更名为zzyy_docker.jarADD docker_boot.jar zzyy_docker.jar#运行jar包RUNbash-ctouch /zzyy_docker.jarENTRYPOINT[java,.jar,/zzyy_docker.jar]#暴露6001端口作为微服务EXPOSE6001无、虚悬镜像构建或删除镜像时出现错误导致仓库名或标签为none可以用docker image prune删除