1.1、服务器docker安装
找下对应的安装环境,本地还是生产环境,搜下安装教程
1.2、docker配置、命令
1.2.1、配置文件
位于/etc/docker/daemon.json
常见配置:
默认网段: "bip": "168.188.0.1/16" 文件存储路径: "data-root": "/data/lib/docker" 镜像仓库: "registry-mirrors": [ "https://reg-mirror.qiniu.com", "http://hub-mirror.c.163.com" ] 日志相关: #日志驱动 "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } 存储驱动: "storage-driver": "overlay2" 私有仓库信任: "insecure-registries": [ "http://172.20.1.208:8080" ]
docker日志驱动类型:
改完保存配合文件,重启docker,docker info可以查看docker一些配置信息
1.2.2、镜像
docker pull xx 仓库拉取镜像(默认中央仓库) ,默认latest版本 中央仓库地址: https://hub.docker.com/ docker images -a 展示所有镜像 docker load -i xx.rar 导入镜像 docker save cent:v1 -o ~/desktop/xx 保存镜像 docker login --username=xx --password=xxx1234! https://dockerhub.yndk.cn 登陆私有仓库 docker push dockerhub.yndk.cn/fwgl/fwgl-consumer-app:1.8 推送镜像
1.2.3、容器
docker run -d -p 8090:8090 -v `pwd`/my_opts:/opt/iserverOPTs supermap/iserver:latest 启动一个容器 -d 后台运行 -v 挂载 -p 端口映射出来 -it xx bash 进入镜像交互 --restart=always 开机自启动 --name yolov3_spp 起个名称 docker ps -a 查看所有容器 docker stats --no-stream -a 容器占用资源情况查看
1.2.4、dockerfile & docker build构建镜像
FROM python:3.6-alpine 基础镜像(alpine精简版 - 安全) ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python", "app.py"]
docker build -t nginx:v3 . 打镜像
-t 是选项 指定新定义镜像名称、版本
后面那个 . 指的是镜像操作上下文,docker本身是一个cs架构,我们的命令行好比一个客户端,通过命令 然后转成restAPI然后去访问docker engine 我们的docker build命令也是在服务端进行构建镜像的,同时 有时候我们的构建里 不仅仅是run指令还有其他指令 比如 copy add这些,用来给镜像添加文件, 这时候构建之前需要把所需的文件拷贝到服务端engine,然后再进行操作,这时候就需要指定需要拷贝的文件所在的路径,也就是镜像上下文
一般是 新建一个目录 把需要的文件 和 Dockerfile一起放进去 特别是别放在根目录下 太大了!
Sending build context to Docker daemon 2.048 GB <---像这样,这句表示要发给docker守护进程要打镜像了,文件有多大!
.dockerignore 配置文件可以写不需要拷贝到镜像的文件
docker build本质还是docker的daemon守护进程在基础镜像基础上,开始一条条的执行每一行命令,没执行一行就会commit一次!docker 镜像其实本质是文件目录,可以把镜像解压缩,可以看到每个镜像都是一些文件组成的,包含一个manifest元信息文件,里面记录了该镜像对应的配置文件(开放端口、挂载目录、环境变量)、层文件(具体文件)、清单文件(需要哪些文件)拉取镜像时候会先拉 manifest文件,然后再根据manifest拉取各类清单文件,如果清单文件本地有则不用获取(上传也是一个道理 避免重复)
docker构建一些要点:
1、精简、官方镜像
2、RUN等命令合并
3、上下文、.dockerignore 可以写不需要处理的文件
4、分阶段构建,基础环境打一个镜像,使用打一个,类似 cent:v1 公司object
官方构建文档:
https://docs.docker.com/engine/reference/builder/
1.CMD docker 容器启动之后 默认运行的命令,docker容器本身也是一个进程,CMD意思是这个进程启动之后运行的命令!可以在启动容器时候 + 命令 替换默认的! ----> docker run xxx cat xxx 2.ENTRYPOINT 也是添加容器启动时候去运行的命令 和 参数,但是区别在于 ENTRYPOINT 会把 启动时候的参数 和 dockerfile写的命令拼接起来一起执行 而CMD 是启动时的参数直接替换原本dockerfile写的参数! 3.RUN && 可以把多条指令融合, 顺序执行! 每条指令的末尾 可以加 \表示换行! 每行开头可以加 #注释 如果有下载安装过程,最后一条命了需要把多余的安装包给清理掉! apt-get purge -y --auto-remove $buildDeps docker是多层存储的 前一层的内容不会被后一层操作!要是留着安装包 永远操作不了了! 4.ENV name=xyl age=xxx 设置环境变量,便于统一管理操作! 5.ARG 也是设置环境变量,但是在容器运行时候 这些环境变量都会被替换成 值引用不再存在,但是可以在docker history里查看历史! --build-arg <参数名>=<值> 可以在docker build --build-arg <参数名>=<值> 来替换默认的变量! 6.VOLUME /data 匿名卷,为了避免用户运行容器时候 忘记创建数据卷添加的匿名卷! 可以在 docker run -v myvolume:/data xx替代匿名! 7.EXPOSE <端口1> [<端口2>...] 只是声明容器可能用这个端口! 并不会真的暴露! 8.WORKDIR 如该目录不存在,WORKDIR 会帮你建立目录,创建的目录 是相对于当前的路径的 比如 workdir /a workdir b --> /a/b这样! 目录不存在帮忙创建! UN 分层存储,每层都是一个新的工作目录 互相不影响、不能操作!WORKDIR 意思是之后的层都用统一的工作目录 可以相互操作! 9.USER 跟WORKDIR一样,WORKDIR是改变统一的工作目录,USER是改变工作用户!但是这个用户需要存在! 10.Label "key" = "value" key="value" 可以添加多个,主要是给容器添加元数据! 11.Add 有缺点,可能导致镜像缓存失效,从而导致镜像构建的特别慢! 12.COPY /xx /xx 这里copy的源 目录是相对于工作目录的(就是docker build xx . 最后这个点对应的目录!)
1.2.4、docker网络相关
docker port dockerId 查看容器开放端口
https://www.jianshu.com/p/04b33284f742
1、如果你对一个容器使用的是host网络驱动,这个容器的网络栈并不是和docker宿主机隔离的。例如,你启动了一个容器绑定的是80端口,使用的host网络驱动,而你的应用程序将使用主机的ip和端口。 host驱动只支持 Linux 且必须打开端口! 2、bridge 桥接网络,虚拟网络设备,连接 docker容器 和 外部网络! 3、OverLay网络 多个 docker宿主机 之间架构了一个分布式网络!允许加入该网络的容器互联! 4、none 禁用网络 5、container模式 container: docker镜像内部通信 * docker run -it --name xx1 image sh * docker run -it --name xx2 --network xx1 image sh
1.2.5、docker-compose
version: "" https://docs.docker.com/compose/compose-file/ 这个version不是随便写的! 需要跟版本对应!! services: image: xxx/xx build: context: ./ dockerfile: xxx/xxx args: depends_on: -db -redis ---> 依赖镜像, 服务不会等待 redis db 「完全启动」之后才启动,只要依赖开始启动就算! 启动xxx时候 也会启动depends,关闭时候先关闭xxx再关闭依赖! dns: - 8.8.8.8 - 114.114.114.114 env_file: - ./common.env - ./apps/web.env - /opt/secrets.env 在配置文件设置环境变量! 如果与environment冲突,则以environment为主! 配置文件注释可以以 # 开头的注释 相对于compose.yml路径! healthcheck: 健康检查! test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 network_mode: "bridge" networks: ports: ulimits: nproc: 65535 最大进程数 nofile: 文件数 soft: 20000 hard: 40000 volumes: - /var/lib/mysql logging driver: "json-file" options: max-size: "200k" max-file: "10"
docker-compose -f xxx.yml up -d 启动容器 docker-compose -f xxx.yml down