一、为什么学
每学一个东西,我们肯定是基于某个需求去学习的,众所周知,软件开发最麻烦的是环境配置,开发好好的,部署出问题就很难受,所以为了确保开发、测试、部署环境一致,且高效的部署所以选择了容器技术而非 VM ,而 Docker 是基于 Linux 容器技术的开源项目,它的口头禅就是:“一次构建,处处运行”,具有轻量,速度,社区活跃,且拓展性高。处处运行,从帮家到搬楼
(一)作用:
解决了运行环境和配置问题,方便做持续集成并有助于整体发布容器虚幻技术
(二)具体场景:
更快速的应用交付和部署
更快捷的升级和扩缩容
更简单的系统运维
更高的计算资源利用
二、docker组成
(一)镜像:image
一个只读模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器,docker镜像文件类似于java类模板,而docker容器实例类似于java中new出来的实例对象
(二)容器:container
是用镜像创建的运行实例,为镜像提供了一个标准的隔离运行环境,可以被启动、开始、停止、删除。类似于java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。
(三)仓库:repository
是集中存放镜像文件的场所。类似于gihub仓库,存放各种git项目的地方。仓库分为公开仓库和私有仓库,最大的公开仓库Docker Hub,存放了数量庞大的镜像供用户下载, 国内公开的仓库有阿里云和网易云等
三、安装
下载路径,选择对应的操作系统——window10系统,Developers - Docker ,双击下载的exe文件,首次启动会创建虚拟机,稍等几分钟即可。
检测是否安装成功:可以在终端cmd输入docker -v来进行检查docker版本。
如果在docker desktop安装过程中出现了安装失败,那么重新进行第二步运行相应的步骤和开启hyper-v的操作,然后要重新启动电脑,再进行docker desktop安装。
四、简单的命令
#启动docker
systemctl start docker
#停止docker
systemctl stop docker
#重启docker
systemctl restart docker
#查看docker状态
systemctl status docker
#查看docker信息
docker info
镜像命令:
#拉取镜像
docker pull 镜像名
docker pull 镜像名:tag
#查看镜像
docker images
#删除镜像
docker rmi -f 镜像名/镜像ID #删除一个
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID #删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f $(docker images -aq) #删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
#搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
#运行镜像
docker run 镜像名
docker run 镜像名:Tag
#保存镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
容器命令:
#运行nginx容器
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
docker run -d --name test-nginx -p 3000:80 nginx
# 查看正在运行的容器
docker ps
# 查看所有创建过的容器(运行或者关闭)
docker ps -a
# 停止容器
docker stop [container]
# 启动容器
docker start [container]
# 删除容器
docker rm -f [containerid]
# 查看后台运行的日志
docker logs [containe]
#进入容器的shell
docker container exec -it [containe] /bin/bash
五、拉取镜像案例
1、拉取nginx镜像
docker pull nginx
2、启动nginx镜像
docker run -d --name test-nginx -p 3000:80 nginx
3、打开 localhost:3000 即可访问到熟悉的 nginx 页面了
初学者肯定会疑问nginx是什么?
Nginx(发音为“engine-x”)是一个用于HTTP、HTTPS、SMTP、POP3和IMAP协议的开源反向代理服务器,以及负载平衡器、HTTP缓存和web服务器(源服务器)。nginx项目从高度关注高并发性、高性能和低内存使用开始。它是在类似于BSD的第二条款许可下获得许可的,并且它运行在Linux、BSD变体、Mac OS X、Solaris、AIX、HP-UX以及其他*nix版本上。它还为Microsoft Windows提供了概念端口的证明。
六、遇到的问题
1、在拉取镜像的时候可能会遇到如下所示的错误提示 :
这个问题主要原因是docker desktop没有启动
2、启动之后弹出如下所示(若没有则不管,有的话按照下面步骤继续执行),点击重启的时候老是失败,因为需要更新一下WLS 2
推荐Windows将WSL 1升级为WSL2_Xeon-Shao的博客-CSDN博客_wsl1升级到wsl2学习,
也可以根据旧版 WSL 的手动安装步骤 | Microsoft Docs 步骤执行
(建议看完以上两个推荐的解决方式先执行一边)
3、下载wsl_update_x64.msi,双击安装
4、在powershell上输入wsl - set-default-version-2
操作完这步之后,点击Restart,等待一下就能启动docker了
5、输入docker pull nginx并可成功拉取nginx镜像
七、用 Dockerfile 构建一个镜像(windows环境)
(一)案例一:输出一个hello Docker
1、在桌面新建一个docker-test文件夹,里面放置一个 Dockerfile 文件, Dockerfile 文件里面的内容为:
#指定基础的镜像为nginx。
FROM nginx:latest
#: 指定镜像创建者TTT和联系方式。
MAINTAINER TTT [email protected]
#容器内部执行的命令(在index.html中输出‘hello, Docker!’)。
RUN echo '<h1>hello, Docker!</h1>' > /usr/share/nginx/html/index.html
2、docker-test文件夹所对应的目录地址栏中输入cmd,打开命令提示符窗口,输入命令
# 生成一个名为 nginx 标签为0.0.1 的镜像 ,注意最后还有一个 .
docker image build -t nginx:0.0.1 .
如下图所示
3、查看镜像,多了一个自己生成的镜像
4、启动容器
# 根据刚生成的镜像 启动容器
docker run -d --name test-nginx1 -p 3001:80 nginx:0.0.1
5、访问 locahost:3001 已经不是默认的 nginx 的访问页面了
这里解释一下参数
- -p 参数是指容器的 80 端口映射到本机的 3001 端口
- -d 守护式运行(适合运行应用程序和服务)
- --name 容器名称 如果不指定则是一个随机的名称
(二)案例二,输出一个index.html
1、在案例一种的文件夹中加一个index.html文件:在docker-test文件夹里面新建一个index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello World</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
2、修改 Dockerfile 文件,重点是:COPY index.html /usr/share/nginx/html/index.html
# 声明基于 nginx 最新的镜像 这里说一下镜像名:后面的是标签 默认是latest
FROM nginx:latest
# 把刚才 index.html 复制到 nginx 的 html 路径去
COPY index.html /usr/share/nginx/html/index.html
# 声明暴露80端口,要是运行不成功就把这句去掉
EXPOSE 80
3、运行命令,注意这里要把之前的容器和镜像删除(考验删除容器和镜像命令的时候到了,先停止容器,删除容器再删除镜像),也可以不删除案例一生成的镜像,将下面的镜像标签更换一下,启动容器时候将名字改一下
# 生成一个名为 nginx 标签为0.0.1 的镜像 ,注意最后还有一个 .
docker image build -t nginx:0.0.1 .
# 根据刚生成的镜像 启动容器
docker run -d --name test-nginx1 -p 3001:80 nginx:0.0.1
4、访问 locahost:3001
当然,真正开发的时候,肯定不可能是这样去修改了,好比之前的端口映射,也可以将容器的内部的目录也映射出来实现共共享,可以使用 Volume,目前先学习到这里 ,Volume后期再学习和更新