Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
- 快速,一致地交付您的应用程序
- 响应式部署和扩展
- 在同一硬件上运行更多工作负载
Docker 官网:https://www.docker.com
Github Docker 源码:https://github.com/docker/docker-ce
Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 安装
阿里镜像加速
1 | sudo mkdir -p /etc/docker |
Docker常用命令
官网:https://docs.docker.com/engine/reference/run/
1 | [root@i-6x8256ap ~]# docker -h |
镜像相关的命令
创建镜像 docker build -t <imageName:tag> -f /path/to/dockerfile .
- 用法
1 | [root@i-6x8256ap compose_test]# docker build --help |
- 示例
1 | [root@i-6x8256ap compose_test]# docker build -t docker_web -f Dockerfile . |
查看镜像列表 docker images
- 示例
1 | [root@i-6x8256ap ~]# docker images |
- 用法
1 | [root@i-6x8256ap ~]# docker images -h |
搜索镜像 docker search <镜像名字>
- 示例
1 | [root@i-6x8256ap ~]# docker search nginx |
- 用法
1 | [root@i-6x8256ap ~]# docker search -h |
拉取镜像 docker pull <镜像名字>
- 示例
1 | [root@i-6x8256ap ~]# docker pull hello-world |
- 用法
1 | [root@i-6x8256ap ~]# docker pull -h |
删除镜像:docker rmi <镜像名字>
- 示例
1 | [root@i-6x8256ap ~]# docker rmi -f hello-world |
- 用法
1 | [root@i-6x8256ap ~]# docker rmi -h |
提交信息到镜像 docker commit
- 用法
1 | [root@i-6x8256ap ~]# docker commit --help |
导出镜像 docker save -o name.tar <imageID>
- 用法
1 | [root@i-6x8256ap ~]# docker save --help |
- 示例
1 | [root@i-6x8256ap ~]# docker save -o tomcat-8.5.tar tomcat:8.5 |
导入镜像 docker load -i <镜像tar包>
- 用法
1 | [root@i-6x8256ap ~]# docker load --help |
- 示例
1 | # 方式一 |
容器相关的命令
创建并启动容器 docker run
- 用法
1 | [root@i-6x8256ap ~]# docker run --help |
查看docker 进程 dcoker ps
- 用法
1 | [root@i-6x8256ap ~]# docker ps --help |
查看容器状态统计 docker stats <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker stats --help |
- 示例
1 | [root@i-6x8256ap ~]# docker stats |
退出容器
- 用法
1 | 方式一:exit # 退出并关闭容器 |
重启容器 docker restart <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker restart --help |
停止容器 docker stop <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker stop --help |
杀掉容器 docker kill <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker kill --help |
删除已经停止的容器 docker rm <容器ID>
- 示例
1 | [root@i-6x8256ap ~]# docker rm 73a82cd8d59e a32c2ed88835 50f3a65f2219 |
- 用法
1 | [root@i-6x8256ap ~]# docker rm --help |
删除容器 docker rm <容器:ID>
- 示例
1 | # 删除一个 |
- 用法
1 | [root@i-6x8256ap ~]# docker rm --help |
以守护进程启动容器
- 示例
1 | [root@i-6x8256ap ~]# docker run -d centos /bin/sh -c "while true;do echo 'I Love You';sleep 2;done" |
查看容器内的进程 docker top <容器ID>
- 示例
1 | [root@i-6x8256ap ~]# docker top 3eb5dffe30c6 |
- 用法
1 | [root@i-6x8256ap ~]# docker top --help |
查看容器日志 docker logs -ft <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker logs --help |
- 示例
1 | [root@i-6x8256ap ~]# docker logs -ft --tail 5 7d0e935b85a4 |
查看容器内的细节 docker inspect <容器ID>
进入容器
docker attach <容器ID>
- 用法
1 | [root@i-6x8256ap ~]# docker attach --help |
注:docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
docker exec -t <容器ID> <cmd>
- 用法
1 | [root@i-6x8256ap ~]# docker exec --help |
copy容器内的数据到本地
- 用法
1 | [root@i-6x8256ap ~]# docker cp --help |
Docker 网络命令 docker network <opts>
- 用法
1 | [root@i-6x8256ap ~]# docker network --help |
查看network列表 docker network ls
1 | [root@i-6x8256ap ~]# docker network ls |
查看network详情 docker network inspect <networkID>
1 | [root@i-6x8256ap ~]# docker network inspect 5aa8673629ff |
Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件等
Docker联合文件系统Union File System
Docker联合文件系统(Union File System),它是实现Docker镜像的技术基础,是一种轻量级的高性能分层文件系统,支持将文件系统中的修改进行提交和层层叠加,这个特性使得镜像可以通过分层实现和继承。同时支持将不同目录挂载到同一个虚拟文件系统下。
在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制作各种不同的应用镜像。这些应用镜像共享同一个基础镜像层,提高了存储效率。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录.
Docker镜像加载原理
在Docker中使用AUFS(Another Union File System或Advanced Multilayered Unification File System)就是一种联合文件系统。AUFS不仅可以对每一个目录设定只读(Readonly)、读写(Readwrite)和写(Witeout-able)权限,同时AUFS也可以支持分层的机制,例如,可以对只读权限部分逻辑上进行增量地修改而不影响只读部分。
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称之为UnionFS。从linux启动为例介绍docker在AUFS特性的运用。典型的Linux启动到运行需要两个FileSystem,BootFS 和RootFS。
BootFS (boot file system)主要包含BootLoader 和Kernel, BootLoader主要是引导加载Kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。当Boot成功后,Kernel被加载到内存中BootFS就被Umount了。
RootFS (root file system)包含的就是典型 Linux 系统中的 /dev、/proc、/bin 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
不同的linux发行版,BootFS基本是一致的, RootFS会有差别,因此不同的发行版可以共享BootFS。
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
Docker容器数据卷
在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案:
1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境的指定文件目录之中,可以理解为容器挂载一个虚拟数据卷然后映射到一个主机目录中
2)数据卷容器(Data Volume Containers):用专门的容器来挂载数据卷,其他容器通过挂载这个父容器来实现数据共享,这个专门挂载数据卷的容器就是数据卷容器,简单的总结就是有一个容器来专门管理数据的持久化和容器之间数据共享
注:前者常用于单一容器数据持久化,后者常用于多容器之间的数据共享和数据持久化
数据卷(Data Volumes)
我们可以在镜像程序运行时通过”-v /主机目录文件名:/容器目录名” 命令,将容器卷指定一个主机目录,这样我们的程序运行的数据就可以持久保存到这个映射的主机目录文件当中。
1 | docker run -d -v /root/examples:/usr/local/tomcat/webapps/examples:[ro] -p 9000:8080 tomcat:8.5.32 |
特点:
- 数据卷可以在容器之间共享或重用数据
- 数据卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷容器(Data Volume Containers)
如我我们经常需要多个容器之间进行数据共享我们需要用到命令“–volumes-from”
1)我们从仓库拉一个centos的容器镜像
1 | \$ docker pull centos |
2)然后运行这个镜像并创建一个数据卷挂载到/mydata
1 | \$ docker run -it -v /mydata --name mycentos centos |
3)再运行两个容器,在这两个容器中使用–volumes-from来挂载mycentos容器中的数据卷.
1 | \$ docker run -it --volumes-from mycentos --name soncentos1 centos |
此时,容器soncentos1和soncentos2都挂载同一个数据卷到相同的/mydata 目录。三个容器任何一方在该目录下的写入数据,其他容器都可以看到。
注:可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
DockerFile解析
Dockerfile 是一个用来构建镜像的,有一系列命令和参数组成的文本文件。
docker build
命令用于从Dockerfile构建映像。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。例:
1 | docker build -f /path/to/a/Dockerfile |
DockerFile内容基本知识
- 每条保留字指令都必须为大写字母且后面至少需要一个参数
- 指令是自上而下顺序执行
#
表示注释- 每条指令都会创建一个新的镜像层,并对镜像进行提交
DockerFile执行的流程
- docker 从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行DockerFile中的下一条指令制导所有指令都执行完成
DockerFile中的关键字
1 | FROM:指定创建镜像的基础镜像 |
Docker 常用安装
Docker 网络
- 启动tomcat1
1 | [root@i-6x8256ap ~]# docker run -d -p 9000:8080 --name tomcat1 tomcat:8.5.32 |
网络信息
1 | [root@i-6x8256ap ~]# docker exec -i tomcat1 ip addr |
- 启动tomcat2
1 | [root@i-6x8256ap ~]# docker run -d -p 9001:8080 --name tomcat2 tomcat:8.5.32 |
网络信息
1 | [root@i-6x8256ap ~]# docker exec tomcat2 ip addr |
- 当前主机的网络信息
1 | [root@i-6x8256ap ~]# ip addr |
Docker 网络模式
- bridge:桥接(默认)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络连同
查看网络列表 docker network ls
- 用法
1 | [root@i-6x8256ap ~]# docker network ls --help |
- 示例
1 | [root@i-6x8256ap ~]# docker network ls |
查看网络详情 docker network inspect <networkID>
- 用法
1 | [root@i-6x8256ap ~]# docker network inspect --help |
- 示例
1 | [root@i-6x8256ap ~]# docker network inspect 5aa8673629ff |
创建网络 docker network create [opts]
- 用法
1 | [root@i-6x8256ap ~]# docker network create --help |
- 示例
1 | [root@i-6x8256ap ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet |
使用自定义的网络创建容器
1 | [root@i-6x8256ap ~]# docker run -d -p 9010:8080 --name tomcat-net1 --net mynet tomcat:8.5.32 |
测试网络连同性
1 | [root@i-6x8256ap ~]# docker exec tomcat-net1 ping tomcat-net2 |
注:使用自定义的网络的容器之间是互通的
使不同的网络之间互通 docker network connect <network> <container>
- 用法
1 | [root@i-6x8256ap ~]# docker network connect --help |
- 示例
1 | # 初始时无法ping通 |
注:docker network connect
直接将tomcat3 新增了一个网卡
1 | [root@i-6x8256ap ~]# docker exec tomcat3 ip addr |
Docker Compose
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
Compose 安装
从github上下载docker-compose二进制文件安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
1
# sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.27.4。
将可执行权限应用于二进制文件:
1
# sudo chmod +x /usr/local/bin/docker-compose
创建软链:
1
# sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
1
2$ docker-compose --version
cker-compose version 1.27.4, build 4667896bpip安装
1
# sudo pip install docker-compose
Compose 示例
参考:docker-compose教程(安装,使用, 快速入门)
Compose 命令参数
1 | [root@i-6x8256ap ~]# docker-compose --help |
注:Docker compose的使用非常类似于docker命令的使用,但是需要注意的是大部分的compose命令都需要到docker-compose.yml文件所在的目录下才能执行
以守护进程模式运行加-d选项
1 | # docker-compose up -d |
查看服务列表 docker-compose ps
- 用法
1 | [root@i-6x8256ap docker]# docker-compose ps -h |
- 示例
1 | [root@i-6x8256ap docker]# docker-compose ps -a |
查看日志 docker-compose logs <sericeName>
- 示例
1 | [root@i-6x8256ap docker]# docker-compose logs -t web |
- 用法
1 | [root@i-6x8256ap docker]# docker-compose logs -h |
Docker Machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Docker Machine 管理的虚拟主机可以是机上的,也可以是云供应商,如阿里云,腾讯云,AWS,或 DigitalOcean。
使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。
Machine 安装
安装 Docker Machine 之前你需要先安装 Docker。
Docker Mechine 可以在多种平台上安装使用,包括 Linux 、MacOS 以及 windows。
Linux 安装命令
1 | $ base=https://github.com/docker/machine/releases/download/v0.16.2 && |
macOS 安装命令
1 | $ base=https://github.com/docker/machine/releases/download/v0.16.2 && |
Windows 安装命令
如果你是 Windows 平台,可以使用 Git BASH,并输入以下命令:
1 | $ base=https://github.com/docker/machine/releases/download/v0.16.02 && |
查看是否安装成功:
1 | $ docker-machine version |
Machine 命令参数
1 | [root@i-6x8256ap ~]# docker-machine -h |
Docker 可视化工具
portainer安装
1 | docker run -d -p 8088:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer |