前几个星期实践的了,再不记录一下真的就忘干净了html
Docker即容器技术,具体的介绍已经有不少,不打算赘述了,说一些优势linux
对我我的来讲,最大的优势就是在一台电脑上能够部署不一样的环境而不用担忧它们产生冲突,最多见的冲突就是端口占用,使用Docker技术能够很方便地规避这一问题,并且便于管理,我不用在本地处理多个环境git
更普遍一点好处还有不少github
下文会看到,即便我在一台普通电脑上同时运行多个环境,也不会占用宿主机过多的资源,正常的开发仍然能够进行,更不用说专门的服务器主机docker
传统的虚拟机技术启动应用服务每每须要数分钟,而 Docker 容器应用,因为直接运行于宿主内核,无需启动完整的操做系统,所以能够作到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。npm
开发过程当中一个常见的问题是环境一致性问题。因为开发环境、测试环境、生产环境不一致,致使有些 bug 并未在开发过程当中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 这段代码在我机器上没问题啊 这类问题。windows
对开发和运维(DevOps)人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。
使用 Docker 能够经过定制应用镜像来实现持续集成、持续交付、部署。开发人员能够经过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则能够直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。bash
因为 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 能够在不少平台上运行,不管是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。所以用户能够很轻易的将在一个平台上运行的应用,迁移到另外一个平台上,而不用担忧运行环境的变化致使应用没法正常运行的状况。服务器
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得很是简单。此外,Docker 团队同各个开源项目团队一块儿维护了一大批高质量的 官方镜像,既能够直接在生产环境使用,又能够做为基础进一步定制,大大的下降了应用服务的镜像制做成本。网络
基础的东西就不说了,不一样操做系统的安装具体看这个
Docker —— 从入门到实践。我在文章里主要记录一些要点,以及在windows系统上的具体操做
和npm同样,国内网络问题,拉去镜像速度比较慢,因此要配置国内镜像,可使用Docker官方的或者其余云服务商提供的
我使用的是Windows 10系统,配置方式是在系统右下角托盘Docker图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registry mirrors 一栏中填写加速器地址 https://registry.docker-cn.com,以后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。
安装完Docker以后再使用cmd命令打开命令控制行中就可使用Docker命令了,目前我只作了一些简单的实践,记录一下我使用频率比较高的指令
首先要查看当前安装使用了哪些容器
这个命令会列出全部容器的状态,容器的ID、名称、使用的镜像、映射地址等,我我的以为是使用频率最高的一个
与npm相似,要想建立容器,须要先选择镜像拉取到本地,在Docker Hub找到须要的镜像,或者本身制做好镜像后,使用docker pull命令拉取到本地,以.NET Core的官方的示例镜像为例
docker pull microsoft/dotnet-samples
执行命令后等待拉取完成便可,再次拉取同一镜像即更新
查看本机的镜像
拉取后查看本地镜像的状态,会分别列出镜像来自的仓库(Repository)、标签(一般是版本号)、镜像ID、建立时间、镜像大小
删除镜像或容器,rm指令的用法对于容器和镜像是相同的,主要不一样的是就是镜像没有名称
若是要经过名称删除镜像,能够这样 docker image rm <仓库名>:<标签>
若是要经过ID删除镜像,能够输入完整的ID,也可使用短ID,短ID就是只输入ID的前几个字符,通常三个以上就能够区分不一样的镜像
须要注意的是,若是有依托于镜像的子容器就不能删除,而且容器正在运行时也不能删除,可是能够加上-f参数,这样Docker会发送SIGKILL信号给容器
另外,全部的container指令能够省掉,docker rm [ID/NAME] 就是删除指定容器
新建并启动一个容器,这个命令比较重要且经常使用的参数比较多,这里用微软官方镜像给的命令做为示例
docker run -it --rm -p 8000:80 --name aspnetcore_sample microsoft/dotnet-samples:aspnetapp
执行这个命令以后,docker首先会看有没有相应的镜像,若是没有就会自动执行拉取操做,咱们前面拉取了微软官方的Core应用镜像,这里则启动一个Web示例镜像,这样会有一个拉取的操做,须要等待一会
这样就是建立成功并启动了,访问http://localhost:8000就能够看到Core的示例网站
若是去掉 --rm 参数,退出后不会删除容器,经过下文的 start 命令能够再启动,若是不使用参数则不会再进入终端
若是有问题能够用前面说的第一个命令ps看下当前容器的状态
当咱们重启docker后,通常状况下容器会处于Exited退出状态,这个时候要经过start命令启动,ID前面说过,使用长ID短ID都可,名称就是建立容器是--name参数设定的
这里用上文已经关闭容器的例子
返回容器ID通常就是启动成功,这样就能够继续经过80端口访问
进入容器,还有另外一个指令 docker attach 二者有些不同,这里会在下文说明缘由
docker exec 后边能够跟多个参数,这里主要说明 -i -t 参数。
前面 run 命令也说过,这里有些相似,只用 -i 参数时,因为没有分配伪终端,界面没有咱们熟悉的Linux命令提示符,但命令执行结果仍然能够返回。当 -i -t 参数一块儿使用时,则能够看到咱们熟悉的 Linux 命令提示符。
可是不知道是否是命令使用错误,只能在后面跟一个 ls这样的简单命令,若是用 cd [目录名称] 这种有空格的命令就没法识别,因此使用 bash 命令进入linux终端就能够正常使用linux命令了
下一节会讲一讲如何在Docker上部署.NET Core,再也不是官方的示例,而是若是从开发环境到部署的环境,本地如何经过Dockerfile构建镜像上传到仓库