docker容器入门
1、what(什么是docker?)
Docker 是基于Go语言开发的应用容器引擎。它是目前最流行的 Linux 容器解决方案。
2、why
1、环境隔离
一台机器运行多个容器互不影响
2、快速交付,更易迁移扩展
利用镜像快速构建一套标准的研发环境,不同的人员可以直接通过使用相同的环境来部署代码。docker容器几乎可以在任意的平台上运行
3. 资源利用率高
docker容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低
4、效率高
效率高:Docker引擎运行在操作系统上,在容器启动后,容器里的进程直接与内核交互,无需经过Docker引擎中转,因此更加快。 而VM需要通过一层 一个软件层Hypervisor ,所以效率会低。
创建快:新建一个虚拟机时,虚拟机软件需要加载GuestOS(虚拟机操作系统),返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
5、更简单的管理
使用Dockerfile,只需要小小的配置修改,就可以替代以往的大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理
3、docker底层原理
底层使用到Linux的四项技术,chroot、Namespace、Cgroups 和联合文件系统
-
chroot: 可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录
-
Namespace: 是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源。
-
Cgroup: 可以限制和隔离进程的资源使用情况(CPU、内存、磁盘 I/O、网络等)
-
联合文件系统: 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
4、docker基本概念
Docker镜像:
镜像是一个只读的文件和文件夹组合,是 Docker 容器启动的先决条件。
镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub(最大的公开仓库)/registry(仓库注册服务器)上下载。
Docker容器:
容器是镜像的运行实体。Docker利用容器来运行应用。
容器有初建、运行、停止、暂停和删除五种状态。
每个容器都是相互隔离的。可以把容器看做是一个简易版的 Linux 环境
注: 镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
Docker仓库:
仓库是集中存放镜像文件的场所。
目前,Docker Hub 是 Docker 官方的公开镜像仓库,它不仅有很多应用或者操作系统的官方镜像,还有很多组织或者个人开发的镜像供我们免费存放、下载、研究和使用。除了公开镜像仓库,你也可以构建自己的私有镜像仓库
Docker引擎:
创建和管理容器的工具,通过读取镜像来生成容器,并负责从仓库拉取镜像或提交镜像到仓库中
Docker镜像,容器,仓库之间的关系
Docker仓库用于存放Docker镜像, 用户可以从仓库pull镜像到本机, 或从本机push镜像到仓库 通过Docker镜像来创建Docker容器
5、docker架构
Docker 整体架构采用 C/S(客户端 / 服务器)模式,主要由客户端和服务端两大部分组成。客户端负责发送操作指令,服务端负责接收和处理指令。客户端和服务端通信有多种方式,既可以在同一台机器上通过UNIX套接字通信,也可以通过网络连接远程通信。
Docker 客户端:
Docker 客户端其实是一种泛称。其中 docker 命令是 Docker 用户与 Docker 服务端交互的主要方式。除了使用 docker 命令的方式,还可以使用直接请求 REST API 的方式与 Docker 服务端交互,甚至还可以使用各种语言的 SDK 与 Docker 服务端交互。目前社区维护着 Go、Java、Python、PHP 等数十种语言的 SDK,足以满足你的日常需求。
Docker 服务端:
Docker 服务端是 Docker 所有后台服务的统称。
-
dockerd 是一个非常重要的后台管理进程,它负责响应和处理来自 Docker 客户端的请求,然后将客户端的请求转化为 Docker 的具体操作。
-
containerd是 Docker 服务端的一个核心组件,它是从dockerd中剥离出来的 ,是容器标准化后的产物。containerd通过 containerd-shim 启动并管理 runC,可以说containerd真正管理了容器的生命周期。
-
runC 是一个用来运行容器的轻量级工具,是真正用来运行容器的。
6、安装部署
1、清理环境(关闭防火墙, SELINUX)
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]# systemctl stop firewalld
2、配置Docker源
[root@localhost ~]# curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
3、安装合适版本的Docker
1、查看Docker版本
[root@localhost ~]# yum list docker-ce --showduplicates| grep "^docker"
2、安装合适版本的Docker
[root@localhost ~]# yum -y install docker-ce-18.06.0.ce
4、配置加速器
可以登录阿里云控制台, 搜索容器镜像服务, 来获取自己的镜像加速地址
[root@localhost ~]# mkdir /etc/docker
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://jqcrbrq3.mirror.aliyuncs.com"]
}
5、启动Docker
[root@localhost ~]# systemctl enable docker //设置开机启动
[root@localhost ~]# systemctl start docker //启动Docker
查看配置是否成功
[root@docker ~]# docker info
7、docker基本操作
docker [command [command]]
7.1 对镜像操作
7.1.1 拉取、查看、打标签、删除、导出导入
1.从指定的仓库中搜索busybox镜像
# docker search busybox
2.拉取镜像
# docker pull busybox
3.查看本地镜像
# docker images
4.给busybox镜像打新标签
# docker tag busybox busybox:v1
5.删除容器busybox:v1
# docker rmi busybox:v1
6.镜像导出导入
docker image save mysql:5.6 -o mysql:5.6.tar.gz
docker image load -i mysql:5.6.tar.gz
7.1.2 运行镜像
docker run [选项] 镜像 [command] // 从指定镜像运行一个容器 常用选项:
-i // 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-t // 让容器的标准输入保持打开。 -it一般同时使用
-d // 在后台运行容器
--name // 指定容器的名称
--network // 指定容器的网络连接方式,默认为NAT.
--ip // 指定容器的IP地址
--restart //重启方式
-p <宿主端口>:<容器端口> // 端口映射,将容器指定端口映射到宿主机的指定端口.
-P // 将容器的所有已声明端口映射到宿主机的随机端口
-v <宿主目录>:<容器目录> //将宿主机的指定目录映射到容器的指定目录
常见用例:
1、创建nginx容器,指定映射端口、容器名字、网络模式、重启方式、目录挂载
docker run -d -p 80:80 \
--name nginxweb \
--net bridge \
--restart always \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
nginx
注意:容器后台运行需要有存活的进程,否则容器开启后会自动关闭,-it开启伪终端命令行模式,等同于开启一个持续的终端进程
7.1.3 构建镜像
构建镜像主要有两种方式:
1、使用docker commit命令从运行中的容器提交为镜像;
2、使用docker build命令从 Dockerfile 构建镜像。
1) commit
1、先创建一个容器,终端模式放置后台
# docker run -itd busybox
2、进去容器创建文件
# docker exec -it busybox sh
# touch test.txt
# docker commit busybox busybox:test
1) Dockerfile
这种方式是最重要也是最常用的镜像构建方式。Dockerfile 是一个包含了用户所有构建命令的文本。通过docker build命令可以从根据Dockerfile 生成镜像。
使用 Dockerfile 构建镜像具有以下特性:
-
Dockerfile 的每一行命令都会生成一个独立的镜像层,并且拥有唯一的 ID;
-
Dockerfile 的命令是完全透明的,通过查看 Dockerfile 的内容,就可以知道镜像是如何一步步构建的;
-
Dockerfile 是纯文本的,方便跟随代码一起存放在代码仓库并做版本管理。
下面介绍下dockerfile的常见参数:
实战案例:
基于centos7优化yum源,设置时区,下载nginx,设置环境变量,映射端口,开启服务
1、 首先创建一个目录(作为到时候传到docker引擎的上下文目录)
mkdir test-dockerfile && cd test-dockerfile
2、在目录下创建 Dockerfile 文件
vim Dockerfile
from centos:centos7
copy CentOS-Base.repo /etc/yum.repos.d/CentOS7-Base.repo
copy epel.repo /etc/yum.repos.d/epel.repo
run ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && yum -y install nginx
env HOST=mynginx
expose 80
cmd systemctl start nginx
需要把需要copy的文件放在该目录下,或者
# ls
CentOS-Base.repo Dockerfile epel.repo
3、构建镜像
# docker build -t 'centos7/nignx:v1' .
bulid使用方法
语法: docker build [command] .
选项:
-t 指定构建完成后的镜像名称
-f 指定dokerfile的路径, 如果省略此选项, docker会在 context-dir目录(当前目录) 中查找名称"Dockerfile"的文件进行构建
. 上下文路径,是指 docker 在构建镜像,docker build 命令得知这个路径后,会将路径下的所有内容打包发送给docker引擎
7.2 对容器操作
1.查看运行的容器 [-a 所有容器]
docker ps
2.查看指定容器的进程信息
docker top ee5a6a56c658
3.启停指定容器
docker stop|start|restart|kill ee5a6a56c658
4.暂停|恢复指定容器
docker pause|unpause ee5a6a56c658
5. 删除指定容器(删除之前必须先停止容器)
docker rm [容器id/名称]
6.查看指定容器日志
docker logs [容器id/名称]
7.容器与宿主机之间的文件传递
docker cp container:src_file dst_path //将容器中的文件复制到宿主机上
docker cp src_file container:dst_path // 将宿主机上的文件复制到容器中
8.以json格式显示出容器的具体信息
docker inspect [容器id/名称]
9.查看容器资源使用率
docker stats
10.进入容器
docker exec -it centos /bin/bash //连接可用exit命令退出,不影响容器