一.Docker的理念

一次镜像,处处运行.达成Docker容器在任何操作系统上都是一致的,实现应用跨平台、跨服务器.
解决运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术.

1.1 容器和虚拟机的区别

在这里插入图片描述

  • 虚拟机: 带环境安装的一种解决方案.它可以在一种操作系统里面运行另一种操作系级,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
    虚拟机缺点: 1资源占用多 2冗余步骤多 3启动慢
  • 容器: 可以将软件运行所需的所有资源打包到一个隔离的容器中。不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置
    总结: Docker容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

1.2 docker容器

Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实列,可大大提升物理服务器的CPU和内存的利用率。

特点:
更快速的应用交付和部署√
更便捷的升级和扩缩容√
更简单的系统运维√
更高效的计算资源利用√

基本组成:
docker镜像 一个只读模板.它相当于是一个root文件系统。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
docker容器 实例类似于java中new出来的实例对象,容器是用镜像创建的运行实例。
docker仓库 集中存放镜像的地方.

在这里插入图片描述
在这里插入图片描述

二. docker安装

Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。因此,,Docker必须部署在Linux内核的系统上。如果其他系统想部署Docker就必须安装一个虚拟Linux环境。

docker镜像地址

docker安装方法

2.1 docker安装命令

欧拉22,centos8请看--> Docker 最佳实战

以下针对centos7

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

# 后台启动docker
sudo systemctl start docker
sudo systemctl enable docker

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo



# 卸载docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

以下针对ubuntu

# 阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#更新源
sudo apt update
sudo apt-get update

#安装最新版本的Docker
sudo apt install docker-ce docker-ce-cli containerd.io
#等待安装完成

#查看Docker版本
sudo docker version

# 后台启动docker
sudo systemctl start docker
sudo systemctl enable docker

2.2 docker基础常用命令

注意不要安装centos8否则yum都用不了
docker只加载镜像最小内核

systemctl stop docker # 停止
systemctl status docker # 查看docker状态
systemctl enable docker # 开机启动

docker info # 查看docker概要信息
docker --help # 查看docker总体帮助文档
docker 具体命令 --help # 查看docker命令帮助文档

# --name="容器新名称"
# -p 指定端口映射
# -d 守护线程启动
docker run -d 镜像名 # 注意一定要配合docker ps使用! 有的不支持后台启动,造成自杀. mysql,redis一般这样使用
docker exec -it 容器id /bin/bash # 重新进入容器终端交互,启动新进程的同时打开终端.退出不会停止容器
# docker attach 容器id # 重新进入容器终端交互,不启动新进程打开终端,退出会停止容器
docker run -it [--name=cen] centos /bin/bash # 以交互式容器启动,为容器重新分配一个伪输入终端.容器名称为cen的centos镜像实例容器
yum -y update # 更新yum源
yum -y install vim # 安装所需要的vim

exit # 退出交互式容器终端,容器停止; 
docker start 容器名或容器id # 启动已经停止运行的容器
docker restart 容器名或容器id # 重启容器
docker stop 容器名称或容器id # 停止容器
docker kill 容器名称或容器id # 强制停止容器

docker cp 容器id:容器内文件路径 目的主机路径 # 将容器内文件复制到主机上
docker cp 宿主机文件路径 <容器名称或者ID>:容器文件存放路径 # 将宿主机文件复制到容器中
docker export 容器id>文件名.tar #导出容器的内容留作为一个tar归档文件
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

查看操作

拉取完毕一般记得刷新配置source /etc/profile

# 我们使用REPOSITORY:TAG来定义不同的镜像
docker images  # 列出本地镜像 REPOSITORY镜像源 TAG版本号 IMAGE ID镜像id CREATED创建时间 SIZE大小
docker ps # 查看当前正在运行的容器
docker ps -a # 查看所有容器
docker search 镜像名 # 搜索镜像是否在远程库
docker pull 镜像名[:TAG] # 拉取镜像到本地镜p像
# 拉取完毕一般记得刷新配置source /etc/profile
docker system df  # 查看镜像/容器数据卷所占空间

docker logs 容器id # 查看容器日志
docker inspect 容器id # 查看容器内部细节

删除操作

docker rmi -f 镜像名 # 删除镜像
docker rmi -f 镜像id # 强制删除镜像

docker rm 容器id # 删除已经停止的容器
docker rm -f 容器id #强制删除容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器

commit提交镜像

ctrl+p+q # 退出,容器不停止
docker commit -m="提交信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] # 继承当前容器 反向生成新镜像. 容器外使用

默认情况,仓库被创建在容器的/varliblregistry目录下,建议自行用容器卷映射,方便于宿主机联调

# 本地镜像发布到私服仓库

docker pull registry # 拉取私服仓库
#-p 5000:5000 分别暴露宿主机端口和容器内部端口
docker run -d -p 5000:5000 [-v 宿主机的路径:容器内的路径 --privileged=true] registry # 生成registry镜像的容器
docker commit -m="提交信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] # 继承当前容器 反向生成新镜像. 容器外使用
curl -XGET http://127.0.0.1:5000/v2/_catalog # 验证私服库有啥
docker tag [ImageId] http://127.0.0.1:5000/[镜像名]:[镜像版本号] # 重新规范命名镜像

[root@VM-16-9-centos ~]# vi /etc/docker/daemon.json

{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}


sudo systemctl daemon-reload
sudo systemctl restart docker

docker pull 镜像名
curl -XGET http://127.0.0.1:5000/v2/_catalog # 验证私服库有啥

2.3配置阿里云镜像加速

用户唯一,加速拉取docker内容
在这里插入图片描述

在这里插入图片描述

2.4Docker镜像

docker镜像是分层的: UnionFs,(联合文件系统)Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统>的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以>通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
docker镜像加载原理: bootfe(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载>bootfs文件系统,在Docker镜像的最底层是引导文件系统boots。这一层与我们典型的LinuxUnix系统是一样的,包含booth加载器和内核。>>当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root fle system),在bootts之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。rootfs就是各种不同的操作>系统发行版,比如Ubuntu,Centos等等。

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

2.5本地镜像发布阿里云(非私有库)

在这里插入图片描述
在这里插入图片描述
上传和拉取请自行查阅官方文档

注意
在这里插入图片描述
之所以上传的容量减小了是因为UnionFs,(联合文件系统)的强大.只上传容器层的内容.

2.6 全局日志限制

sudo vim /etc/docker/daemon.json

#==============
{
    // 配置镜像仓库的镜像加速地址列表,Docker拉取镜像时会优先从这些地址获取
    // 这里设置了一个镜像加速地址为https://docker.1ms.run,以提升镜像下载速度
    "registry-mirrors": ["https://docker.1ms.run"], 
    // 设置日志驱动为json-file格式,Docker会将容器日志以JSON文件的形式存储
    "log-driver": "json-file", 
    // 针对日志驱动的相关配置选项
    "log-opts": { 
        // 每个日志文件的最大大小设置为10MB,当达到此大小时会创建新的日志文件
        "max-size": "10m", 
        // 最多保留3个日志文件,超过数量后最早的日志文件会被删除
        "max-file": "3" 
    }
}
#==============
sudo systemctl daemon-reload
sudo systemctl restart docker

2.7 IDEA远程访问docker

mkdir /etc/docker/certs.d
cd /etc/docker/certs.d

# 1.生成CA私钥
openssl genrsa -aes256 -out ca-key.pem 4096

# 2.
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

# 3.生成服务端的私钥
openssl genrsa -out server-key.pem 4096
# 4.生成服务端证书 把下面的$Host换成你自己服务器外网的IP或者域名:比如:openssl req -subj “/CN=192.168.1.0” -sha256…  不可使用通配符
openssl req -subj "/CN=$Host" -sha256 -new -key server-key.pem -out server.csr
# 5.使用CA对公钥签名 把下面的$Host换成你自己服务器外网的IP或者域名 不可使用通配符 若没有dns,忽略它
echo subjectAltName = DNS:$Host,IP:192.168.1.2 >> extfile.cnf
# 将 Docker 守护程序密钥的 extended usage 属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

# 6.生成客户端私钥
openssl genrsa -out key.pem 4096
# 7.生成客户端证书签名请求
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
# 8.要使密钥适合客户端身份验证,请创建一个新的扩展配置文件
echo extendedKeyUsage = clientAuth > extfile-client.cnf
# 9.生成签名证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# 10.生成 cert.pem 和 server-cert.pem 后,您可以安全地删除两个证书签名请求和扩展配置文件
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
# 11. 为了保护您的密钥免受意外损坏,请删除其写入权限。要使它们仅供您读取,请按如下方式更改文件模式
chmod -v 0400 ca-key.pem key.pem server-key.pem
# 12. 证书可以是全局可读的,但您可能希望删除写入访问权限以防止意外损坏
chmod -v 0444 ca.pem server-cert.pem cert.pem
# 13.现在,您可以使 Docker 守护程序仅接受来自提供 CA 信任的证书的客户端的连接
# 修改daemon.json文件
sudo vim /etc/docker/daemon.json
#==========starter========
{
    "hosts":[
        "fd://",
        "unix:///var/run/docker.sock",
        "tcp://0.0.0.0:2376"
    ],
    "tlsverify": true,
    "tlscacert": "/etc/docker/certs.d/ca.pem",
    "tlscert": "/etc/docker/certs.d/server-cert.pem",
    "tlskey": "/etc/docker/certs.d/server-key.pem"
}
#==========end============
sudo vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

开启2376端口

客户端下载以下配置的文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请忽略系统找不到指定文件的bug
我们右键直接连接
在这里插入图片描述

docker高级篇-初入分布式云原生-运维开发工程师

docker高级篇-初入分布式云原生-运维开发工程师

Logo

一站式 AI 云服务平台

更多推荐