docker 工作 #打包镜像 (两种写法)docker save -o nginx.tar nginx:1.21.5docker save nginx1.21.5 nginx.tar#上传镜像docker load -i nginx.tardocker load nginx.tar#简单启动run一下测试打包是否正常docker是否可用docker run -d -p 82:80 nginx:1.21.5#常见启动run时使用的参数--name-v 挂载没有/就是卷挂载可以docker volume ls查到有就是普通文件挂载-d 后台启动-p 指定端口映射--restartalways#进入容器内部docker exec -it id /bin/bash#想要修改里面容器里面的文件就提前挂载出来在外面修改#部署私有镜像仓库docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restartalways --nameregistry registry:latest#删除容器#写错名了删个容器docker rm regietry#删镜像docker rmi registry:latest#查看容器进程docker top name#上传镜像到仓库#先打标签docker tag nginx:1.21.5 127.0.0.1:5000/nginx:latest#再上传docker push 127.0.0.1:5000/nginx:latest#查看是否上传成功curl 127.0.0.1:5000/v2/_catalog#docker常见命令docker logs -fdocker images -q #获取镜像iddocker ps -qdocker ps -adocker inspectdocker execdockers history 可以看到镜像构建的过程docker stats 查看容器状态docker volume ls 查看数据卷#不像进容器内部只是执行一些查看命令(比如查看容器top)docker exec -it name top#查看容器镜像的占用信息docker system df#docker网络模式#bridge 桥接#host#none拥有自己的网络空间完全与其他隔离安全性高无法通过网络模式访问到#docker自定义网络驱动是桥接模式网段是192.168.133.0网关是192.168.133.1#容器通信1.一般容器内通信是通过容器名称通信而不是ip2.而要通过容器名可以是自定义网络时指定都在同一个(docker network create netwokname)所创建的网络3.如果是要使用默认的docker0的需要两个容器创建时用--link 对方的容器名4两个不同网络的如何通信connect相当于多加了了一块网卡在原网络的基础上嵌套了一个目标连接的网络docker network connect net1 net2#查看启动命令runlike#先安装python环境yum install python3 python3-pip -ypip3 install runlikeecho export PATH$PATH:/usr/local/bin /etc/profilesource /etc/profile#查看nginx容器启动时的容器参数runlike nginx#dockerfile——(解决镜像的一些构建问题)执行命令docker build 路径或url# -f 参数可以指定哪个文件是dockerfile文件不用文件名是Dockerfile,后面都要跟上dockerfile所在目录路径docker build -f /dockerfile-dir/test/dockerfile-dirdocker build -f /dockerfile-dir/test.# -t 参数是构建镜像时给标签命名和版本,docker build . -t centos:v1#dockerfile内容#dockerfile书写例子#容器的基础镜像ARG jdk11FROM openjdk:$jdk#通过arg传参不填就用默认的#lable对镜像的一些描述信息LABLE version1.0.0#user指定只有执行命令的用户USER workuser#ENV设置环境变量ENV JAVA_ENV devENV APP_NAME test#一次性定义多个也可以用keyvalue并空格隔开ENV JAVA_ENVdev APP_NAMEtest#RUN执行一些shell命令RUN mkdir -p /www/index#ADD 复制文件并解压一些文件左src 右destADD /www/html /etc/nginx/html#设置容器内的工作目录如果目录不存在会创建WORKDIR /app#expose暴露端口实际这个还不能通过宿主机访问要想访问得要run的时候-p 80:80,加个tcp并没有限制作用只是一个描述其实udp也可以通信expose 80expose 8080/tcp#CMDENTRYPOINT容器启动时执行的命令区别同时执行多个cmd会被覆盖只取最后一个entrypoint不会CMD [ping qq.com]ENTRYPOINT [java,-jar,xxxx.jar]#HEALTHCHECK健康检查FROM 基于某个基础镜像开始构建RUN 构建镜像时可以执行的命令#RUN两种写法一种直接shell命令 一种用json格式[yum,install,-y,nginx],用shell就是用子进程可以基础前面设置的环境变量而json会新开一个主进程之前的环境变量就失效了推荐用shell#内有乾坤这个run如果重复执行时会判断这个步骤也没有变如果变了就会执行没变就会利用缓存use cache,不仅是命令变步骤变也一样相同命令原本是step2变成3了也会重新执行是一旦哪一步开始变化后面的内容都会重新执行即使步骤和命令没变所以要新增run内容最好在最后加CMD ENTRYPOINT#这是生产镜像最标准的写法ENTRYPOINT 定程序CMD 给默认参数。#cmd会被参数覆盖entrypoint不会RUN 做蛋糕的时候加面粉、奶油、水果烤好就固定了ENTRYPOINT 蛋糕的主胚子一直是它CMD 默认配的叉子你想换勺子也可LABEL 对镜像的一些描述EXPOSE 对外暴露端口只暴露不映射ENV 环境变量ARG 也是环境变量可以在构建时动态传参但也只有在构建时起作用build例 docker build . --build-argBUILD_VERSION3.0ADD#add,copy都可以传文件但add可以自动解压但有时会解压失败COPY#所以更通常用copy然后用run解压VOLUME /data#就是把容器里的/data直接创建卷并挂载过去默认在/var/lib/docker/volume/不能实现目录挂载docker-compose.yml才可以USER#指定某个用户执行run cmd entrypointWORKDIR#指定工作目录onbuild 再执行基础镜像前需要执行的操作healthcheck 健康检查#基于sprintboot构建镜像#部署war包#docker-compose.yml——镜像的使用#docker-compose应用docker compose config 检查语法docker compose up -d#有时第一次构建错了只改了文件就再次构建会有缓存任然拿旧镜像搞的一直错可以加--build#容器停止down不要轻易用不然有一些数据卷会重启启动数据丢失docker compose pause#flask-web简单部署version: 3.6 #必须services: #必须flask: #服务名自己取build: . #dockerfile路径ports:- 5000:5000container_name: flask #镜像名networks: #网络- webredis:image: redis #不用dockerfile就用imagecontainer_name: redis2networks:- webvolumes:- redis_data:/data #卷挂载networks:web:driver: bridgevolumes: #创建卷redis_data:driver: local#elk部署#docker 地址Docker Elastic