docker常用命令 电脑版发表于:2020/4/10 16:51 ![Docker远征](https://img.tnblog.net/arcimg/hb/656ec4beace04f5e9a7b1d58b6368639.jpg "Docker远征") >#Docker简单命令整理清单 [TOC] Login 获取账户信息 ------------ 获取账户信息 ````bash docker info | sed '/Username:/!d;s/.* //' ```` 或 ````bash username=$(docker info | sed '/Username:/!d;s/.* //'); echo $username ```` 登录账户 ````bash docker login hub.docker.com ```` Images 镜像相关操作 ------------ 获取本地镜像 ````bash docker images ```` 搜索镜像 ````bash docker search <ImageName> ```` 下载镜像到本地 ````bash docker pull <url> ```` 上传到Hub官网上 ````bash docker push <Username>/<PacketName>:<Tag> ```` **《 注意:格式规范 》** 删除本地镜像 ````bash docker rmi <ImageId> docker rmi <ImageId1> <ImageId2> <ImageId3> ```` >问题一 : Error response from daemon: conflict: unable to delete c625e22473f6 (must be forced) - image is being used by stopped container 1c5efd98650e >> 当我们使用命令删除镜像时报这个错,请执行 >> `docker rmi -f <ImageId>` 更多包资源请访问 [Hub官网](hub.docker.com) Build 相关操作 ------------ 生成命令 ````bash docker build -t <Username>/<ProjectName>:<Tag> <ProjectAddress> ```` 举例 ````bash docker build -t aidasi/demo1:v1 . ```` Tag 相关操作 ------------ 剪切新的包 ````bash docker tag <OldPacketName>:<Tag> <UserName>/<NewPacketName>:<Tag> ```` 举例 ````bash docker tag Demo1:v1 aidasi/demo1:v1 ```` Network 相关操作 ------------ 列出主机上的所有网络 ````bash docker network ls ```` 创建网络 ````bash docker network create <NetworkName> ```` 运行应用添加指定网络 ````bash docker run -d -p <OutPort>:<InPort> --name <ContainerName> --net=<NetworkName> <PacketName> ```` 将容器与指定网络断开 ````bash docker network disconnect <NetworkName> <ContainerName> ```` 给运行的容器添加网络 ````bash docker network connect <NetworkName> <ContainerName> 还可以给网络创建别名 docker network connect --alias <AliasName> <NetworkName> <ContainerName> ```` 让容器与容器之间连接 ````bash docker run -d -p 5001:80 --name aspnetcore --link <ContainerName2>:addb <ContainerName1>:<Tag> ```` 我们可以浏览网络以查看连接了哪些容器及其IP地址 ````bash docker network inspect <NetworkName> ```` Volume 卷存储 ------------ 容器共享卷 ```bash docker run ... --volumes-from <ContainerName>.. ``` 持久存储卷 ```bash docker run -v <LocalPath>:<ContainerPath> .... 如果只需要只读 docker run -v <LocalPath>:<ContainerPath>:ro .... ``` yml ```bash volumes: data-volume: driver: local driver_opts: type: none device: $PWD/logs o: bind ``` Log 获取日志信息 ------------ 生成命令 ````bash docker logs <ContainerName> ```` 将容器日志转为系统日志记录 ````bash docker run ... --log-driver=syslog 如何读取 参考链接如下??https://www.jianshu.com/p/038738073103 ```` 日志跟踪 ````bash docker logs --follow <ContainerName> ```` 当改为none后将禁用日志输出 ```bash --log-driver=none ``` 关于容器相关操作 ------------ 查看当前所有所有为运行状态的容器 ````bash docker ps ```` 查看所有容器 ````bash docker ps -A ```` 运行应用到容器 ````bash docker run -d -p <OutPort>:<InPort> --name <ContainerName> <PacketName> ```` 停止运行的容器 ````bash docker stop <ContainerId> ```` 删除运行的容器 ````bash docker rm <ContainerId> docker rm <ContainerId1> <ContainerId2> <ContainerId3> ```` 导出与导入容器 ------------ 导出容器 ````bash docker export <ContainerName> > <ContainerName>.tar ```` 导入容器 ````bash docker import <ContainerName>.tar ```` 导出与导入镜像 ------------ 导出镜像 ````bash docker save <ContainerName> > <ContainerName>.tar ```` 导入镜像 ````bash docker load <ContainerName>.tar ctr image import ingresscontrl.tar ctr image import ingresswebhook.tar ```` 设备与读写 ------------ >假设硬盘设备为 /dev/nvme0n1 访问特定的设备 ```bash docker run --device=/dev/nvme0n1:/dev/nvme0n1 ... ``` 限制写入速率(每秒IO)到设备。数字是一个正整数。 ```bash # <device-path>:<number> #例如,该命令创建一个容器并将写入速率限制为每秒 3/IO docker run --device-write-iops /dev/nvme0n1:3 ... ``` 限制来自设备的读取速率(每秒IO)数字是一个正整数。 ```bash # <device-path>:<number> #例如,该命令创建一个容器,并且限制了读出速度,以 3/IO 每秒 docker run --device-read-iops /dev/nvme0n1:3 ... ``` 导出与导入镜像 ------------ 导出镜像 ````bash docker save -o <Name>.tar <ImageName>:<Tag> 或 docker save > <Name>.tar <ImageName>:<Tag> ```` 导入容器 ````bash docker load -i <Name>.tar 或 docker load < <Name>.tar ```` 进入容器内部 ------------ ````bash sudo docker exec -it <ContainerID> /bin/bash ```` 查看CPU与IO状态 ------------ ````bash # 查看单个容器情况 docker stats <ContainerName> # 查看所有容器状态 docker stats ```` 容器运行时特殊参数 ------------ tn>`privileged`使用该参数,container内的root拥有真正的root权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。 ````bash docker run --privileged ... ```` tn>`-d` 设置要读取的磁盘,默认前缀为 `/dev/sd` 或者 `/dev/xvd` 的磁盘 ````bash docker run -d /dev/sdb ```` tn>`-s` 设置每次读取的数据量大小,单位为字节,默认为 `67108864`(也就是 `64MB`) ````bash docker run -s 67108864 ```` tn>`-c` 设置每个子进程读取的次数,默认为 `20` 次,也就是读取 `20*64MB` 数据后子进程退出 ````bash docker run -c 20 ```` Docker-Compose的操作 ------------ 启动 ````bash docker-compose up ```` 停止容器 ````bash docker-compose down ```` 停止容器并且移除数据 ````bash docker-compose down -v ```` 关于.NetCore中的DockerFile如下 ------------ ![Dockerfile](https://img.tnblog.net/arcimg/hb/82ea39d390f04d779fb5ccee3e54e8b8.png "Dockerfile") ```bash FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY . k8s-demo/ RUN pwd RUN ls RUN dotnet restore "k8s-demo/k8s-demo.csproj" COPY . . WORKDIR "/src/k8s-demo" RUN pwd RUN ls RUN mkdir -p /app/build RUN mkdir -p /app/publish RUN dotnet build "k8s-demo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "k8s-demo.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "k8s-demo.dll"] ``` >###项目中简单点 ```bash FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /code COPY *.csproj ./ RUN dotnet restore COPY . . RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app COPY --from=build /code/out ./ EXPOSE 80 ENTRYPOINT dotnet User.API.dll ``` >###其他项目中的 DockerCompose 写法 docker-compose.yml ```yaml version: '3' services: db: image: mysql:5.7 container_name: db command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci restart: always ports: - '3306:3306' environment: MYSQL_ROOT_PASSWORD: pwd123456 MYSQL_USER: aidasi MYSQL_PASSWORD: pwd123456 volumes: - /home/mysql:/docker-entrypoint-initdb.d web: build: . container_name: 'aspnetcore' ports: - '5001:80' depends_on: - db ``` >更多参考:https://yeasy.gitbook.io/docker_practice/compose/compose_file#environment >如果.netcore程序中对mysql初始化时没有迁移成功(Migrate),那么我们可以通过循环的方式或者熔断的方式如下代码所示: ```csharp public static async Task<IApplicationBuilder> UseInitUserDatabase(this IApplicationBuilder builder, ILoggerFactory loggerFactoryMaaster, int? retry = 0) { var retryForAvaiabilitry = retry.Value; using (var scope = builder.ApplicationServices.CreateScope()) { try { var loggerFactory = (ILogger<UserContext>)scope.ServiceProvider.GetService(typeof(ILogger<UserContext>)); var userContext = scope.ServiceProvider.GetRequiredService<UserContext>(); loggerFactory.LogDebug("Begin UserContext UseInitUserDatabase"); //确定数据库得以创建 userContext.Database.Migrate(); //这种也可以但数据会被删除 //userContext.Database.EnsureDeleted(); //userContext.Database.EnsureCreated(); if (!userContext.Users.Any()) { userContext.Users.Add(new Models.AppUser { Name = "aidasi" }); userContext.SaveChanges(); } } catch (Exception ex) { //尝试重试10次 if (retryForAvaiabilitry < 10) { retryForAvaiabilitry++; Thread.Sleep(500); var logger = loggerFactoryMaaster.CreateLogger(typeof(UserContext)); logger.LogError(ex.Message); await UseInitUserDatabase(builder, loggerFactoryMaaster, retryForAvaiabilitry); } } } return builder; } ``` >Startup.cs --> Configure ```bash app.UseInitUserDatabase(loggerFactory).Wait(); ``` 关于.NetCore中的简单发布的Yaml如下 ------------ ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo namespace: netcore labels: name: k8s-demo spec: replicas: 2 selector: matchLabels: name: k8s-demo template: metadata: labels: name: k8s-demo spec: containers: - name: k8s-demo image: <ImageName>:<Tag> ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: k8s-demo namespace: netcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: k8s-demo ``` <br> 参考链接 ------------ https://www.tnblog.net/hb/article/details/3479