Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。
Docker的应用场景:
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
一、Docker架构
Docker系统有两个程序:服务器端(Server)和客户端(Client)。docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),类似C++中的class。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,是镜像的实例化。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类
二、Centos安装Docker
1.卸载旧版本:
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.安装 Docker Engine-Community
使用 Docker 仓库进行安装:在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。
设置仓库:安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令来设置稳定的仓库(官方源):
# sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io
若出现如下错误:
是因为没有设置镜像仓库。使用以下代码,创建aliyun仓库,就OK了:
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
再次执行:yum install -y docker-ce
接着安装其他引擎:sudo yum install docker-ce docker-ce-cli containerd.io
三、docker基本命令
1.启动:systemctl start docker
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
2.关闭:systemctl stop docker
3.重启:systemctl restart docker
4.查看docker 运行状态:systemctl status docker
------如果是在运行中 输入命令后 会看到绿色的active
5.查看docker 版本信息:docker version
显示 docker 系统信息:docker info
6.不知某种操作可以带哪些参数:docker 操作 --help
四、docker镜像命令
1.查看自己服务器中docker 镜像列表:docker images
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
-f :显示满足条件的镜像;
2.从docker hub中搜索镜像:docker search 镜像名
-f <过滤条件>:列出收藏数不小于指定值的镜像(>= 过滤条件)
例:从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像
3.拉取镜像:docker pull 镜像名 (:版本号)
不加 :版本号 即拉取docker仓库中该镜像的最新版本latest
加:tag 则是拉取指定版本,版本号可以在docker hub中查看
4.运行镜像:docker run 镜像名
docker run --help
**-i/--interactive:即使未连接,也要保持 STDIN 打开
**-t/--tty:分配伪 TTY
**-d/--detach:在后台运行容器并打印容器 ID
**--add-host:添加自定义主机到 IP 的映射(主机:ip)
**--cgroupns:要使用的 Cgroup 命名空间(主机|private)“host”:在 Docker 主机的 cgroup 命名空间“private”中运行容器:在其自己的私有 cgroup 命名空间 ''中运行容器:使用由守护程序上的默认 cgroupns 模式选项配置的 cgroup 命名空间(默认)
**--ip:IPv4 地址(例如,172.30.100.104)
**--privileged:为此容器授予扩展权限。权限全开,不利于宿主机安全,一般与/usr/sbin/init共用
**--volume,-v:绑定装入卷
5.删除镜像(当前镜像没有被任何容器使用才可以删除):docker rmi -f/v/l镜像名
-f :强制删除一个镜像。
-l :移除容器间的网络连接,而非镜像本身。
-v :删除与镜像关联的卷。
强制删除所有的镜像:docker rm -f $(docker images -aq)
-a 意思为显示全部, -q 意思为只显示ID
6.保存镜像:docker save 镜像名/镜像ID -o 压缩文件名.tar
7.加载镜像:docker load -i 压缩文件名.tar
8.重命名镜像:docker tag 原名[:TAG] 新名[:TAG]
五、docker容器命令
docker容器就好比new出来对象(docker run 镜像:产生一个该镜像具体容器实例),docker 容器的启动需要镜像的支持
1.查看正在运行的容器列表:docker ps
2.查看所有容器,包含正在运行和已停止的:docker ps -a
容器id 镜像名称 容器与宿主机映射的端口号 容器的名称
使用 docker start 启动/停止/重启一个已停止的容器:
docker start/stop/restart 容器id
开启全部容器:docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
3.创建容器实例:docker run -itd --name 容器名 镜像名:Tag /bin/bash
-it 表示与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行)
/bin/bash 交互路径,作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash。
存储目录下各子目录详解:/var/lib/docker
containers 【里面都是容器,每启动一个容器便会在这里记录】
image 【默认里面只有一个overlay2目录】
(1)/var/lib/docker/image/overlay2/distribution: 从远端拉到本地的镜像相关元数据
(2)/var/lib/docker/image/overlay2/imagedb: 镜像数据库
/var/lib/docker/image/overlay2/imagedb/content:每一个镜像都会配置digest,也就是镜像ID。Content目录里会看到一个sha256的目录,进入到该目录下,看到都是以镜像ID命名的文件,docker images看到的镜像ID的前12位就来自这个文件。
/var/lib/docker/image/overlay2/imagedb/metadata:(略)
(3)/var/lib/docker/image/overlay2/layerdb: 镜像每个layer的元数据,Layer 层,分层
/var/lib/docker/image/overlay2/layerdb/mounts:每启动一个容器,该目录都会将容器的container ID记录下来,当容器被停止了,container ID依旧存在,当容器被删除了,container ID才会被清除。
/var/lib/docker/image/overlay2/layerdb/sha256:只记录镜像的信息,不记录容器的信息,当镜像有添加或删除时,此目录的信息会有更新
(4)/var/lib/docker/image/overlay2/repositories.json: 镜像的相关信息,记录了镜像的tag、镜像ID等信息
network 【docker的网关、容器的IP地址等信息】
overlay2 【Docker存储驱动,常见的有overlay、overlay2、aufs】
volumes 【卷管理】
强制删除容器:
docker rm -f 容器id/容器名
每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间/服务器)
4.进入容器:docker exec -it 容器id/容器名 /bin/bash
docker exec <container>表示在容器中执行命令,在容器中执行什么命令由后面的参数决定。/bin/bash用于在支持/bin/bash脚本的容器中执行相应命令,这时候就相当于登录到容器内部,可以通过shell和这个容器交互,可以执行各种Linux命令了
5.退出容器:exit
6.挂载文件:需要退出容器
docker run -itd --name qcontrib --privileged -v /home/leolong/tp:/home/qbadmin/qianbasetp qianbasempp:centos /bin/bash
docker容器向宿主机传送文件:docker cp container_id/name:<docker容器内的路径> <本地保存文件的路径>
宿主机向docker容器传送文件:docker cp <本地保存文件的路径> container_id/name:<docker容器内的路径>
7.导出和导入镜像images:
docker save -o 导出文件名.tar image:tag
docker load < 导出文件名.tar
8.将容器container打包成镜像:
docker commit 容器名 镜像名:tag
9.连接到正在运行中的容器:docker attach 容器名
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
修改Docker镜像源
1.修改/etc/docker/daemon.json 文件,修改为如下形式
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com", //官方镜像
"https://aksz2cte.mirror.aliyuncs.com"
]
}
2.重启daemon、docker
# systemctl daemon-reload
# systemctl restart docker
3.查看结果:docker info
docker中文乱码:export LANG="en_US.UTF-8"
docker无法tab补全:
#yum install -y bash-completion
#cd /usr/share/bash-completion
#chmod +x bash_completion
#./bash_completion
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
docker run -itd --name qcontrib --privileged -v /home/leolong/tp:/home/qbadmin/qianbasetp qianbasempp:centos /bin/bash