概述
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1.快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2.响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3.在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker的架构
Docker 包括三个基本概念
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
概念 | 说明 |
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker和VM的区别
- Docker相比VM拥有更少的抽象层
- Docker是容器技术,运行在Docker Engine之上
- Docker使用的是宿主机内核,而VM需要Guest OS
Docker的安装
Docker分为社区版(Docker Engine-Community)和企业版(Docker Enterprise Edition)这里以Ubuntu系统下安装社区版为例
卸载旧版本Docker
如果安装过旧版本Docker,请先卸载删除旧版本Docker及其资源文件
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
使用官方脚本自动安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
测试Docker是否安装成功
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
如果有以上输出则说明安装成功
Docker配置镜像加速
国内由于一些原因,访问外网的速度较慢,导致我们在拉取镜像的时候速度较慢。我们可以配置国内的镜像加速器。
这里以阿里云为例。登陆阿里云后,点击镜像加速器,复制加速器地址。配置如下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的基本操作
帮助命令
#显示docker的版本信息
docker version
#显示docker的系统信息,包括镜像和容器数量
docker info
#显示命令帮助信息
docker 命令 --help
镜像命令
#查看所有本地的主机上的镜像
docker images
#在docker hub上搜索指定镜像,默认tag为latest
docker search <image>:<tag>
#下载指定镜像
docker pull <image>:<tag>
#删除指定镜像
docker rmi -f <image ID>
容器命令
使用容器命令之前,必须要有相应的镜像
新建容器
#新建容器并使用
docker run [可选参数] <image>
--name="Name" 容器名字,用于区分容器
-d 后台方式运行
-it 使用交互式方式运行,进入容器查看内容
-p 指定容器映射端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 随机指定端口
-e 修改配置文件
查看容器
#查看正在运行的容器
docker ps
#查看所有容器
docker ps -a
退出容器
#退出并停止交互容器
exit或Ctrl+P
#退出但不停止容器
Ctrl+P+Q
删除容器
#删除容器(不能删除正在运行的容器,若强制删除则需加上-f参数)
docker rm
#强制删除所有容器
docker rm -f $(docker ps -aq)
启动和停止容器
#启动容器
docker start id
#重启容器
docker restart id
#停止容器
docker stop id
#强制停止
docker kill id
其他常用命令
后台启动容器
docker run -d ubuntu
docker容器使用-d后台运行,就必须要有一个前台进程,当docker发现没有前台应用进程该容器就会自动停止。
查看日志
docker logs -tf --tail <num> <id>
查看容器进程信息
docker top id
查看镜像元数据
docker inspect id
进入当前正在运行容器
通常容器是在后台运行,但有时需要进入容器修改配置
#方式一,进入容器开启新的终端
docker exec -it id bash
#方式二,进入容器正在执行的终端
docker attach id bash
从容器内拷贝文件到主机上
docker cp id:file path
查看CUP状态
docker stats id
例子
部署Nginx
#搜索镜像
docker search nginx
#拉取镜像
docker pull nginx
#查看镜像
docker images
root@ubuntu:/home/xiaoh# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 141MB
#后台启动镜像
docker run -d --name nginx01 -p 1234:80 nginx
#测试是否启动
curl 127.0.0.1:1234
<h1>Welcome to nginx!</h1>
部署Tomcat
#拉取镜像
docker pull tomcat
#后台启动镜像
docker run -d -p 3456:8080 --name tomcat01 nginx
#进入容器
docker exec -it tomcat01 /bin/bash
#发现缺少linux命令、缺少webapps。原因是阿里云默认下载最小镜像,所有其他不必要的资源都会被剔除,只保证最小可运行的环境。
#复制webapps
cp -r webapps.dist/* webapps
成功访问