docker学习: 1. docker基本使用

应用场景

后端系统会部署很多服务,包括我们自己开发的服务,还有 mysql、redis 等中间件的服务,部署它们需要一系列依赖的安装、环境变量的设置等等。

如果你要部署多台机器的话,同样的操作要重复多次,万一哪一步漏掉了,服务就跑不起来了。就很麻烦。

而 Docker 就能完美解决这个问题:

它把应用所有文件封装成一个镜像,镜像跑起来作为容器,它可以在一台机器上跑多个容器,每个容器都有独立的操作系统环境,比如文件系统、网络端口等,在容器内跑各种服务。

这样整个环境都保存在这个镜像里,部署多个实例只要通过这个镜像跑多个容器就行。

什么是docker

传统虚拟机需要在上面安装一个完整的操作系统,右边图每个虚拟机都有一个OS操作系统。

Docker 推出了容器的概念,每个容器不需要安装完整的操作系统,里面的进程直接运行在 Docker 创造的宿主内核中。

优点1:更少的资源占用,启动更快

可以这么理解,右边的图是虚拟机,它需要虚拟硬件(CPU,内存等),一台电脑顶多安装几个虚拟机。但是,docker 可以运行几十个容器,因为它不需要虚拟硬件。

优点2:统一的运行环境

docker 因为它运行在自身的 Host Operating System 中,和操作系统无关,所以它可以部署到任何环境、机器和操作系统中。

优点3:微服务架构,docker 天生适配微服务架构

安装docker

本地电脑可以直接安装docker的客户端,不过这都需要翻墙才行,现在docker对大陆进行了屏蔽。

如果是服务器的话,可以参考这篇文章进行安装。

手工部署Docker [support.huaweicloud.com/bestpractic...]

docker 一般需要设置国内镜像源,否则安装太慢了。

服务器进行设置国内镜像源,也可以参考上面的文章。

设置成功之后,执行docker info:

体验 docker

Docker 提供了 Docker Hub 镜像仓库,可以把本地镜像 push 到仓库或者从仓库 pull 镜像到本地。

  • client:docker 客户端,可以是用docker desktop,也可以是命令行工具;
  • docker_host:docker运行程序,一般是后台运行daemon;
  • registry:docker镜像仓库。

下面运行一个nginx镜像感受下,我们先用命令行的方式运行。

在命令行用 docker search、docker pull 搜索和拉取镜像:

pull 下来之后启动

bash 复制代码
docker run -p 8000:80 --name container-name -d image-name
// 简化: 不写--name container-name 会创建一个随机的名称, 一般使用这种简写的形式
docker run -p 8000:80 -d nginx
  • -d 后台运行

  • -p 端口映射 8000 为主机的端口,80 为镜像中的端口

  • --name 自定义容器名称

  • image-name 镜像名称,假如本地没有下载,会先自动 pull 一次镜像

启动之后,就可以访问了:

容器内跑的 nginx 服务是在 80 端口,你要把宿主机的某个端口(8000)映射到容器的 80 端口才可以访问。

接下来是数据卷 volume,这个是把宿主机某个目录挂到容器内。

因为容器是镜像跑起来的,下次再用这个镜像跑的还是同样的容器,那你在容器内保存的数据就会消失。

所以我们都是把某个宿主机目录,挂载到容器内的某个保存数据的目录,这样数据是保存在宿主机的,下次再用镜像跑一个新容器,只要把这个目录挂载上去就行。

挂载本地的 /tmp/aaa 到容器内的 /usr/share/nginx/html 目录。

这里的 /tmp/aaa 可以换成宿主机的任何目录,如果是 windows 系统,那就是类似 D://tmp/aaa 这种。

我们在 /tmp/aaa 目录下添加一个 index.html,那么这个文件就会出现在容器中。

浏览器访问 http://localhost:8000 就可以访问到。

这就是 volume 挂载的作用。

如果你挂载某些目录报错,是因为 docker desktop 挂载的目录是需要配置的,在 Settings > Resources > File Sharing 里加一下就行:

至于挂载到的目录,在镜像搜索结果页有写:

通过命令行 docker run 来跑镜像, -v 是指定挂载的数据卷,后面的 :ro 代表 readonly,也就是容器内这个目录只读,:rw 表示容器内可以读写这个目录。

docker run 会返回一个容器的 hash:

就是这里的 id:

这个界面可以用 docker ps 来获取。

它是显示容器列表的,默认是运行中的。

想显示全部的,可以加个 -a。

除了 container 列表,image 镜像列表也可以通过 docker images 命令获取。

我们在容器的 terminal 里执行命令,对应的是 docker exec 命令:

-i 是 terminal 交互的方式运行

-t 是 tty 终端类型

然后指定容器 id 和 shell 类型,就可以交互的方式在容器内执行命令了。

相关推荐
崔小汤呀9 小时前
Docker部署Nacos
docker·容器
缓解AI焦虑9 小时前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter1 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
シ風箏1 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
BugShare1 天前
继《小爱音响》详细说下怎么部署,尤其是关于Docker部分
docker·nas·xiaomusic
小马爱打代码1 天前
Docker:完全指南从入门到精通
运维·docker·容器
ITKEY_1 天前
docker 容器端口映射消失
docker·容器
倚肆1 天前
在 Windows Docker 中安装并配置 Nginx (映射 Windows 端口与路径)
windows·nginx·docker