一、简介
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是 PaaS 最理想的状态。
容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM,可以处理更多的应用程序,并且需要的VM和操作系统更少。
1.1 、Docker基本概念
Docker 是一个开源工具,它可以让创建和管理 docker 容器变得简单。容器就像是轻量级的虚拟机,并且可以以秒级的速度来启动或停止。
官网:docker.com
docker.io —docker官方库也叫docker-hub
Docker系统有两个程序:docker服务端 和 docker客户端
Docker服务端: 是一个服务进程,管理着所有的容器。
Docker客户端: 是docker服务端的远程控制器,可以用来控制docker的服务端进程。
1.2、Docker三大核心组件
1.Docker 镜像 - Docker images
2.Docker 仓库 - Docker registeries
3.Docker 容器 - Docker containers
(1)、Docke仓库
用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker仓库也有公有和私有的概念。共有的Docker仓库名字是Docker Hub。Docker Hub提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者是在被人的基础上创建。Docker仓库是Docker的分发部分。
库:registry
公有库:
- Docker-hub
- Daocloud
- ali
- 网易蜂巢
私有库:
公司内部使用(自己部署)
分类:
- 操作系统名称 centos ubuntu
- 应用名称 nginx tomcat mysql
Tag:
表示镜像版本
(2)、Docker镜像
Docker镜像是Docker容器运行时的只读模板,每一个镜像由一系列的层组成。每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。
镜像名称:
仓库名称+镜像分类+tag名称(镜像版本)
完整镜像名称:
docker.io/nginx:v1
docker.io/nginx:latest
daocloud.io/centos:6
镜像ID:
64位的id号
基础镜像:
一个没有任何父镜像的镜像,谓之基础镜像。
(3)、Docker容器
Docker容器和文件夹很类似,一个Dokcer容器包含了某个应用运行时所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
二、Centos8安装Docker
注:Docker官方安装说明未声明Centos版本
官网地址:Install Docker Engine on CentOS | Docker Documentation
2.1、第一步卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2、设置存储库
安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定存储库。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2.3、安装Docker引擎
2.3.1、安装最新版本的 Docker Engine 和 containerd,或者进入下一步安装特定版本:
sudo yum install docker-ce docker-ce-cli containerd.io
2.3.2、要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:
一个。列出并排序您的存储库中可用的版本。本示例按版本号对结果进行排序,从高到低,并被截断:
yum list docker-ce --showduplicates | sort -r
返回的列表取决于启用的存储库,并且特定于您的 CentOS 版本(.el7在本示例中由后缀表示)。
湾 通过完全限定的包名称安装特定版本,即包名称 ( docker-ce) 加上从第一个冒号 ( :)开始的版本字符串(第 2 列),直到第一个连字符,由连字符 ( -)分隔。例如,docker-ce-18.09.1。
注意:《version_string》—》请指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
此命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker 组,但是,默认情况下它不会向该组添加任何用户。
2.3.3、启动Docker
sudo systemctl start docker
通过运行hello-world映像验证 Docker Engine 是否已正确安装。
sudo docker run hello-world
2.4、bash安装(通用于所有平台)
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
三、深入理解镜像
3.1、镜像是什么
镜像是一种轻量级的,可执行的独立软件包。用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时所需的库、环境变量和配置文件
3.2、镜像原理
Docker的镜像实际上就是一层一层的文件系统组成的。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型的linux系统的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
3.3、Docker分层原因
最大的一个好处就是资源共享
比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
四、深入理解容器
4.1、容器是什么?
容器通过镜像来创建,独立运行一个或者一组应用,通过使用停止、启动、删除等命令进行控制。
容器的本质是进程,容器镜像就是这个系统里的".exe"安装包.**。
容器是一种松散隔离的环境,可用于生成和运行软件包。这些软件包包括在任何计算机环境中快速可靠地运行应用程序所需地代码和所有依赖项。我们将这些包称为容器映像。
4.2、容器的生命周期
虚拟机声明周期:
https://download.docker.com/linux/centos/docker-ce.repo容器生命周期:
五、Docker常见的命令操作
注意:Linux中服务管理两种方式service和systemctl
Systemctl是Linux系统最新的初始化系统,作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动
- 启动docker:systemctl start docker
- 停止docker:systemctl stop docker
- 重启docker:systemctl restart docker
- 查看docker状态:systemctl status docker
- 开机启动:systemctl enable docker
- 查看docker概要信息:docker info
六、Docker容器操作
6.1、查看正在运行的容器
docker ps
查看所有的容器(启动过的历史容器)【常用】,列出停止的与运行中的
docker ps
–a
查看最后一次运行的容器:
docker ps -l
查看停止的容器
docker ps -f status=exited
6.2、创建和启动容器
创建容器命令:docker run(创建且运行 create+st)(create)
常用的参数说明:
参数名 | 说明 |
-i | 表示运行容器 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端 |
--name | 为创建的容器命名 |
-v | 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录), |
-d | 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登 |
-p(port) | 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。 |
6.2.1、创建交互式容器
创建一个交互式容器并取名为mycentos
docker run -it --name=mycentos centos:8 /bin/bash
开启另外一个终端来查看状态:
docker ps
退出当前容器:
exit
然后用ps -a 命令查看发现该容器也随之停止:
6.2.2、创建守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器
命令如下(容器名称不能重复):
docker run -di --name=mycentos2 centos:8
登录守护式容器:
docker exec -it container_name (或者container_id)/bin/bash(exit退出时,容器不会停止)
命令如下:
docker exec -it mycentos2 /bin/bash
6.2.3、停止和启动容器
停止正在运行的容器:docker stop $CONTAINER_NAME/ID
docker stop mycentos2
启动已运行过的容器:docker start $CONTAINER_NAME/ID
docker start mycentos2
6.3、文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令:
docker cp 需要拷贝的本地文件或目录 容器名称:容器目录 也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 本地的文件或目录
解释:cp 当前目录下的a文件到 容器中的/usr/local/下的a文件
[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@32400e14bea6 /]# cd /usr/local/
[root@32400e14bea6 local]# ll
6.4、目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器里所对应的目录。
创建容器 添加 -v 参数 后边为 宿主机目录:容器目录
创建容器 并挂载宿主机目录 到容器中的目录下:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:8
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS8中的安全模块selinux把权限禁掉了,我们需要添加参数--privileged=true来解决挂载的目录没有权限的问题。
docker run -di --privileged=true -v /root/test:/usr/local/test --name=mycentos4 centos:8
七、DockerFile
7.1、什么是dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile
中的指令自动生成映像。
docker build
命令用于从Dockerfile构建映像。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。
列如:docker build -f /path/to/a/Dockerfile
命令 | 作用 |
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
EXPOSE port1 prot2 | 用来指定端口,使容器内的应用可以通过端口和外界交互 |
CMD argument | 在构建容器时使用,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 和CMD相似,但是并不会被docker run指定的参数覆盖 |
VOLUME | 将本地文件夹或者其他容器的文件挂载到容器中 |