介绍
Docker于2013年首次发布,由Docker, Inc开发。Docker是一种用于构建、发布及运行应用程序的开源项目,它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。Docker的核心概念是“容器”(Container),容器是一个轻量级的、可移植的软件打包技术,包含了应用运行所需的所有依赖库、配置文件和服务,它类似于虚拟机,但更加轻量,启动速度更快,占用资源更少。
为什么使用?
Docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。
Docker容器与宿主系统共享内核,不像虚拟机需要完整的操作系统,从而提高了效率。
使用Docker,开发者可以打包、分发和运行应用程序及其依赖环境,而无需担心环境配置问题。
Docker的版本:
Docker CE(Community Edition): 这是Docker的开源版本,免费,适合个人开发者和小型团队使用。它包括Docker Engine、Docker CLI、Docker Compose和Docker Swarm等组件。
Docker EE(Enterprise Edition): 这是收费的商业版本,为企业用户提供更多功能和支持,如安全扫描、镜像管理和多主机容器编排等。EE版本分为Basic、Standard和Advanced三个版本,提供不同的功能和支持级别。
Docker Desktop: 这是一个适用于Windows和macOS的桌面应用程序,提供图形界面管理Docker容器,并包含Docker Engine和Docker CLI。
Docker安装
提示:在安装之前首先得保证我们的虚拟机CentOS7的yum源已经更新,因为今年的6月份CentOS已经停止对7的维护了,所以要先把yum源改成国内的;这里可以参考我的博客——更换yum源:CentOS7安装及静态IP配置与yum源更换
1.卸载旧版本
如果系统中之前安装过docker的,就先把旧版本删除
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux
2.安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
3.配置Docker的yum源
#将docker-ce仓库地址添加到YUM的仓库列表中,以便能够安装或更新那些不在默认仓库中的软件包。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#查找/etc/yum.repos.d/docker-ce.repo文件中所有的download.docker.com字符串,并将其替换为mirrors.aliyun.com/docker-ce
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
4.更新yum建立缓存
yum makecache
5.安装docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
6.启动和校验
# 查看docker版本
docker -v
# 设置开机自启
systemctl enable docker
# 启动Docker
systemctl start docker
# 执行docker images命令,如果不报错,说明安装启动成功
docker images
7.配置镜像加速
# 创建目录
mkdir -p /etc/docker
# 添加国内镜像加速地址
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["http://hub-mirror.c.163.com","https://mirrors.tuna.tsinghua.edu.cn","http://mirrors.sohu.com","https://ustc-edu-cn.mirror.aliyuncs.com","https://ccr.ccs.tencentyun.com","https://docker.m.daocloud.io","https://docker.awsl9527.cn"]
}
EOF# 重新加载配置
systemctl daemon-reload# 重启Docker
systemctl restart docker
Docker的基本使用
1.常用命令
docker image pull
选项 | 默认 | 描述 |
---|---|---|
-a, --all-tags | 下载存储库中所有标记的镜像 | |
–disable-content-trust | true | 跳过镜像验证 |
–platform | 如果服务器支持多平台,则设置平台 | |
-q, --quiet | 禁止详细输出 |
- 执行命令后的结果解释:
docker pull mysql #默认不指定的话就是拉去最新的版本
latest: Pulling from library/mysql #拉取的消息
2c0a233485c3: Pull complete #pull complete表示拉取完成
cb5a6a8519b2: Pull complete
570d30cf82c5: Pull complete
a841bff36f3c: Pull complete
80ba30c57782: Pull complete
5e49e1f26961: Pull complete
ced670fc7f1c: Pull complete
0b9dc7ad7f03: Pull complete
cd0d5df9937b: Pull complete
1f87d67b89c6: Pull complete
Digest: sha256:0255b469f0135a0236d672d60e3154ae2f4538b146744966d96440318cc822c6
#Digest是摘要信息这里显示的是sha256的镜像ID
Status: Downloaded newer image for mysql:latest
#拉取结果状态,此处表示拉取的是最新的mysql
8a1c151b30b759efffd9c044fd562f4779988324531e4c1981590df82fa9be3b
docker image rm
- 别名: docker image rm | docker image remove | docker rmi
- 描述: 移除一个或多个镜像
- 用法: docker rmi [选项] 镜像1 [镜像2 镜像3…]
- 选项
选项 | 描述 |
---|---|
-f, --force | 强制删除镜像 |
docker rm
- 别名: docker container rm | docker container remove | docker rm
- 描述: 移除一个或多个容器
- 用法: docker image rmi [选项] 容器1 [容器2 容器3 …]
- 选项
选项 | 描述 |
---|---|
-f, --force | 强制删除运行中的容器 |
-l, --link | 删除指定的连接 |
-v, --volumes | 删除与容器关联的匿名卷 |
docker images
选项 | 描述 |
---|---|
-a, --all | 显示所有镜像,包括中间层镜像(即构建过程中产生的临时镜像) |
–digests | 显示摘要 |
-f, --filter | 根据提供的条件过滤输出,详细见:Docker images --filter |
–format | 使用自定义模板格式化输出:table、table TEMPLATE、json、TEMPLATE;请参阅docker images --format |
–no-trunc | 不要截断输出 |
-q, --quiet | 仅显示镜像的D |
–tree | 以树状的形式显示镜像 |
docker run
选项 | 描述 |
---|---|
-d, --detach | 后台运行容器并打印容器ID |
–name | 为容器指定名称 |
–network | 指定容器连接的网络 |
-v, --volume | 绑定安装卷 |
-p, --publish | 将容器的端口发布到主机 |
-P, --publish-all | 将所有暴露的端口发布到随机端口 |
docker container start
- 别名: docker start
- 描述: 启动一个或多个已停止的容器
- 用法: docker container start [选项] 容器1 [容器2 容器3 …]
- 选项: 具体的选项参考:docker start的选项
docker container stop
- 别名: docker stop
- 描述: 停止一个或多个正在运行的容器
- 用法: docker container stop [选项] 容器1 [容器2 容器3 …]
- 选项: 具体的选项参考:docker stop的选项
docker container restart
- 别名: docker restart
- 描述: 重启一个或多个容器
- 用法: docker container restart [选项] 容器1 [容器2 容器3 …]
- 选项: 具体的选项参考:docker restart的选项
docker container ls
- 别名: docker container list | docker container ps | docker ps
- 描述: 重启一个或多个容器
- 用法: docker container ls [选项]
- 选项
选项 | 描述 |
---|---|
-a, --all | 显示所有容器(默认显示正在运行) |
-f, --filter | 根据提供的条件过滤输出 |
–format | 使用自定义模板格式化输出 |
-s, --size | 显示文件总大小 |
更多选项 | docker ps选项 |
docker container exec
- 别名: docker container list | docker container ps | docker ps
- 描述: 在正在运行的容器中执行命令
- 用法: docker container exec [选项] 容器 命令 [传给命令的参数…]
- 选项: 具体的选项参考:docker exec的选项
其他命令见:docker命令官方文档
2.命令演示
这里通过拉取nginx做为常用命令的一个演示
# 拉取Nginx镜像
docker pull nginx# 查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB# 创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx# 查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 访问网页,地址:http://虚拟机地址,如果报错无法访问,就把防火墙关闭,或者开放相对应的端口# 停止容器
docker stop nginx# 查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 再次启动nginx容器
docker start nginx# 再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL,待出现Enter password:字眼时输入密码即可进入容器内的mysql
docker exec -it mysql mysql -uroot -p# 删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
注意: 默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器,可以通过以下命令实现开机自启动:
# Docker开机自启 systemctl enable docker
# Docker容器开机自启 docker update --restart=always [容器名/容器id]
数据卷
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。
可预见的问题:
数据卷介绍:
Docker 数据卷(Volume)是 Docker 中用于持久化存储和共享数据的重要机制。数据卷可以绕过容器文件系统的 Union File System,提供了一种方便的机制来管理应用程序数据。
特性:
1.数据卷命令
命令 | 说明 |
---|---|
docker volume create | 创建数据卷,详细说明见:docker volume create |
docker volume ls | 查看所有数据卷,详细说明见:docker volume ls |
docker volume rm | 删除指定数据卷,详细说明见:docker volume rm |
docker volume inspect | 查看某个数据卷的详情,详细说明见:docker volume inspect |
docker volume prune | 清除数据卷,详细说明见:docker volume prune |
注意: 容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。
2.数据卷挂载
默认的存放所有容器数据卷的目录:/var/lib/docker/volumes,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data。
挂载的语法:
1.挂载在宿主机默认的数据卷目录
docker run -d --name 容器名 -p 宿主机的端口:应用端口 -v 数据卷:容器内被挂载的目录|文件 应用
2.挂载在本地目录或文件
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载,挂载语法与数据卷类似,例如:
-v mysql:/var/lib/mysql #如果不加./或者/路径的话就会被识别成数据卷
-v ./mysql:/var/lib/mysql #./为在挂载在当前目录下的mysql目录,如果运行时不存在会自动创建
数据卷挂载演示
此处以nginx为例子演示挂载数据卷
如果要挂载的容器具体路径不知道,可以在https://hub.docker.com/中搜索对应的应用,它会有说明,比如直接搜索Nginx,他就会出现Nginx相关的说明
来到nginx这一项的页面后往下面滑就是Nginx相关的一些说明
#创建容器并指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
#查看数据卷
docker volume ls
#查看数据卷的结果
DRIVER VOLUME NAME
local 39163b69dad792b461a0dc6253c809f92fda0865bad63c6925fb403b6bb15323
local html
#查看数据卷详情
docker volume inspect html
#结果
[{"CreatedAt": "2024-12-18T17:27:46+08:00", #创建的时间"Driver": "local", #卷的驱动类型,这里指的是本地"Labels": null, #卷标签"Mountpoint": "/var/lib/docker/volumes/html/_data", #卷挂载的位置"Name": "html", #卷的名称"Options": null, #卷选项"Scope": "local" #卷作用域}
]
对比卷的内容和容器内被挂载的内容
#进入nginx容器里面查看 /usr/share/nginx/html 看到底有写什么东西
#进入nginx容器
docker exec -it nginx bash
#进入/usr/share/nginx/html路径
cd /usr/share/nginx/html/
ls
#ls输出结果
50x.html index.html
#查看宿主机卷里面有什么
#用exit退出nginx容器
exit
#进入nginx挂载的卷:/var/lib/docker/volumes/html/_data/
cd /var/lib/docker/volumes/html/_data/
ls
#输出的结果
50x.html index.html
可以看到容器内的内容和被数据卷里面的内容一样
尝试在宿主机的卷上修改内容是否能够同步到容器里面去
#进入宿主机的卷
cd /var/lib/docker/volumes/html/_data/
#编辑nginx的欢迎页面
vim index.html
#在index.html的页面中h1下新增一个h2标签
#修改后的index.html文件
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<h2>hello docker volume</h2> #新增后wq保存
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
然后在浏览器访问一下
再次进入容器里面查看index.html是否跟宿主机上的一样
docker exec -it nginx bash
cd /usr/share/nginx/html/
cat index.html
可以看到宿主机和容器里面的index.html是一样的
**拓展:**有些应用默认创建容器的时候如果没有指定挂载的话会自动创建一个匿名卷,比如:mysql,匿名卷就是由一串hash组成的目录在宿主机,如下图: