目录
一、 VS/VS code创建解决方案、项目一笔带过
1,创建项目
2,启用Docker支持,选择操作系统,生成Dockerfile文件(没选择没关系)
3,完成创建,开发你的项目
4,如果2没有操作,右击项目:添加>Docker支持(项目中会生成Dockerfile文件)
5,调试项目
此处需要注意,启用Docker支持后,默认为Docker启动,此处修改为IIS,否则会自动下载Docker(究极慢)
此处为了操作Linux,我关闭了系统功能:Hyper-V,Docker Desktop启动后报错
6,配置DockerFile文件
因为是在Windows系统下的VS开发所以简化DockerFile文件
注意修改第一行
修改前:FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
修改后:FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
Docker版本不够,build时Step1会报错
报错信息:Step 1/5 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
Error parsing reference: “mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base” is not a valid repository/tag: invalid reference format
#Dockerfile 中的 FROM 指令用于指定要构建的镜像的基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
#所述WORKDIR指令集用于其它Dockerfile指令,诸如工作目录RUN,CMD和也用于运行容器图像的实例的工作目录。
WORKDIR /app
COPY . .
#指示容器端口,并非访问端口
EXPOSE 80
# 入口点,相当于执行命令:dotnet DockerRelease.dll (编译目录下命令方式运行)
ENTRYPOINT ["dotnet", "DockerRelease.dll"]
参考:https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/manage-windows-dockerfile
参考:https://www.cntofu.com/book/139/image/dockerfile/README.md
7,设置DockerFile文件为:“始终复制”
右击DockerFile文件>属性
8,发布asp.net Core 项目
二、利用Xftp工具将发布文件上传至Linux服务器
工具下载地址:https://www.netsarang.com/zh/all-downloads/
1,连接服务器
2,将文件上传至服务器(左边是自己的,右边是服务器的,直接拖动即可)
三、Docker编译/运行镜像
1,编译镜像
# 指定到发布目录
cd /Released/WebApi
# 编译为Docker镜像(Image)
docker build -t 镜像名称 .(此点非彼点,代表当前目录)
#或者直接 ~目录下
docker build 发布文件目录 -t mydockerdome
2,查看镜像列表
docker images
3,运行为容器(为镜像或者存储库New一个实例/对象)
docker run --name=[ContainerName] -p 80:80 -d [ImageName]
# [ContainerName] 容器名称
# -p 8888:80 8888为主机端口,80为DockerFile文件中设置的容器端口,就是将服务器8888端口对应到容器80端口
# -d 后台运行
# [ImageName] 镜像名称
4,查看容器
docker ps 查看运行容器
docker ps -a 查看所有容器
5,浏览器输入地址查看
四、Docker镜像、容器概述,详见二>6参考资料
Docker 镜像
1,我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。
2,Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 容器
1,镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
2,容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
3,前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
4,容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
5,按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
6,数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
五、常用docker命令
docker build *** 编译为镜像Image
docker run *** 运行为容器Container
docker pull [仓库地址] 从仓库拉去镜像
docker images 镜像列表
docker ps -a 容器列表
docker start [Container ID] 启动容器
docker stop [Container ID] 停止容器
docker rmi [ImageID] 移除镜像
docker rm [ContainerID] 移除容器,如果启动中,需要先停止 docker stop
docker rmi $(docker images -q) 移除所有镜像
docker rm $(docker ps -a -q) 移除所有容器
参考资料:https://www.runoob.com/docker/docker-command-manual.html