文章目录
- 一、docker简介
- 1.1docker应用场景
- 1.2docker的优点
- 1.2.1快速,一致地交付应用程序
- 1.2.2响应式部署和扩展
- 1.2.3在同一硬件上运行更多工作负载
- 1.2docker的架构
- 二、docker的安装
- 2.1新系统的环境搭建
- 2.1.1更换yum源
- 2.2安装docker与卸载
- 2.2.1yum安装docker
- 2.2.2docker卸载
- 三、docker的使用
- 3.1docker hello world
- 3.2交互式运行的容器
- 3.3后台模式运行容器
- 3.4docker容器的使用
- 3.4.1获取centos7镜像
- 3.4.2后台运行容器
- 3.4.3进入到容器中
- 3.4.4导出容器快照
- 3.4.5导入容器快照
- 3.4.6删除容器
- 3.5镜像使用
- 3.5.1列出镜像列表
- 3.5.2删除镜像列表
- 3.5.3构建一个新的镜像
- 3.6容器连接
- 3.6.1网络端口映射
- 3.7docker仓库
一、docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
1.1docker应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.2docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。
Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。
通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1.2.1快速,一致地交付应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
1.2.2响应式部署和扩展
- Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
- Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
1.2.3在同一硬件上运行更多工作负载
- Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
1.2docker的架构
docker包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
概念 | 说明 |
---|---|
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的安装
2.1新系统的环境搭建
2.1.1更换yum源
- 备份原有的yum源
[root@localhost ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
-
安装wget工具
我这里用的是虚拟机,直接桥接模式连接的,所以我直接下载阿里云的yum源,所以就需要wget工具。(Wget是一个在Linux环境下用于从万维网下载文件的工具,由Hrvoje Niksic开发并后来被移植到包括Windows在内的各个平台。它支持HTTP和FTP协议,以及代理服务器功能,能够自动断点续传并恢复下载。此外,wget还具有用户设置文件".wgetrc",可以读取很多设置,例如代理服务器的设置。基本的语法是:wget [参数列表] URL。)
[root@localhost /]# yum install -y wget
- 下载阿里云yum源
[root@localhost /]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- 清除原有的缓存并生成新的缓存
(清除缓存)
[root@localhost /]# yum clean all
(生成新的缓存)
[root@localhost /]# yum makecache
- 验证阿里云yum源是否生效
[root@localhost /]# yum update -y
2.2安装docker与卸载
2.2.1yum安装docker
- 安装依赖软件包
[root@localhost /]# yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加docker仓库
[root@localhost /]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker引擎
[root@localhost /]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 启动docker并设置开机自启
[root@localhost /]# systemctl start docker
[root@localhost /]# systemctl enable docker
- 查看docker版本
[root@localhost /]# docker --version
- 查看docker运行状态
[root@localhost /]# systemctl status docker
(到此,docker就彻底安装完成,并且成功运行。)
2.2.2docker卸载
- 卸载Docker软件包。
[root@localhost /]# yum remove docker-ce docker-ce-cli containerd.io
- 删除docker所以数据。
[root@localhost /]# rm -rf /var/lib/docker/
- 删除Docker配置文件和日志文件。
[root@localhost /]# rm -rf /etc/docker /var/log/docker
三、docker的使用
3.1docker hello world
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world:
[root@localhost ~]# docker run ubuntu:15.10 /bin/echo "hello,world"
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
3.2交互式运行的容器
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:
[root@localhost ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@e42a7d9e1da0:/#
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
注意第二行 root@0123ce188bd8:/#,此时我们已进入一个 ubuntu15.10 系统的容器。
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表。
root@e42a7d9e1da0:/# cat /proc/version
root@e42a7d9e1da0:/# ls
通过exit来退出容器
root@e42a7d9e1da0:/# exit
3.3后台模式运行容器
使用以下命令创建一个以进程方式运行的容器
[root@localhost ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1; done"
在输出中,我们没有看到期望的 “hello world”,而是一串长字符
0e32c3d03684084e7a3c8ccea63e75bd75d0921d6cc707c4563d25317abb3654
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:
[root@localhost ~]# docker ps
-
CONTAINER ID: 容器 ID。
-
IMAGE: 使用的镜像。
-
COMMAND: 启动容器时运行的命令。
-
CREATED: 容器的创建时间。
-
STATUS: 容器状态。
状态有7种:- created(已创建) - restarting(重启中) - running 或 Up(运行中) - removing(迁移中) - paused(暂停) - exited(停止) - dead(死亡)
-
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
-
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
[root@localhost ~]# docker logs 0e32c3d03684
停止容器的运行:
[root@localhost ~]# docker stop 0e32c3d03684
3.4docker容器的使用
3.4.1获取centos7镜像
如果我们本地没有 centos7 镜像,我们可以使用 docker pull 命令来载入 centos7 镜像:
首先查看镜像列表:
[root@localhost ~]# docker search centos7
拉取centos7的镜像:
[root@localhost ~]# docker pull centos:7
运行以下命令以启动一个新的CentOS 7容器:
[root@localhost ~]# docker run -it --name my_centos7_container centos:7 /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
3.4.2后台运行容器
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
这里,我们让centos7在后台运行:
[root@localhost ~]# docker run -d centos:7 /bin/bash
命令详解:
- run:启动的意思,Docker命令的一个子命令,用于创建并启动一个新的容器
- -d:后台运行,加了 -d 参数默认不会进入容器
- centos:7:image(镜像),要使用的Docker镜像的名称和标签
- /bin/bash:解释器,使用/bin/bash来启动一个交互式的Bash shell
3.4.3进入到容器中
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
[root@localhost ~]# docker attach 57aaaa97b26e
- docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
[root@localhost ~]# docker exec -it e42a7d9e1da0 /bin/bash
命令详解:
- exec:Docker命令的一个子命令,用于在现有容器中执行命令或启动一个新的进程
- -it:选项,表示以交互模式运行容器,并分配一个伪终端
- /bin/bash: 这是要在容器内执行的命令,这里使用的是Bash shell
3.4.4导出容器快照
如果要导出本地某个容器,可以使用 docker export 命令。
[root@localhost ~]# docker export e42a7d9e1da0 > ubuntu.tar
命令详解:
- docker export e42a7d9e1da0这部分代码的作用是将容器的镜像导出为一个tar文件
- (重定向)> ubuntu.tar这部分代码将导出的镜像保存到名为ubuntu.tar的文件中
3.4.5导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
[root@localhost ~]# cat ubuntu.tar | docker import - test/ubunt:v1
3.4.6删除容器
删除某一个容器
[root@localhost ~]# docker rm d04050d53e91
清理掉所有没有在运行状态的容器
[root@localhost ~]# docker container prune
3.5镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
3.5.1列出镜像列表
可以使用 docker images 来列出本地主机上的镜像。
[root@localhost ~]# docker images
解释说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
(同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。)
如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
[root@localhost ~]# docker run -t -i ubuntu:15.10 /bin/bash
解释说明:
- -i:交互式操作。
- -t::终端。
- ubuntu:15.10:这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
(如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。)
3.5.2删除镜像列表
镜像删除使用 docker rmi 命令,比如我们删除 test/ubunt 镜像:
[root@localhost ~]# docker rmi efee557f2563
3.5.3构建一个新的镜像
我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
[root@localhost ~]# cat Dockerfile
FROM centos:7
MAINTAINER yourname <youremail@example.com>
RUN yum -y update && yum clean all
RUN yum install -y httpd
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
(注:如果docker中找不到名为"centos:7"的镜像,可以使用一下方法进行下载镜像
)
docker pull centos:7
docker save -o centos_7.tar centos:7
docker load -i centos_7.tar
1)在目录下运行以下命令构建镜像:
docker build -t myimage .
其中myimage是新镜像的名称,最后的"."表示使用当前目录下的Dockerfile。
2)构建完成后,可以使用以下命令查看新镜像:
docker images
2)运行新镜像:
docker run -d -p 80:80 myimage
(因为这里也是测试,所以就不作图了,不过这些命令完全行的通)
3.6容器连接
3.6.1网络端口映射
首先创建的一个python的容器
[root@localhost /]# docker run -d -P training/webapp python app.py
使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的端口。
-p : 是容器内部端口绑定到指定的主机端口。
[root@localhost /]# docker run -d -p 5000:5000 training/webapp python app.py
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
[root@localhost /]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
[root@localhost /]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port 命令可以让我们快捷地查看端口的绑定情况。
[root@localhost /]# docker port musing_gould 5000
3.7docker仓库
仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。
Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
注册
在 https://hub.docker.com 免费注册一个 Docker 账号。
登录和退出
登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
# 登录
[root@bogon ~]# docker login
# 退出
[root@bogon ~]# docker logout