Docker入门 第三课 --Docker几个常用命令
平时使用Docker,主要是用客户端 Kitematic,但 Kitematic 只实现了基本的使用功能,如果想更深入的使用Docker,命令行还是必不可少的。 前两课中,已经介绍过几个Docker命令:
1 2 3 4 5 6 7 8 |
docker pull:从镜像仓库中拉取镜像 。 docker run:通过镜像创建一个新的容器,并运行。需要注意的是,如果本地没有指定的镜像,会直接去镜像库下载,一定要保证拼写正确。 docker stop:停止一个容器 。 docker start:启动一个容器 。 docker restart:重启一个容器 。 docker ps:列出当前运行的容器机器状态 。 docker images 或 docker image ls:列出本地镜像。 docker build:使用Dockerfile创建自己的镜像。 |
这里记录几个Docker使用过程中,最容易用的的基础命令,包括镜像构建,镜像操作,容器使用。 镜像构建: docker build [OPTIONS] PATH | URL | – -t name:tag 表示给镜像命名,并指定标签(相当于版本号) -f Dockerfile 指定Dockerfile文件,默认为’PATH/Dockerfile’,即当前目录下的Dockerfile-t name:tag 表示给镜像命名,并指定标签(相当于版本号) PATH 表示本地工作目录(也就是命令最后的 . ,我这里是项目文件夹) 示例:(注意命令的执行目录和工作目录) docker build -t slide-verify:1.0 . 镜像操作命令: 查看本机镜像:docker images 移除指定镜像: docker image rm 镜像ID docker rmi 镜像ID 清除无效镜像:docker image prune(清除没有名称且未被使用的镜像) 查看镜像信息:docker inspect 镜像ID 容器操作命令: 运行容器:docker run -it -p 5000:80 --name slide-verify10 slide-verify:1.0 查看运行中的容器: docker ps docker container ls 查看全部容器:docker ps -a 移除容器:docker container rm 容器ID 启动容器:docker start 容器ID 关闭容器:docker stop 容器ID 重启容器:docker restart 容器ID 进入容器:docker exec -it 容器ID /bin/bash (相当于远程登录虚拟机) 退出容器:exit […]
View DetailsDocker入门 第二课 --镜像构建,Dockerfile解读
今天聊一聊Dockerfile,docker build,希望通过这篇文章,能让你对docker镜像构建过程有一个认识。 事情还得从一次Docker镜像创建失败说起。 问题背景: 环境VS2017,dotnet 2.1 版本 ,使用默认生成的Dockerfile文件,当我使用docker build命令创建镜像的时候,竟然报错了
1 2 |
Step 6/16 : ...... COPY failed: stat /mnt/sda1/var/lib/docker/tmp/docker-builder802544848/EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj: no such file or directory |
错误信息是,第6步,找不到指定的文件或文件夹,由于我执行docker build命令的路径与 项目文件(xxx.csproj)在同一目录下,所以,这个文件找不到也很正常,那到底是哪里出问题了呢?我们来捋一捋。 执行docker build命令的路径与项目文件(xxx.csproj)在同一路径。 docker build 命令如下:
1 |
docker build -t slide-verify:1.0 . |
Dockerfile内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj", "EasySlideVerificationDemoServer/"] RUN dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" COPY . . WORKDIR "/src/EasySlideVerificationDemoServer" RUN dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "EasySlideVerificationDemoServer.dll"] |
Docker镜像生成原理: Docker镜像与操作系统镜像本质上是一样的,首先需要一个基础镜像,然后在基础镜像上搭建所需环境,安装软件,最后生成一个新的镜像,新的镜像就可以在Docker中进行部署,生成容器实例,从而开始运行服务。 Dockerfile中的命令: 从上面Dockerfile中,我们可以看到有这几个命令:FROM,WORKDIR,EXPOSE,COPY,RUN,ENTRYPOINT,大概了解一下这几个命令的意思。 FROM: 指定一个基础镜像 WORKDIR: 在镜像内指定一个目录,作为当前工作目录 EXPOSE: 指定端口号 COPY: 从一个目录(这个目录可以是本地目录或中间镜像的目录)中复制文件或者目录到容器里指定路径 RUN: 在镜像内执行相应命令 ENTRYPOINT: 入口点,与RUN类似,同样是执行程序命令,表示容器启动时需要执行的命令。 Dockerfile文件解读: 我们来解读一下这个Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
将镜像 microsoft/dotnet:2.1-aspnetcore-runtime 作为基础镜像 (base) 指定镜像内工作目录为:/app 指定端口号为:80 将镜像 microsoft/dotnet:2.1-sdk 作为系统构建中间镜像(build) 指定镜像内工作目录为: /src 复制项目文件 "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" 到镜像目录 "EasySlideVerificationDemoServer/" 执行dotnet restore命令: dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" 复制当前目录下所有文件到镜像的工作目录(/src)下:COPY . . 指定新的工作目录: "/src/EasySlideVerificationDemoServer" 执行dotnet build命令: dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app 将构建好的中间镜像(build) 作为发布中间镜像(publish) 执行dotnet publish命令: dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app 将基础镜像(base)作为最终镜像(final) 指定工作目录: /app 复制发布中间镜像(publish)中的/app目录到工作目录:COPY --from=publish /app . 指定入口点命令:ENTRYPOINT ["dotnet", "EasySlideVerificationDemoServer.dll"] |
解读完之后,我们了解了这个Dockerfile究竟做了哪些事情。 镜像构建命令: 然后看一下Docker镜像构建命令:docker build。 命令行输入:docker build --help,可查看完整使用方式,此处省略。 Usage: docker build [OPTIONS] PATH | URL | – 下面是我使用的构建命令:
1 |
docker build -t slide-verify:1.0 . |
-t name:tag 表示给镜像命名,并指定标签(相当于版本号) -f Dockerfile 指定Dockerfile文件,默认为’PATH/Dockerfile’,即当前目录下的Dockerfile PATH 表示本地工作目录(也就是命令最后的 . ,我这里是项目文件夹) 发现问题: 到这里不难发现,由于镜像构建命令的执行目录与项目文件所在目录一致,并且命令中PATH指定的是当前目录(.),也就是项目文件所在目录,而Dockerfile中文件复制命令明显是在项目文件的上一级,即解决方案文件夹目录, 这样问题似乎就容易解决了,将构建命令改成下面的格式,果不其然,构建成功。
1 |
docker build -t slide-verify:1.3 -f Dockerfile .. |
然后执行docker run命令,运行构建好的镜像,启动成功,浏览器访问:http://192.168.99.100:5008/ ,项目成功运行。
1 |
docker run -it -p 5008:80 --name slide-verify13 slide-verify:1.3 |
使用进阶: 我们回头再看一下Dockerfile文件,文件中的5到14行命令,包含了源码复制,项目还原(restore),构建(build),发布(publish)几个步骤。
1 2 3 4 5 6 7 8 9 10 |
FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj", "EasySlideVerificationDemoServer/"] RUN dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" COPY . . WORKDIR "/src/EasySlideVerificationDemoServer" RUN dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app |
[…]
View DetailsDocker run 命令
docker run :创建一个新的容器并运行一个命令 语法
1 |
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
OPTIONS说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v: 绑定一个卷 实例 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
1 |
docker run --name mynginx -d nginx:latest |
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
1 |
docker run -P -d nginx:latest |
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
1 |
docker run -p 80:80 -v /data:/data -d nginx:latest |
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
1 |
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash |
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
1 2 |
runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/# |
from:https://www.runoob.com/docker/docker-run-command.html
View Details如何在已停止/未启动的Docker容器中编辑文件
有两种可能性。 1) 直接在主机上编辑文件系统 。这有些危险,并且有可能完全破坏容器,并可能根据发生的问题而破坏其他数据。 2) 将启动脚本更改为 永不失败的内容,例如启动bash,进行修复/编辑,然后将启动程序再次更改为所需的程序(例如节点或之前的版本)。 更多细节: 1)使用
1 2 |
docker ps |
查找正在运行的容器或
1 2 |
docker ps -a |
查找所有容器(包括停止的容器)并
1 2 |
docker inspect (containername) |
查找“ Id”,第一个值之一。 这是包含实现细节的部分,可能会更改,请注意,这样可能会丢失容器。 去
1 2 |
/var/lib/docker/aufs/diff/9bc343a9..(long container id)/ |
在那里您将找到所有更改为容器所基于的图像的文件。您可以覆盖文件,添加或编辑文件。 同样,我不建议这样做。 2)您可以在以下路径找到配置jsonconfig.json
1 2 |
/var/lib/docker/containers/9bc343a99..(long container id)/config.json |
在那里,您可以将参数从“ nodejs app.js”更改为“ / bin / bash”。现在重新启动docker服务并启动容器(您应该看到它现在已正确启动)。你应该用
1 2 |
docker start -i (containername) |
确保它不会立即退出。您现在可以使用容器和/或以后再附加
1 2 |
docker exec -ti (containername) /bin/bash |
另外,docker cp对于复制在容器外部编辑的文件非常有用。 同样,如果容器无论如何或多或少地“丢失”,则应该只使用那些措施,因此任何更改都是一种改进。 参考:http://codingdict.com/questions/53248
View Detailsredis 连接字符串,设置密码
<add name="Abp.Redis.Cache" connectionString="127.0.0.1:6379,password=123456"/> 参考:https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Configuration.md from:https://www.cnblogs.com/lishidefengchen/p/10656327.html
View Details【Docker】解决创建Redis容器没有conf配置文件
序言 这篇文章没有什么知识点,只是为了新伙伴少踩点坑 1. 问题重现 创建容器 2. 解读参数 -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -p: 端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --ip: 为容器制定一个固定的ip --net: 指定网络模式 3. 进入容器查看redis.conf文件 发现是并没有redis.conf文件的,那么这个时候就是新手踩坑阶段了,因为没有系统的学习docker所以会花费很多时间 2. 解决问题 没有配置文件这件事呢!那是因为redis容器里边的配置文件是需要在创建容器时映射进来的 那么就需要删除我们之前创建好的容器,在删除前需要先停止容器后才可以删除 停止容器:docker container stop redis-test 删除容器:docker container rm redis-test 1. 开始重新创建redis容器 docker run -itd --name redis-slave -v /usr/local/redis/redis.conf:/etc/redis.conf -v /root/usr/local/redis/data:/data --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis 参数解释: -v /usr/local/redis/redis.conf:/etc/redis.conf:映射配置文件 -v /root/usr/local/redis/data:/data:映射数据目录 那么这个时候就有redis配置文件了 搭建同意的挂载外部配置 上边是在我宿主机有redis的情况下的,那么下来说宿主机没有redis的情况 这里说的映射其实就是挂载外部配置和数据安装 1. 创建docker统一的外部配置文件 mkdir -p docker/redis/{conf,data} 2. 在conf目录创建redis.conf的配置文件 touch /docker/redis/conf/redis.conf 3. redis.conf文件的内容需要自行去下载,网上很多 4. 创建启动容器,加载配置文件并持久化数据 docker run -d --privileged=true -p 6379:6379 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data --name redis-test redis redis-server […]
View Detailsdocker安装Redis并设置密码
1.搜索镜像
1 |
docker search redis |
2.拉取镜像
1 |
docker pull redis |
3.创建Redis容器并设置密码
1 2 |
docker run --name redis -d --restart=always --privileged=true -p 6379:6379 redis --requirepass 123456 #前边是宿主机端口 后面是docker使用的端口 |
4.备注 为现有的redis创建密码或修改密码的方法: 1.进入redis的容器 docker exec -it 容器ID bash 2.进入redis目录 /usr/local/bin 3.运行命令:redis-cli 4.查看现有的redis密码:config get requirepass 5.设置redis密码config set requirepass ****(****为你要设置的密码) 6.若出现(error) NOAUTH Authentication required.错误,则使用 auth 密码 来认证密码 from:https://www.cnblogs.com/zhangzimo/p/12753563.html
View Detailswebapi 统一处理时间格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class UnixDateTimeConvertor : DateTimeConverterBase { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return DateTime.Parse(reader.Value.ToString()); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { //System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); //long timeStamp = (long)(((DateTime)value) - startTime).TotalMilliseconds; writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss")); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 //GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter //{ // DateTimeFormat = "yyyy-MM-dd HH:mm:ss" //}); // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); //设置Datetime 到 時間戳 的互轉 JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Formatting.Indented, DateTimeZoneHandling = DateTimeZoneHandling.Local }; jSettings.Converters.Add(new UnixDateTimeConvertor()); config.Formatters.JsonFormatter.SerializerSettings = jSettings; } } |
from:https://www.cnblogs.com/liuqiyun/p/10729338.html
View Details.net core web api部署到docker
一、创建.net core web api 的Demo 修改部分代码 端口随意指定,ip用星号“*”,方便接下来docker虚拟网络自动分配ip 下一步是Dockerfile文件,如果发现你的项目中没有此文件,很简单,右键项目=》添加=》Docker支持即可,然后修改文件如下图 然后发布项目并上传文件到服务器 二、将api项目部署到docker中 首先,进入到你上传的文件目录 根据目录下的Dockerfile创建镜像:docker build -t dockerapitestimage . (注意,注意,注意后面有一个点“.”,看清楚了,这个点表示当前目录上下文) 如果你在这一步失败了,请先尝试在docker下拉取dotnet镜像,执行命令 docker pull dotnet:latest ,拉取完之后再创建api镜像 这里要下载好几百兆的镜像包,网速太慢的话,建议尝试阿里云镜像加速,具体见我另外一篇文章 docker使用阿里云镜像加速 镜像创建成功后,我们就可以来创建容器并使用啦,继续往下 可以看到服务已经成功启动了,接下来准备访问一下试试 在linux中,首先我们输入$ docker ps 看下详情,如下图 发现我们的dockerapitest容器的ip地址是 0.0.0.0:8001,接着在linux中访问看看,成功了 linux下都没问题了,然后我们回windows下看看,如下图,显然成功了。 from:https://www.cnblogs.com/luoocean/p/11100684.html
View Details.Net Core WebApi 模型验证无效时报400
问题 模型验证无效时,没有进入到接口里,而是直接报400 Bad Request,非常不友好。 环境 SDK:.Net Core 2.2.401 开发工具:VS2017 step 1 创建接口
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// 注册 /// </summary> /// <param name="input">request Body</param> [HttpPost] [AllowAnonymous] public object PostRegister([FromBody] InputUserRegister input) { var userService = GetService<IUserService>(); return userService.Register(input); } |
Step 2 创建模型 引用命名空间
1 |
using System.ComponentModel.DataAnnotations; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class InputUserRegister { [Required(ErrorMessage = "请填写用户名")] [StringLength(20, ErrorMessage = "用户名长度过长")] public string UserName { get; set; } [Required(ErrorMessage = "请填写密码")] [StringLength(20, ErrorMessage = "密码长度过长")] public string Password { get; set; } [Required(ErrorMessage = "请填写确认密码")] [Compare("Password", ErrorMessage = "两次输入的密码不一致")] public string ConfirmPassword { get; set; } } |
Step 3 测试 解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#region 禁止默认行为 services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = (context) => { if (context.ModelState.IsValid) return null; var error = ""; foreach (var item in context.ModelState) { var state = item.Value; var message = state.Errors.FirstOrDefault(p => !string.IsNullOrWhiteSpace(p.ErrorMessage))?.ErrorMessage; if (string.IsNullOrWhiteSpace(message)) { message = state.Errors.FirstOrDefault(o => o.Exception != null)?.Exception.Message; } if (string.IsNullOrWhiteSpace(message)) continue; error = message; break; } return new JsonResult(new Models.VModels.ErrorResponse(error.ToString())); }; }); #endregion |
from:https://www.cnblogs.com/EminemJK/p/11498852.html
View Details