Docker:开源的应用容器引擎;是一个轻量级容器技术
Dockerfile:用于创建镜像
Images:镜像,相当于一个root文件系统,用于创建容器的模板
Container:容器,镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体
Docker Compose:docker 容器的编排工具,主要就是解决相互有依赖关系的多个容器的管理
Docker Volume:数据卷积实现数据持久化
Docker Swarm:集群,管理批量容器
Docker Registry:docker仓库,算是代码控制中心,用来保存镜像
Docker 常用命令操作
docker image
docker images:列出所有镜像
docker images -q :仅列出镜像的 ID
docker pull nginx :下载镜像 nginx
docker rmi ImageID :删除镜像
docker inspect Jenkins :查看镜像 Jenkins 详细信息
docker tag ImageID 镜像源名:新标签名:设置镜像标签,如:docker tag imageID test2:v2
创建镜像,有两种方法:
1、从已经创建的容器中更新镜像,并且提交这个镜像
使用来创建一个容器,在运行中的容器的交互环境中执行指令 apt-get update,执行docker commit 提交容器副本
docker commit -m=" has update" -a="runoob" ContainerID runoob/ubuntu:v2
--- -m:提交的描述信息
--- -a:指定镜像作者
--- runoob/ubuntu:v2:镜像名称
2、使用Dockerfile 指令来创建一个新的镜像
需要 Dockerfile 文件创建,其中包含一组指令来告诉Docker 如何构建我们的镜像
共享 images
上传 image 到 Docker Repository
1、docker 登录 :docker login
2、推送:
1)构建一个image:docker build -t 用户名 / image . ;如:docker build -t youyou1/flask_app:latest .
2)推送image:docker push 用户名 / image 如:docker push youyou1/flask_app:latest
导出保存为压缩文件
docker save -o apitest.tar apitest:latest
导入压缩文件
docker load -i apitest.tar
docker container
docker build -t image :构建服务容器
docker run image :运行容器,如运行一个 image:docker run --name flask_app -d -p 8080:5000 flask_app
--- d:后台运行服务,想要进入容器需要使用指令 doker exec
--- p:是容器内部端口绑定到指定的主机端口
--- P :是容器内部端口随机映射到主机的端口
docker run -itd --name flask_app flask_app /bin/sh:运行并命名镜像 flask_app 的容器为 flask_app,并以命令行模式进入到容器当中交互
--- t :在新容器内指定一个伪终端或终端
--- i:允许你对容器内的标准输入,进行交互
docker ps :列出当前运行的容器
docker ps -a :列出系统中所有的容器
docker ps -l :查询最后一次创建的容器
sudo docker history centos :列出容器上运行的所有历史命令
docker top ContainsID :查看容器的进程
docker stats ContainsTD :查看容器的资源利用情况
docker stop ContainsID :停止容器
docker start ContainsID :开启已停止的容器
docker restart ContainsID :开启容器
docker pause web :暂停容器 web
docker unpause web :启动容器 web
docker export ContainsID > ubuntu.tar :导出本地某个容器快照到本地文件 Ubuntu.tar ,可以使用docker export 命令
docker rm web :删除容器 web
docker rm -f web :删除正在运行的容器 web
docker container prune :清理掉所有处于终止状态的容器
docker logs -f containerID or name:查看容器内部的标准输出,-f 参数是容器的标准输出
network
docker0 :默认容器 与宿主机之间沟通的桥梁
网络类型
bridge :nat 网络模型;虚拟交换机
host :与宿主机共享网络;--net = host
none :不配置网络;--net = none
overlay :不同网络进行通信
与一个容器共享网络:--net = container :ContainerName
如:
查看 docker 网络
docker network ls
docker network inspect networkname
创建 docker 网络
docker network create --driver drivername name,如:docker network create -d bridge test-net
docker network create -d bridge --subnet 172.16.100.0 / 24 one_network
--- -d:参数指定Docker 网络类型,有 bridge /overlay
连接容器
运行一个容器并连接到新建的 test-net 网络:
docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开一个新的终端,再运行一个容器并加入到 test-net 网络:
docker run -itd --name test2 --network test-net ubuntu /bin/bash
进入任意一个容器的交互环境,ping另一个容器:
docker exec -it test1 /bin/bash
ping test2
删除 docker 网络
docker network rm networkname
volume
volume :使用数据卷积实现数据持久化
用途:数据备份 、数据共享
相关操作命令
创建:docker volume create [ OPTIONS ] [ VOLUME ]
查看:docker volume inspect [ OPTIONS ] [ VOLUME ... ]
挂载:docker run -v 宿主机目录:容器目录
删除:docker volume rm [ OPTIONS ] VOLUME [ VOLUME... ]
Dockerfile
dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
FROM :指明 base image (在哪一个 image 的基础上创建),强制执行的
LABEL :指明 Dockerfile 的作者,不执行的指令
RUN :构建镜像时运行的指令,在已存在的 image 顶层执行命令后,创建一个新的 layer 层,用于执行后面跟着的命令行命令;
一般将需要安装的依赖,使用一个 RUN 来创建,如:RUN apt-get update && apt-get install -y nginx
ENV :在容器内创建环境变量,在后续的指令中可以通过$username 引用
ENV username = youyou1
password = 123456
COPY :从上下文目录中复制文件、目录到容器指定路径,容器路径不需要事先建好,不存在会自动创建路径,如:COPY test.py /mydir/
ADD :跟 copy 使用类似(官方推荐使用copy),但ADD 能把数组积中的解压压缩文件并复制到容器中,而且支持远程下载
如,解压压缩文件并复制到容器 / usr/src :ADD http://www.youyou.site/youyou.tar.xz /usr/src
if
WORKDIR :切换目录,若目录不存在会自动创建,是一直存在的
USER :设置运行其它命令的用户(UID);如:USER root
VOLUME :定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷;指定需要持久保存的目录(数据备份),如:VOLUME /data
定义 VOLUME 后,在docker run的时候,可以通过-v参数修改挂载点
EXPOSE :仅仅只是声明端口,作用:
---用于帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
---在运行时使用随机端口映射时,也就是docker run -P 会自动随机映射 EXPOSE 的端口
ENTRYPOINT vs CMD:
不同点
CMD:类似于RUN指令,用于运行程序,RUN是 docker build 时运行,但CMD是 docker run 时运行,运行容器时,不加任何参数,会自动执行CMD,如果添加参数则会忽略 CMD
如果有多个CMD,则只有最后一个会执行,其它都会被忽略
可以给ENTRYPOINT 传参(CMD [ "param 1",” param 2 “ ],如果ENTRYPOINT 使用shell format 则会被忽略)
ENTRYPOINT :运行容器时,如果添加参数不会忽略 ENTRYPOINT
相同点
--- 只有一个 CMD 或者 ENTRYPOINT 时,两者无区别
--- shell 格式 和 exec 格式
shell格式:R U N:<命令行命令>,等同于,在终端操作的shell 命令
exec格式:R U N:["可执行文件","参数1","参数2"],如:
RUN ["./test.php","dev","offline"]等价于 RUN ./test.php dev offline
运行 Dockerfile构建一个镜像:
先cd到对应的目录下,运行构建test2:v1(镜像名称:镜像标签)命令:
docker build -t test2:v1 -f Dockerfile1 .
.:最后的(.)代表本次执行的上下文路径,上下文路径是指docker 在构建镜像,有时候想要使用到本机的文件(比如复制),
docker build 命令得知这个路径后,会将路径下的所有内容打包
-f :若文件未命名未Dockerfile,则需要添加这个-f参数指定文件名
-t :指定要创建的目标镜像名
Docker Compose
Compose 是用于定于和运行容器 Docker 应用程序的工具,通过Compose 可以使用YML 文件来配置应用程序需要的所有服务,然后使用一个命令,就可以让Yml 文件配置中创建并启动所有服务;使用Docker Compose 不再需要使用 shell 脚本来启动容器,有两个重要的概念
项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
docker-compose 运行目录下的所有 yml 文件组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务可包括多个容器实例。
compose使用的三个步骤:
1、使用Dockerfile 定义应用程序的环境
2、使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
3、执行 docker-compose up 命令来启动并运行整个应用程序
安装:1、下载新版 compose 文件:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
或通过其它路径安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-''uname -s'-'uname -m' > /usr/local/bin/docker-compose
2、添加可执行权限:sudo chmod +x /usr/local/bin/docker-compose
3、检查安装 compose 版本:docker-compose --version
使用 Docker-compose 创建 Flask 应用
1、创建项目目录
mkdir flask_examples
cd flask_examples
2、在项目目录中创建 Dockerfile 文件
3、在项目目录中创建 docker-compose.yml 文件,在 services 区域下定义两个web 和redis 容器:
4、在项目目录中创建 my_app.py 文件
5、在项目目录中创建 requirements.txt 文件
flask
redis
6、在项目所在目录运行如下命令,若想在后台执行服务可以加 -d 参数:docker-compose up
若 yml 文件名未默认,则使用 -f 指定文件:docker-compose -f docker_compose1.yml up
以依赖性顺序启动服务:docker-compose up SERVICE,如先启动db 和redis 再web 服务:
部署deploy ,指定与服务部署和运行有关的配置,只在swarm 模式下有用,如:
endpoint_mode:访问集群服务的方式
endpoint_mode:vip: Docker 集群服务对于一个对外的虚拟ip ,所有的请求都会通过这个虚拟的ip 到达集群服务内部的机器
endpoint_mode:dnsrr:DNS 轮询,所有的请求会自动轮询获取到集群 ip 列表中的一个ip 地址
mode:指定服务提供的模式
replicated:复制服务,复制指定服务到集群的机器上
global:全局服务,服务将部署至集群的每个节点上
replicas:mode为 replicated 时,需要使用此参数配置具体运行的节点数量
resources:配置服务器资源利用的限制,如上列子中,配置redis 集群运行需要的CPU 的百分比和内存的占用,避免资源占用过多出现异常
restart_policy:配置如何在退出容器时重新启动容器
condition:可选none ,on-failure(异常退出) 或者any(默认)
delay:设置多久之后重启(默认:0)
max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认一直重试)
window:设置容器重启超时时间
rollback_config:配置在更新失败的情况下应如何回滚服务
parallelism:一次要回滚的容器数,如果设置为0,则所有容器将同时回滚
delay:每个容器组回滚之间等待的时间(默认为0)
failure_action:如果回滚失败,该怎么办,其中一个continue 或者pause(默认)
monitor:每个容器更新后,持续观察是否失败了的时间(默认0 s )
max_failure_ratio:在回滚期间可以容忍的故障率(默认为 0 )
order:回滚期间的操作顺序,其中一个 stop-first (串行回滚)(默认),或者 start-first (并行回滚)
update_config:配置应如何更新服务,对于配置滚动更新很有用
parallelism:一次更新的容器数
delay:在更新一组容器之间等待的时间
failure_action:如果更新失败,该怎么办,其中一个 continue,rollback 或者pause(默认)
monitor:每个容器更新后,持续观察是否失败了的时间(默认 0 s)
max_failure_ratio:在更新期间可以容忍的故障率
order:回滚期间的操作顺序。其中一个 stop-first (串行回滚,默认)或者 start-first(并行回滚)
docker Machine
docker swarm
标签:容器,compose,创建,镜像,docker,运行 From: https://www.cnblogs.com/lili37/p/17544218.html