1、 docker概述
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。容器是完全使用沙箱机制(隔离机制),相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
功能
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
解决产品测试上线部署问题, 实现项目产品和依赖环境统一,通过docker实现开发打爆部署上线,一套流程做完, 实现devops
- dotcloud的LXC容器技术介绍
- Docker 传奇之 dotCloud - OSCHINA - 中文开源技术交流社区
- 官网:https://www.docker.com
- 源码:Github Docker 源码:
2、docker安装
docker build | Docker Documentation
C/S结构
镜像 : image
- 一个只读模板, 一个镜像可以创建出来很多个容器 , 镜像run ---容器
- 相当于Python当中类与对象的概念,一个类可以实例化出来许多的 obj
容器 : container
- 独立运行的一个或一组应用, 是由镜像实例化出来的
- 可以把它看成是一个迷你版的Linux环境
- 启动、开始、停止、删除。每个容器都是相互隔离的
仓库 : repository
- 集中存放镜像文件的场所
- 仓库有两种区分
仓库注册服务器:
存放着多个仓库
仓库:
每个仓库包含多个镜像,每个镜像有不同的标签('tag':类似于版本号)
仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是 "Docker Hub:(https://hub.docker.com/)"
3、docker命令
镜像命令
1 列出本地主机上的镜像名:
Docker images
2 从dockerhub上搜索镜像
Docker search 镜像名
3 下载镜像
docker pull 镜像名
4 删除镜像
docker rmi 镜像名ID
5 新建并启动容器
docker run [OPTIONS] 镜像名 [Command] 参数
[OPTIONS]说明:
--name=“容器名”:为容器指定一个名称;
-d:后台运行容器。并返回容器ID(即启动守护式容器);
-i:以交互模式运行容器
-t:为容器重新分配一个伪输入终端
-P:随机端口映射
-p:指定端口映射,有四种格式 [ip:hostPort:containerPort; ip::containerPort;
hostPort:containerPort; containerPort]
容器命令
1 列出当前所有正在运行的容器
docker ps [OPTIONS]
[OPTIONS]说明:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
--no-trunc:不截断输出
2 查看docker容器使用资源
docker stats
3 退出容器
exit:容器停止退出
Ctrl+P+Q:容器不停止退出
4 启动容器
docker start ContainerID
5 重启容器
docker restart ContainerID6
6 停止容器
docker stop ContainerID
7 强制停止容器
docker kill ContainerID
8 删除容器
docker rm ContainerID
docker rm -f$(docker ps -a -q)
9 查看容器日志:
docker logs -f -t --tail 数字 ContainerID
-t:加入时间戳
-f:跟随最新的日志打印
--tail 数字:显示最后多少条
10 查看容器内运行的进程
docker top ContainerID
11 查看容器内部细节:
docker inspect ContainerID
12 进入正在运行的容器并以命令行交互:
docker exec -it ContainerID /bin/bash
docker attach ContainerID
attach:直接进入容器启动命令的终端,不会启动新的进程(不做任何操作)
exec:是在容器中打开新的终端,并且可以启动新的进程(可以做操作,返回结果)
13 从容器内拷贝文件到主机上
docker cp ContainerID:ContainerPath 宿主机Path
14 Docker镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a:提交镜像的作者
-c:使用Dockerfile指令来创建镜像;
-m:提交时的说明文字;
-p:在commit时,将容器暂停
15 将镜像推送到仓库
1、登录 docker login http://xxxxx.com
2、登录私有hub创建项目 例如项目叫:abc-dev
3、给镜像打tag docker tag a29d376ad1b9 blackcicada/h4ck3r:1.0
a29d376ad1b9:IMAGE ID,可以用docker images 查看
docker.io:私有hub域名
blackcicada:项目名称
h4ck3r:镜像名称
1.0:镜像版本号
4、推送 docker push blackcicada/h4ck3r:1.0
4、容器数据卷
为了部分数据是持久化,使得容器之间实现数据共享。
数据卷是宿主机中的一个目录或文件。
当容器目录和数据卷目录绑定后,对方修改会立即同步。
一个数据卷可以在容器之间共享或重用数据,可以同时被多个容器同时挂载。
一个容器也可以被挂载多个数据卷,数据卷的生命周期一直持续到没有容器使用它为止
容器数据持久化。
外部机器和容器间接通信。
容器之间数据交换。
添加数据卷的方式
1、命令行挂载的方式
docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (read only)
注意事项:
①目录必须是绝对路径。
②如果目录不存在,则会自动创建。
③可以挂载多个数据卷。
eg1: 一个容器挂载一个数据卷
docker run -id --name container_name1 -v /root/data:/root/data_container centos:7
eg2: 两个容器挂载同一个数据卷
docker run -id --name container_name1 -v /root/data:/root/data_container centos:7
docker run -id --name container_name2 -v /root/data:/root/data_container centos:7
数据卷容器
多容器进行数据交换。
多个容器挂载同一个数据卷。
配置数据卷容器
创建启动c3数据卷容器,使用-v参数设置数据卷。
docker run -id -v /volume --name c3 centos:7
- 创建启动c1、c2容器,使用--volumes-from参数设置数据卷。
docker run -id --volumes-from c3 --name c1 centos:7
docker run -id --volumes-from c3 --name c2 centos:7
1、父容器dc01,在dataVolumeContainer2新增内容
2、 dc02/dc03继承自dc01
3、docker run -it --name dc02 --volumes-from dc01 zzyy/centos
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
5、dockerfile文件
FROM ubuntu:14.04
LABEL maintainer="vincent <jeffmanword@gmail.com>"
RUN apt-get update && apt-get install -y redis-server
EXPOSE 6397
ENTRYPOINT [ "/usr/bin/redis-server" ]
FROM ubuntu:14.04
LABEL maintainer="vincent <jeffmanword@gmail.com>"
RUN apt-get update && apt-get install -y redis-server
EXPOSE 6397
ENTRYPOINT [ "/usr/bin/redis-server" ]
FROM 是 我们选择的 base 基础镜像
LABEL 为 我们需要的标识,比如作者是谁
RUN 是我们 执行的命令,必须使用连接符
EXPOSE 暴漏的端口
ENTRYPOINT 程序的入口
Dockerfile有以下指令选项:
FROM:指定一个基准镜像
MAINTAINER:用于提供镜像作者的详细信息
COPY: 用于将宿主机的文件复制镜像中
ADD :类似于COPY指令,ADD支持tar文件和URL路径自动展开
WORKDIR:设定工作目录
VOLUME:创建一个挂载点目录
EXPOSE:打开指定要监听的端口以实现与外部通信
ENV:用于为镜像定义所需要的环境变量
RUN:指定docker build过程中运行的程序
CMD:用于运行任何命令或应用程序,RUN命令用于运行构建镜像的过程中,而CMD指令时运行基于Dockerfile构建出的新镜像文件启动容器时。
ENTRYPOINT:用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
USER: 指定运行images的用户名或UID,默认的运行用户为root
ONBUILD: 用于在Dockerfile中定义一个触发器
6、docker网络原理
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定。
待更新
idea整理docker
docker compose
docker swarm
CI/CD jenkins
docker 集群