使用Docker前咱们首先要简单了解一下容器的概念。MSDN上有一张虚拟机和容器的对比图,很好的展现了虚拟机和容器的区别,以下所示,虚拟机包括应用程序、必需的库或二进制文件以及完整的来宾操做系统,每台虚拟机都有一个单独的内核,咱们彻底能够把虚拟机看作是一台真实的物理机。 容器包括应用程序及其全部依赖项,与其余容器共享 OS 内核,容器在主机操做系统上做为独立进程运行,咱们能够把容器看作是一个应用沙盒。node
咱们常常会遇到“我机器上能够运行”的问题吧,而后部署到其余机器时就遇到了各类坑,这可能是由于其余设备上缺乏应用所需的环境或者缺乏应用的依赖项形成的。使用容器技术能够很好的解决这个问题,容器是一个“应用的沙盒”,这个沙盒内部包含了应用所需的环境和全部依赖项,只要有这个沙盒存在,应用在任何环境下都能正常的运行,容器技术的典型特色就是“一次封装,处处运行”。mysql
Docker 是一个使用go语言开发的开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。咱们先了解Docker中的三个核心概念:linux
1 镜像(Image)git
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的全部内容,包括代码、运行时、库、环境变量和配置文件。github
2 容器(Container)web
容器是镜像的运行时实例 ,执行镜像时内存中运行的就是容器。若是把镜像看作面向对象中的类,容器就是对象。使用类时经过new来获取一个对象,相似的使用镜像时经过 docker run <镜像名/镜像id> 建立一个容器。sql
3 仓库(Repository)docker
仓库时用来存放镜像的地方,Docker hub是docker官方提供的仓库,相似于githhub,,经过push推送镜像到仓库,经过pull命令拉取镜像。固然咱们也可使用其余仓库,或者本身搭建一个仓库。npm
docker是运行在Linux系统上的,在Windows上使用docker默认要用到Hyper-V功能,因此咱们在Windows系统上安装Docker必须先开启Hyper-V功能。首先打开【控制面板】,找到【启动或关闭Windows功能】,而后勾选【Hyper-V】,点击肯定便可安装Hyper-V。windows
安装好Hyper-V后,到docker官网下载Windows版本的docker,docker须要登陆帐户才能下载,咱们能够建立一个帐户,牢记这个帐号,咱们之后会常常用到。docke下载地址:docker下载。下载完成后,双击安装包,一路next便可。安装完成后须要重启电脑,打开命令行,输入 docker run hello-world ,若是出现如下界面,表示docker已经安装成功了。docker run hello-world命令首先会在本地找名字为hello-world的镜像,若是本地不存在这个镜像就会从docker hub上拉取hello-world镜像,而后运行。
Linux系统安装经常使用软件都十分方便,执行下边的命令便可安装docker
#删除旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #安装一些须要的工具 yum install -y yum-utils device-mapper-persistent-data lvm2 #添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum缓存 yum makecache fast #安装docker yum -y install docker-ce #启动docker服务 systemctl start docker #测试docker docker run hello-world
安装完成后执行 docker run hello-world命令,若是出现下边的界面表示docker安装成功了
能够查看官方教程详细地了解docker的使用,这里咱们先用两分钟分钟展现一下微软官方提供的docker栗子,执行命令 docker run -p 8000:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/core/samples:aspnetapp ,-p 8000:80表示将服务器的8000端口和容器的80端口创建映射,访问服务器8000端口时会去访问容器的80端口。--name设置镜像的名字
打开浏览器,访问虚拟机的8000端口以下,说明咱们的容器已经成功启动了!
咱们使用 docker images 和 docker container ls 查看一下本机的容器和镜像,结果以下:
其实咱们实际开发中能用到的docker命令并很少,这里简单汇总一下最经常使用的docker命令。
## 查看docker版本和信息 #查看docker-cli的版本 docker --version #查看docker版本和信息 docker version docker info ## docker镜像相关命令 #拉取镜像 docker pull [imgName:tag] #运行镜像,执行后会生成一个容器 docker run [imgName:tag/imgID] #查看全部的镜像 docker images #删除镜像 执行rmi命令前必须删除全部该镜像的container docker rmi [imgName:tag/imgID] #查看全部的容器,没有-a表示查询全部正在运行中的容器 docker container ls -a #查看docker正在运行和已经中止的容器 docker ps -a #启动容器 docker start [ctnName/cID] #中止容器 docker stop [ctnName/cID] #删除容器,执行rm命令前必须先中止该容器 docke rm [ctnName/cID] ##清理镜像和容器 #删除全部的镜像和容器 docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a) #删除全部的容器 docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) #清除名称为none的镜像 docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep none|awk '{print $3 }'|xargs docker rmi
有时候咱们须要和容器交互,可使用命令 docker exec -it [name/id] common 。如咱们启动一个mysql容器mysqlx1,执行 docker exec -it mysqlx1 mysql -p 表示和容器mysqlx1交互,执行的命令是【mysql -p】进行登陆,以下所示。 Ctrl +p+q 退出容器,回到服务器目录。
大多数用户使用docker的核心目的是更方便的交付项目,就是将咱们的应用程序构建成镜像,而后交付镜像便可,这里演示怎么构建一个Aspnet core项目的镜像。
咱们建立一个Asp net core MVC项目,项目名为DockerDemo,为了方便不勾选Https和Docker支持,以下:
简单修改首页,运行一下,测试项目没有bug,运行首页以下:
发布项目,而后在发布文件夹下添加Dockerfile文件,结构以下:
Dockerfile的内容以下:
#拉取runtime父镜像,运行aspnet core应用必需要用runtime FROM microsoft/dotnet:2.2-aspnetcore-runtime #设置容器工做目录 WORKDIR /DockerDemo #把当前目录的全部文件copy到工做目录中 COPY . /DockerDemo #暴露一个端口让外部能够访问 EXPOSE 8080 #容器入口命令,即容器启动时执行dotnet DockerDemo.dll命令 ENTRYPOINT ["dotnet", "DockerDemo.dll"]
Dockerfile常见指令简单说明
Dockerfile经常使用指令: #FROM:一般状况下,咱们建立的镜像时基于另一个镜像的,这时就要用FROM,固然咱们也能够彻底从头建立 #WORKDIR:设置容器的工做目录 #MAINTAINER:该镜像的维护人 #COPY:常常须要把源码复制到容器中,只用COPY就能够实现这一点 #RUN:这里能够定义一些须要运行的命令,执行的目录是WORKDIR。如npm install ,dotnet restore,dotnet run等 #ENTRYPOINT:定义容器的入口,一般是一些dotnet/node等命令,如dotnet xxx.dll #CMD:设置容器运行的默认命令和参数,即容器启动时执行的命令。当容器运行时,能够经过命令行覆盖CMD定义的命令 #EXPOSE:暴露端口 #ENV:设置环境变量
docker建立镜像很简单,执行 docker build -t dockerdemo:v1.0 . 命令便可建立镜像,其中dockerdemo:v1.0是镜像的名字和版本tag,名字和tag能够随便设置。而后经过 docker images 命令查看全部镜像,以下:
使用命令 docker run -d -p 8080:8080 dockerdemo:v1.0 启动容器,-d 表示后台运行,-p 8080:80表示服务器的8080端口映射到容器的80端口,咱们也可使用服务器的其余端口,容器的端口为Dockerfile中Expose的端口。执行 docker container ls 查看容器,这里咱们的容器已经启动了,以下:
打开浏览器,输入【服务器IP:服务器端口】接口访问容器,以下:
到这一步,本地建立镜像和运行容器成功了。
docker提供了远程仓库用于存储和分发镜像,其做用相似于github,区别在于github托管代码,而docker hub托管镜像。咱们建立好了镜像能够推送(push)到远程仓库,而后在其余设备上拉取(pull)镜像,有了docker hub咱们能够更方便的管理和分发镜像。docker hub的使用很是简单,只记住三个命令就能够了
#标记镜像,就是设置远程镜像名和标记 docker tag localname:localtag dockeruser/repname:reptag #推送镜像文件到docker hub docker push username/repname:reptag #拉取远程镜像 docker pull repname:reptag #注:localname是本地镜像名 localtag是本地镜像tag # repname远程仓库的镜像名 reptag是远程仓库的tag # username是咱们的dockerhub用户名
这里将上边建立的本地镜像推进到docker hub。 使用命令 docker tag dockerdemo:v1.0 wyyxxx/resdockerdemo:v1.0 标记,使用命令 docker push wyyxxx/resdockerdemo:v1.0 推进镜像到远程仓库,打开 镜像仓库,登录后就能够看到咱们自定义的镜像了,以下所示。
而后使用另外一台安装了docker的服务器,执行命令 docker run -p 8080:8080 wyyxxx/resdockerdemo:v1.0 拉取远程镜像并启动 ,打开浏览器输入地址,以下:
咱们在经过拉取远程镜像并运行容器时,不须要事先部署环境(如安装runtime)等,由于镜像中已经设置了须要的全部环境和依赖资源,只须要使用 docker run 命令运行便可。这也是使用容器交付的方便之处。
① “3C原则”一个容器只运行一个应用
② 使用镜像交付应用程序,而不是直接部署
若是要在centos上部署一个aspnet core应用程序。错误的作法是:在docker中先安装一个centos系统,在centos系统中部署环境,而后部署咱们的netcore应用程序,,最后把部署的应用程序生成镜像。正确的作法是经过Dockerfile定义咱们须要的环境和依赖项,而后生成镜像,经过镜像去分发和执行。
③ 分层构建镜像
仍是上边centos部署netcore应用的栗子,若是从零定制镜像时,咱们应该把centos做为一层镜像,环境runtime做为一层镜像,最后咱们的应用作为一层镜像,使用Dockerfile的FROM 指令拉取父镜像。这样作的好处是节省空间和复用镜像。如上边咱们使用了2.2版本的runtime镜像,当咱们建立了另外一个web应用再来定制镜像时,这两个应用程序镜像能够 共用同一个runtime镜像。
④ 不要把数据存储在容器中
容器是随时可能销毁的,销毁后容器内部的数据就不存在了,因此最好不要在容器中存储须要持久化的数据。