**Docker**
一、docker简介
1、docker是什么
使用最广泛的开源容器引擎 一种操作系统级的虚拟化技术 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 一个简单的应用程序打包工具
2、docker的设计目标
(1)、快速的交付和部署:使用docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发 完成之后,测试和运维人员可以直接使用相同环境来部署代码。docker可以快速创建and删除容 器,实现快速迭代,大量节约开发,测试,部署的时间,并且,各个步骤都有明确的配置和操 作,整个过程可见,使团队更容易理解应用的创建和工作过程。
(2)、高效的利用资源:docker容器的运行不需要额外的虚拟化管理程序支持,只需要内核级别的虚拟 化,可以实现更高的性能,同时对资源的额外需求很低。 轻松的迁移和扩展:几乎可以在任何平台之上运行,包括物理机,虚拟机,公有云,私有云,个 人电脑等。这种兼容性可让用户在不同平台之间轻松地迁移应用。
(3)、简单的更新管理:使用Dockerfile,只需要修改配置,就可以替代以外大量的更新工作。并且所 有的修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。
3、docker的组成
Docker Client(客户端) | Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令 |
---|---|
docker Daemon(守护进程) | Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。 |
Docker Images(镜像) | Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。 |
Docker Container(容器) | 容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。 |
Docker Registry(镜像仓库) | Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。 |
4、docker容器和传统虚拟化的比较
5、docker的应用场景
(1)、应用程序打包和发布
(2)、应用程序隔离
(3)、持续集成
(4)、部署微服务
(5)、快速搭建测试环境
(6)、提供PaaS产品(平台即服务)
6、docker的三大核心概念
(1)、镜像(镜像里装容器)
(2)、容器(各种服务)
(3)、仓库(装镜像)
二、docker安装(yum)
1、linux安装依赖软件
yum install -y yum-utils device-mapper-persistent-data lvm2
2、更新docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装docker
yum install -y docker-ce docker-ce-cli containerd.id
4、将docker启动并设置开启自启
systemctl start docker #启动docker
systemctl enable docker #将docker设置为开机自启
5、添加docker国内镜像
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://akchsmlh.mirror.aliyuncs.com”]
}
EOF
##重新加载文件
sudo systemctl daemon-reload
##重启docker
sudo systemctl restart docker
三、镜像
1、镜像:总体来说,镜像是一个包含程序运行必要以来环境和代码的只读文件,它采用分层的文件系统, 将每一层的改变以读写层的形式增加到原来的只读文件上,这有点像洋葱,通过基础镜像可创建 出不同的容器
2、镜像的体系结构
镜像的最底层是一个启动文件系统(bootfs)镜像,bootfs 的上层镜像叫做根镜像,一般来 说,根镜像是一个操作系统,例如 Ubuntu、CentOS 等,用户的镜像必须构建于根镜像之上,在 根镜像之上,用户可以构建出各种各样的其他镜像。 镜像的本质其实就是一系列文件的集合,一层套一层的结构有点类似于 Git ,也有点类似于生 活中的洋葱
3、镜像的写复制机制
通过 docker run 命令指定一个容器创建镜像时,实际上是在该镜像之上创建一个空的可读写 的文件系统层级,可以将这个文件系统层级当成一个临时的镜像来对待,而命令中所指的模版镜 像则可以称之为父镜像。父镜像的内容都是以只读的方式挂载进来的,容器会读取共享父镜像的 内容,用户所做的所有修改都是在文件系统中,不会对父镜像造成任何影响。 简而言之,镜像就是一个固定的不会变化的模版文件,容器是根据这个模版创建出来的,容器会 在模版的基础上做一些修改,这些修改本身并不会影响到模版,我们还可以根据模版(镜像)创 建出来更多的容器
三、docker的网络模式
(1)、bridge模式 - net=bridge (默认)通过 -p 指定端口映射。
(2)、host模式 --net=host 容器和宿主机共享 Network namespace。
(3)、none模式 --net=none 容器有独立的Network namespace
四、docker的使用命令
1、docker的镜像管理命令
(1)、docker 指令 参数
指令 | 说明 |
---|---|
Build | 列出镜像 |
Images | 查看镜像 |
Search | 搜索镜像 |
pull | 下载镜像 |
rmi或者rm | 删除镜像 |
tag | 给镜像打标签 |
load | 导入一个镜像包 |
save | 导出一个镜像包 |
(2)、docker常用命令
搜索镜像 docker search [image_name]
#下载镜像 docker pull [image_name]
#查看镜像 docker images
#查看镜像的详细信息 docker inspect [image_id/image_name]
#删除镜像 docker rmi [image_name]
#给镜像打标签 docker tag [docker_id] [image_name]
#导出一个镜像 docker save [image.tar.gz] [image_name]
2、docker的容器使用命令
指令 | 说明 |
---|---|
-i | Interactive 交互式 |
-t | Tty 分配一个伪终端 |
-d | Detach 运行容器到后台 |
-e | -env 设置环境变量 |
-p | Publish list 发布容器端口到主机 |
-name | String指定容器名称 |
-h | Hostname 设置容器主机名 |
-ip | String 指定容器ip,只能用于自定义网络 |
-network | 连接容器到一个网络 |
-mount | Mount将文件系统附加到容器 |
-v | Volume list 绑定挂载一个卷 |
-restart | 容器退出时重启策略 |
(1)、docker run 指令
指令 说明
(2)、常用命令使用
#下载一个nginx镜像 docker pull nginx
#运行一个容器(前台) docker run -p 80:80 nginx
#运行一个容器(后台) docker -d -p 80:80 nginx
#删除容器(需要先停止才能删除) docker stop nginx &&docker rm nginx
#给容器指定端口以及容器名称 docker run -d -p 82:80 –name “nginx123” nginx
#运行后进入容器 docker run -it –name “nginx123” nginx /bin/bash
#列出所有容器:docker ps -a
#把容器导出一个镜像 Docker export [container_name] -o [container_name.tar]
#导出一个镜像 docker import [container_name.tar] [image_name:version]
#清理已停止的容器:docker container prune -f
五、docker的存储
(1)、data volume 数据卷
(2)、data volome dontainers 数据卷容器(通用的)
docekr提供三种方式将数据从宿主机挂载到容器中
volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式
bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
volume的命令
1、docker volume create 名字 #创建volume
2、docker volume ls #查看volume
3、创建一个volume并挂载到nginx容器中
docker run -d -it -name “nginx-01” --mount src=nginx-vol,dst=/usr/share/nginx/html/ -p 80:80 nginx
4、volume的特点
1)、多个运行容器之间共享数据,多个容器可以同时挂载相同的卷
2)、当容器停止或者移除时,改卷依然存在
3)、当明确删除卷时,卷才会被删除
4)、将容器的数据存储在远程主机或者其他存储上(间接)
5)、将数据从一台docker主机迁移到另外一台时,先停止容器,然后再备份卷的目录,路径为(/var/lib/docker/volumes/)
bind mounts命令
1、先创建好需要共享给容器,宿主机的目录 例如:mkdir -p /opt/mounts/
2、运行容器
docker -run -d -it -name “nginx-bind” -p 80:80 --mount type=bind,src=/opt/mounts,dst=/usr/share/nginx/html nginx
3、bind mounts特点
1)、从主机共享配置文件到容器,默认情况挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
2)、在docker主机上的开发环境和容器之间共享代码,容器可以直接共享代码目录。
3)、当docker主机的文件或者目录结构保证与容器所需的绑定挂载一致事。
六、dockerfile编写
1、dockerfile简介:Dockerfile 是一个用来构建镜像的文本文件.使用 Docker 中的docker image build命令会读取 Dockerfile,并将应用程序容器化。
2、dockerfile的基本语法
指令 | 说明 |
---|---|
FROM | 基础镜像,一切从这里开始构建 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 步骤,tomcat镜像,这个tomcat的解压压缩包! |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 暴露端口配置 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令 |
COPY | 类似ADD,将我们文件拷贝到镜像中 |
ENV | 构建的时候设置环境遍量 |
七、使用docker运行一个tomcat镜像
docker search tomcat #搜索tomcat镜像
docker pull tomcat #下载tomcat
运行tomcat
docker run -it -d -p 8080:8080 tomcat
八、使用dockerfile写一个tomcat镜像
1、准备一个tomcat和jdk压缩包
2、编写dockerfile
Vim dockerfile
FROM centos:7
MAINTAINER 彦祖强的1048375712@qq.com
ADD jdk1.8.0_191.tar.gz /usr/local/
ADD apache-tomcat-9.0.19.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.19
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.19
ENV PATH $PATH:$JAVA_HOME/bin:$CLASSPATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.19/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.19/logs/catalina.out
3、构建镜像
docker build -t tomcat9 .
Docker images
4、运行镜像
docker run -d -p 9090:8080 tomcat9
访问本机http://ip:9090
5、将镜像打包
Docker save tomcat > /root/docker/tomcat9.tar.gz