Docker容器技术初识
| Docker容器技术简介
Docker是一个开源项目,诞生与2013年初,由Docker公司(前dotCloud公司,PaaS市场中的老牌提供商)的团队编写,最初是dotCloud公司内部的一个业余项目,整个程序是基于google公司推出的Go语言实现。
Docker的思想来自于集装箱,集装箱解决了什么问题?
在一艘大船上,可以把货物规整地摆放起来,并且各种各样的货物被装在集装箱里,集装箱和集装箱之间不会相互影响,那么我就不需要专门运送蔬菜的船和专门运送货物的船了。
只要这些货物在集装箱里封装得好好的,那我就可以用一艘大船把他们都运走。
简而言之:可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器环境。
- Docker官方网站:https://docs.docker.com
- Docker参考资料:https://github.com/moby/moby
- Docker仓库网站:https://registry.hub.docker.com
Docker容器技术优势
- 简单轻量的建模:Docker上手超级快,用户只需要几分钟,就可以把自己的程序“Docker化”。
- 职责的逻辑分离:使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。
- 快速高效的开发生命周期:Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。
- 鼓励使用面向服务的架构:Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型
从上图容器技术与虚拟技术对比可知:
- 容器技术:
是隔离的环境中运行的一个进程,如果容器对应的进程结束,容器就会随之停止;
容器在隔离环境中,拥有自己的IP地址、系统文件、主机名称、进程管理等信息;
容器不需要物理硬件CPU的支持,是共用宿主机内核,启动容器环境并运行容器中的进程。
容器环境启动流程较快,运行性能较高,资源损耗较小,属于比较轻量级的服务。
- 虚拟技术:
需要物理主机CPU支持(vt虚拟化),并且虚拟主机是模拟计算机硬件运行的环境,会正常有开启运行启动流程;
虚拟主机启动流程较慢,运行性能较低,资源损耗较大,属于比较重量级的服务器。
性能对比分析:
| Docker容器组件简介
Docker技术包含以下几个核心组件部分:
- Docker客户端和服务器(也称为Dcoker引擎);
- Docker镜像
- Docker仓库(Registry)
- Docker容器
01. Docker客户端和服务器
Docker是一个客户端/服务器(C/S)架构的程序。
Docker客户端只需要向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
Docker守护进程有时也称为Docker引擎。
Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。
- 用户可以在同一台宿主机上运行Docker守护进程和客户端;
- 用户可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
02. Docker镜像
可以把镜像当作容器的“源代码”。镜像体积很小,超级“便携”,易于分享、存储和更新。
03. Docker仓库(Registry)
Docker用Registry来保存用户构建的镜像。
Registry分为公共和私有两种:Docker公司运营的公共Registry称为Docker Hub。
用户可以在Dcoker Hub注册账号,分享并保存自己的镜像。
04. Docker容器
Docker可以协助用户构建和部署容器,用户只需要把自己的应用程序或服务打包放进容器即可。
容器是基于镜像启动起来的,容器中可以运行一个或多个进程。
可以这样认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
今天给大家分享一个数据库全套学习资料包,【Docker快速入门视频+Docker学习笔记+视频配套资料合集】,一份资料包涵盖99%核心技术点。
Docker快速入门视频
Docker学习笔记
Docker教程目录
- 数据库服务知识排错
- 容器技术课程概述介绍
- 容器技术概念介绍说明
- 容器技术作用优势介绍
- 容器技术核心组件构成
- 容器服务部署前期优化
- 容器服务部署安装过程
- 容器服务镜像相关命令
- 容器服务容器相关命令
- 容器服务知识内容梳理
- 容器服务技术梳理扩展
- 容器服务数据持久存储
- 容器服务网络模拟介绍
- 容器虚拟网卡作用详述
- 容器虚拟网卡通讯实践
- 容器虚拟网卡模式应用
- 容器镜像仓库自建作用
- 容器镜像仓库证书创建
- 容器镜像仓库构建过程-harbor
- 容器镜像仓库应用说明
- 容器服务构建靶场环境
【领取方式见文末】
【领取方式见文末】
【领取方式见文末】
Docker环境构建方法
| Docker主机环境规划
在部署docker主机环境时,先对需要进行部署的主机地址与名称信息,以及用途进行规划:
系统虚拟主机部署完毕后,需要进行基本的系统初始化操作:
01. 配置虚拟主机名称:
hostnamectl set-hostname docker-01
02. 关闭系统安全软件:
# 关闭系统防火墙软件
[root@docker-01 ~]# systemctl stop firewalld
[root@docker-01 ~]# systemctl is-active firewalld.service
inactive
[root@docker-01 ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@docker-01 ~]# systemctl is-enabled firewalld.service
disabled
说明:如果需要使用iptables防火墙可以进行安装,在部署docker是可以先关闭iptables
# 安装iptables
[root@docker-01 ~]# yum install iptables-services -y
# 禁用iptables
[root@docker-01 ~]# systemctl stop iptables && systemctl disable iptables
# 清空iptables规则配置
[root@docker-01 ~]# iptables -F
# 关闭系统selinux程序
[root@docker-01 ~]# setenforce 0
[root@docker-01 ~]# getenforce
Permissive
-- 表明临时关闭selinux
[root@docker-01 ~]# sed -i '7s#enforcing#disabled#g' /etc/selinux/config
[root@docker-01 ~]# sed -n '7p' /etc/selinux/config
SELINUX=disabled
-- 表明永久关闭selinux(需要重启生效)
03. 进行系统时间同步:
# 下载时间同步软件
[root@docker-01 ~]# yum install -y ntp ntpdate
[root@docker-01 ~]# ntpdate cn.pool.ntp.org
# 编写计划任务
[root@docker-01 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null
# 重启crond服务使配置生效:
[root@docker-01 ~]# systemctl restart crond
04. 安装系统基础软件:
[root@docker-01 ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack yum-utils
| Docker容器软件部署
【Linux系统命令行界面安装】
01. 进行docker下载源优化:
# 配置docker-ce国内下载yum源(阿里云/清华源)
[root@docker-01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
… 省略部分内容…
repo saved to /etc/yum.repos.d/docker-ce.repo
说明:将指定下载源文件保存到/etc/yum.repos.d/目录中
--清华源配置:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
02. 进行docker依赖包安装:
[root@docker-01 ~]# yum install -y device-mapper-persistent-data lvm2
03. 进行docker社区版安装:
[root@docker-01 ~]# yum install docker-ce -y
[root@docker-01 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.7
-- 查看使用的Docker版本信息
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
04. 进行docker社区版启动:
[root@docker-01 ~]# systemctl start docker && systemctl enable docker
[root@docker-01 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2021-07-31 04:11:16 CST; 9s ago
Docs: https://docs.docker.com
说明:看到running,表明docker正常运行
| Docker容器内核配置
01. 修改内核参数实现数据包转发功能:
br_netfilter模块用于将桥接流量转发至iptables链,br_netfiter内核参数需要开启转发
# 进行内核参数信息配置:
[root@docker-01 ~]# modprobe br_netfilter
[root@docker-01 ~]# cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 查看内核参数配置信息:
[root@docker-01 ~]# cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 加载内核参数配置信息:
[root@docker-01 ~]# sysctl -p /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 检查确认内核模块状态:
[root@docker-01 ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
重启系统主机后模块会失效,可以设置开机自动加载模块:
# 在/etc/sysconfig/modules目录下新建模块文件
[root@docker-01 ~]# vim /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter
# 对新增的模块文件增加执行权限
[root@docker-01 ~]# chmod +x /etc/sysconfig/modules/br_netfilter.modules
或者
[root@docker-01 ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules
# 在/etc目录下新建rc.sysinit文件
[root@docker-01 ~]# vim /etc/rc.sysinit
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules
do
[ -x $file ] && $file
done
# 系统重启后查看内核模块是否加载
[root@docker-01 ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
在未开启内核参数时,docker安装运行时会常常出现如下错误:
WARNING: bridge-nf-call-iptables is disabled
# 需要将iptables的内核参数开启,才不会影响docker容器之间的通讯
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。
当linux主机有多个网卡时一个网卡收到的信息是否能够传递给其他的网卡,如果设置成1的话可以进行数据包转发,可以实现VxLAN等功能,不开启会导致docker部署应用无法访问。
# 开启系统主机数据包内核转发功能
net.ipv4.ip_forward = 1
所有内核参数信息配置完毕后,需要重启docker服务程序
[root@docker-01 ~]# systemctl restart docker
| Docker容器加速配置
docker镜像加速器可以提升拉取镜像的效率。
国内从DockerHub拉取镜像有时会遇到困难,此时可以配置镜像加速器,Docker官方和国内许多云服务商都提供了国内加速器服务。
01. 镜像加速器服务配置_阿里云
登录阿里云镜像仓库:(如果没有开通,可开通阿里云的镜像服务)
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
CentOS系统配置docker镜像加速器方法:
# 1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce
# 2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
[root@docker-01 ~]# mkdir -p /etc/docker
[root@docker-01 ~]# tee /etc/docker/daemon.json <<-'EOF'{
"registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com"]
-- 根据自己阿里云加速器地址配置
}
EOF# 3. 查看镜像加速器配置文件信息[root@docker-01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com"]
-- 单一加速器配置
或者
"registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com","https://registry.docker- cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
-- 多个加速器配置
}# 4. 重新加载docker配置环境并重启docker服务[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker
Docker基本管理命令
| Docker镜像相关操作说明
01. 在Docker hub上查找镜像信息
[root@docker-01 ~]# docker search centos
02. 在Docker hub上下载镜像信息
[root@docker-01 ~]# docker pull centos
03. 查看本地已经下载的镜像
[root@docker-01 ~]# docker images
04. 已有镜像制作离线压缩包
[root@docker-01 ~]# docker save -o centos.tar.gz centos
说明:一旦压缩包制作完成,就可以利用压缩文件分享容器镜像数据信息
05. 加载镜像离线压缩包文件
[root@docker-01 ~]# docker load -i centos.tar.gz
Loaded image: centos:latest
说明:容器镜像压缩包不要用tar命令进行解压,要用docker load加载及解压镜像压缩包
06. 删除本地已经下载的镜像
[root@docker-01 ~]# docker rmi centos rmi
或者
[root@docker-01 ~]# docker rmi -f centos
-- 表明强制删除镜像信息
[root@docker-01 ~]# docker images
-- 镜像信息查看,确认指定镜像已经删除
REPOSITORY TAG IMAGE ID CREATED SIZE
| Docker容器相关操作说明
01. 以交互方式启动并进入容器
[root@docker-01 ~]# docker run --name=hello -it centos /bin/bash
说明:运行以上命令表明启动容器并进入容器中进行交互操作,docker run表明运行容器命令
02. 守护进程方式运行启动容器
[root@docker-01 ~]# docker run --name=hello1 -td centos
31f18b2ddf88a72b2ef62e14b7a383d9e27a07e514fc1de0b37c537b37f78402
-- 利用td参数可以实现指定容器以守护进程方式运行
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f18b2ddf88 centos "/bin/bash" 11 seconds ago Up 10 seconds hello1
-- 指定的hello1容器已经实现守护进程方式运行,容器操作退出后,容器仍旧处于运行状态
[root@docker-01 ~]# docker exec -it hello1 /bin/bash
[root@31f18b2ddf88 /]#
-- 表明进入到指定的守护进程方式运行的容器中,利用docker exec进入到指定容器
03. 查看容器处于运行状态命令
# 查看正在运行的容器
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f575329c7325 centos "/bin/bash" 4 minutes ago Up 4 minutes hello
# 查看所有可用的容器
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f575329c7325 centos "/bin/bash" 6 minutes ago Exited (0) 6 seconds ago hello
说明:docker ps -a表明将所有容器信息显示,包括已经退出的容器
04. 管理容器运行状态相关命令
# 停止指定容器运行状态
[root@docker-01 ~]# docker stop hello1
hello1
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f18b2ddf88 centos "/bin/bash" 12 minutes ago Exited (0)… hello1
# 激活指定容器活跃状态
[root@docker-01 ~]# docker start hello1
hello1
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f18b2ddf88 centos "/bin/bash" 14 minutes ago Up 3 seconds hello1
05.进入运行状态容器当中命令
# 进入到指定运行容器中
[root@docker-01 ~]# docker exec -it hello1 /bin/bash
[root@31f18b2ddf88 /]#
06. 删除指定使用容器相关命令
# 删除未运行状态的容器,直接利用docker rm删除即可
[root@docker-01 ~]# docker rm hello
hello
[root@docker-01 ~]# docker ps -a
-- 普通删除生效,hello容器已经消失
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f18b2ddf88 centos "/bin/bash" 18 minutes ago Up 4 minutes hello1
# 删除已运行状态的容器,直接利用docker rm -f 删除即可
[root@docker-01 ~]# docker rm -f hello1
hello1
[root@docker-01 ~]# docker ps -a
-- 强制删除生效,hello1容器已经消失
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07. 获取容器运行过程日志信息
# 获取容器操作日志信息
[root@docker-01 ~]# docker logs hello1
- 最新
- 最热
只看作者