Docker架构
(官方文档:https://docs.docker.com/get-started/overview/)
上图现在看不懂不要紧,往下看↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
概念理解
Docker做为一种开放的快速、持续部署平台已经火了很长一段时间了,无论是使用哪种语言,使用docker必会大大提高开发者效率。
从运维说起
虽然从运维说起,但是与开发有着紧密联系。从前程序直接运行在实体机或虚拟机上,代码需要打包成jar包、war包,然后java -jar xxx.jar运行。这样所有项目可能运行在同一台机器上,相互影响(端口冲突,磁盘占满)。后来出现了Vmware虚拟机,给每个项目组或者部门建一个虚拟机,在一定程度上做了隔离,不同的虚拟机之间互不影响,但是还是会存在多个应用共享同一台虚拟机的情况,毕竟资源有限,而且管理太多虚拟机对运维同学不太友好。
Docker出现了
Docker 也是一种虚拟化技术,比vmware更轻量快速,使用方便。
官方安装文档: Get Docker | Docker Documentation 安装很方便
支持Mac、Windows、Linux
如果把docker类比vmware,那运行在vmware上的一个个虚拟机就可以类比为docker的容器,在vmware添加一个虚拟机通常需要一个windows或者linux的镜像,同样运行一个docker的容器也需要一个镜像。
镜像:
镜像是一个只读的程序模版,可以传入命令让其运行起来。比如我们装系统时用windows的镜像,vmware上新建虚拟机时也需要系统镜像。docker镜像也可以这么理解。通常镜像是基于另外的镜像创建的,加上额外的自定义配置。例如基于ubuntu
镜像,加上apche web server和你自己的应用(例如java程序)以及应用需要的配置(例如applicaiton.yml)。
你可以自己制作镜像,推送到注册中心,这样其他人可以拉取你的镜像,也可以上注册中心找找有没有现成的镜像可以用。
官方镜像注册中心 dockerhub: Docker Hub
容器:
容易是一个镜像的运行实例,比如上面的mysql镜像,run起来就是一个mysql容器的实例,可以提供数据库服务。容器有创建、启动、停止、删除等命令,默认情况下,容器与其他容器,容器与宿主机都是隔离的,也可以把宿主机的网络、存储挂载至容器,就像vmware一样,容器销毁时,没有持久化的状态数据会一起销毁。
主要的几个命令:
docker pull xxxxxxx 拉取镜像
docker run xxxxxx 使用镜像运行一个容器
docker build xxxxx 自定义生成一个镜像
docker push xxxx 将自定义的镜像推送至镜像注册中心
举个实例体验一下
我是windows环境:
docker安装好之后,执行下面的命令可以看到docker 的版本
PS C:\Users\a> docker --version
Docker version 20.10.8, build 3967b7d
1. 拉取镜像
在dockerhub搜索mysql,点击官方镜像
点击tag标签,下拉可以看到镜像的各个版本,最新的tag是latest,点击一下右边那个框框那里,命令会自动复制
在命令行执行命令,镜像会拉取到本地
PS C:\Users\a> docker pull mysql:latest
latest: Pulling from library/mysql
a10c77af2613: Pull complete b76a7eb51ffd: Pull complete 258223f927e4: Pull complete 2d2c75386df9: Pull complete 63e92e4046c9: Pull complete f5845c731544: Pull complete bd0401123a9b: Pull complete 3ef07ec35f1a: Pull complete c93a31315089: Pull complete 3349ed800d44: Pull complete 6d01857ca4c1: Pull complete 4cc13890eda8: Pull complete Digest: sha256:aeecae58035f3868bf4f00e5fc623630d8b438db9d05f4d8c6538deb14d4c31b
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
稍微等一下,镜像拉取完成后,执行下面命令可以看到本地的镜像
PS C:\Users\a> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest b05128b000dd 46 hours ago 516MB
2. 运行容器
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -itd mysql:latest
--name 指定容器的名称,可以不填
-e 容器的环境变量,这里是配置Mysql的root密码
-i (interactive)交互式
-t (terminal) 终端
-d (daemon) 后端模式
-p 端口映射,第一个3306是宿主机端口,第二个3306是容器内部端口,这样访问宿主机3306端口会映射给容器内部的3306端口
docker ps 查看当前运行的容器,可以看到容器ID,容器使用的镜像,启动命令,创建时间,运行状态,端口映射,名称
3.使用容器提供的服务
执行"docker exec -it 容器ID bash"进入容器内部,容器ID可以只写前三位,会自动识别。
进入容器内部后,执行mysql创建数据库test。
使用mysql客户端连接数据库
创建表test_table
回到命令行,可以看到表已经有了
一个docker 运行的mysql服务就创建好了。
下一步:
给自己的代码打镜像并推送到注册中心;
建立私有的镜像注册中心;
dockerfile的定义;
使用docker-compse;
docker 和 k8s的关系;
CI/CD
有空再补.....