环境:centos 7(linux)
网站
官网: https://docs.docker.com/
Docker Hub 网站: https://hub.docker.com/
容器官方概述
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
容器解读
虚拟化技术和容器化技术
虚拟化技术
首先,Docker 容器虚拟化技术为基础的软件,那么什么是虚拟化技术呢?
简单点来说,虚拟化技术可以这样定义:
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
Docker 基于 LXC 虚拟容器技术
Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。
LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。
它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 技术主要是借助 Linux 内核中提供的
CGroup
功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
cgroup 和 namespace 介绍:
namespace 是 Linux 内核用来隔离内核资源的方式。 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
(以上关于 namespace 介绍内容来自https://www.cnblogs.com/sparkdev/p/9365405.html ,更多关于 namespace 的呢内容可以查看这篇文章 )。
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。
(以上关于 CGroup 介绍内容来自 https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html ,更多关于 CGroup 的呢内容可以查看这篇文章 )。
cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
Docker基本组成
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期
Docker安装
1、查看系统内核和系统信息
uname -r #查看系统内核版本
cat /etc/os-release #查看系统版本
2、开始安装Docker
2.1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2、下载依赖安装包
yum install -y yum-utils
2.3、配置镜像仓库
#国外的地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 设置阿里云的Docker镜像仓库(我们使用这个)
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4、更新yum软件包
yum makecache fast
#更新索引的时候出错,即centos8没有该参数,解决办法为:去掉fast参数
2.5、下载docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 安装社区版(我们的选择)
yum install docker-ee docker-ee-cli containerd.io # 安装企业版
docker-compose-plugin
是我们自选的
2.6、启动Docker
systemctl start docker # 启动Docker
docker version # 查看当前版本号,是否启动成功
systemctl enable docker # 设置开机自启动
2.7、通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
docker run hello-world
3、Docker卸载
yum remove docker-ce docker-ce-cli containerd.io # 卸载依赖
rm -rf /var/lib/docker # 删除资源 . /var/lib/docker是docker的默认工作路径
4、配置阿里云镜像(此步骤省略)
进入阿里云官网,搜索容器镜像服务
目前没有找到阿里云官网的上述文档,使用博主的这个配置;官方镜像加速 (aliyun.com)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
5、Docker运行流程和原理
启动流程
运行原理
Docker整体架构
6、Docker常用命令
命令的帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/
镜像管理常用命令
命令 | 描述 |
---|---|
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到镜像仓库 |
rm | 移除一个或多个镜像 |
prune | 移除未使用的镜像。没有被标记或被任何容器引用的。 |
tag | 创建一个引用源镜像标记目标镜像 |
export | 导出容器文件系统到tar归档文件 |
import | 导入容器文件系统tar归档文件创建镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
容器创建
命令 | 描述 |
---|---|
-i, -interactive | 交互式 |
-t, -tty | 分配一个伪终端 |
-d,-detach | 运行容器到后台 |
-e, -env | 设置环境变量 |
-p, -publish list | 发布容器端口到主机 |
-P, -publish-all | 发布容器所有EXPOSE的端口到宿主机随机端口 |
-name string | 指定容器名称 |
-h, -hostname | 设置容器主机名 |
-ip string | 指定容器IP,只能用于自定义网络 |
-network | 连接容器到一个网络 |
-mount mount | 将文件系统附加到容器 |
-v, -volume list | 绑定挂载一个卷 |
-restart string | 容器退出时重启策略,默认no,可选值: [always on-failure] |
容器限制
命令 | 描述 |
---|---|
-m,-memory | 容器可以使用的最大内存量 |
-memory-swap | 允许交换到磁盘的内存量 |
-memory-swappiness=<0-100> | 容器使用SWAP分区交换的百分比 (0-100,默认为-1) |
-oom-kill-disable | 禁用OOM Killer |
–cpus | 可以使用的CPU数量 |
-cpuset-cpus | 限制容器使用特定的CPU核心,如(0-3,0,1) |
-cpu-shares | CPU共享(相对权重) |
基本命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
***查看镜像命令
[root@VM-4-3-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 14 months ago 13.3kB
解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小可选参数
-a/–all 列出所有镜像
-q/–quiet 只显示镜像的id
***搜索镜像
docker search mysql
–可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
–format string Pretty-print search using a Go template
–limit int Max number of search results (default 25)
–no-trunc Don’t truncate output–搜索收藏数大于3000的镜像
$ docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12427 [OK]
mariadb MariaDB Server is a high performing open sou… 4787 [OK]
***下载镜像
# docker pull 镜像名[:tag]
docker pull mysql:5.7
***删除镜像
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
Docker图形化管理工具
安装 Portainer 可视化管理工具
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
安装完成后ip:9000(上面的端口)即可访问