
Docker简单命令整理清单
Login 获取账户信息
获取账户信息
docker info | sed '/Username:/!d;s/.* //'
或
username=$(docker info | sed '/Username:/!d;s/.* //');
echo $username
登录账户
docker login hub.docker.com
Images 镜像相关操作
获取本地镜像
docker images
搜索镜像
docker search <ImageName>
下载镜像到本地
docker pull <url>
上传到Hub官网上
docker push <Username>/<PacketName>:<Tag>
《 注意:格式规范 》
删除本地镜像
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官网
Build 相关操作
生成命令
docker build -t <Username>/<ProjectName>:<Tag> <ProjectAddress>
举例
docker build -t aidasi/demo1:v1 .
Tag 相关操作
剪切新的包
docker tag <OldPacketName>:<Tag> <UserName>/<NewPacketName>:<Tag>
举例
docker tag Demo1:v1 aidasi/demo1:v1
Network 相关操作
列出主机上的所有网络
docker network ls
创建网络
docker network create <NetworkName>
运行应用添加指定网络
docker run -d -p <OutPort>:<InPort> --name <ContainerName> --net=<NetworkName> <PacketName>
将容器与指定网络断开
docker network disconnect <NetworkName> <ContainerName>
给运行的容器添加网络
docker network connect <NetworkName> <ContainerName>
还可以给网络创建别名
docker network connect --alias <AliasName> <NetworkName> <ContainerName>
让容器与容器之间连接
docker run -d -p 5001:80 --name aspnetcore --link <ContainerName2>:addb <ContainerName1>:<Tag>
我们可以浏览网络以查看连接了哪些容器及其IP地址
docker network inspect <NetworkName>
Volume 卷存储
容器共享卷
docker run ... --volumes-from <ContainerName>..
持久存储卷
docker run -v <LocalPath>:<ContainerPath> ....
如果只需要只读
docker run -v <LocalPath>:<ContainerPath>:ro ....
yml
volumes:
data-volume:
driver: local
driver_opts:
type: none
device: $PWD/logs
o: bind
Log 获取日志信息
生成命令
docker logs <ContainerName>
将容器日志转为系统日志记录
docker run ... --log-driver=syslog
如何读取
参考链接如下??https://www.jianshu.com/p/038738073103
日志跟踪
docker logs --follow <ContainerName>
当改为none后将禁用日志输出
--log-driver=none
关于容器相关操作
查看当前所有所有为运行状态的容器
docker ps
查看所有容器
docker ps -A
运行应用到容器
docker run -d -p <OutPort>:<InPort> --name <ContainerName> <PacketName>
停止运行的容器
docker stop <ContainerId>
删除运行的容器
docker rm <ContainerId>
docker rm <ContainerId1> <ContainerId2> <ContainerId3>
导出与导入容器
导出容器
docker export <ContainerName> > <ContainerName>.tar
导入容器
docker import <ContainerName>.tar
导出与导入镜像
导出镜像
docker save <ContainerName> > <ContainerName>.tar
导入镜像
docker load <ContainerName>.tar
ctr image import ingresscontrl.tar
ctr image import ingresswebhook.tar
设备与读写
假设硬盘设备为 /dev/nvme0n1
访问特定的设备
docker run --device=/dev/nvme0n1:/dev/nvme0n1 ...
限制写入速率(每秒IO)到设备。数字是一个正整数。
# <device-path>:<number>
#例如,该命令创建一个容器并将写入速率限制为每秒 3/IO
docker run --device-write-iops /dev/nvme0n1:3 ...
限制来自设备的读取速率(每秒IO)数字是一个正整数。
# <device-path>:<number>
#例如,该命令创建一个容器,并且限制了读出速度,以 3/IO 每秒
docker run --device-read-iops /dev/nvme0n1:3 ...
导出与导入镜像
导出镜像
docker save -o <Name>.tar <ImageName>:<Tag>
或
docker save > <Name>.tar <ImageName>:<Tag>
导入容器
docker load -i <Name>.tar
或
docker load < <Name>.tar
进入容器内部
sudo docker exec -it <ContainerID> /bin/bash
查看CPU与IO状态
# 查看单个容器情况
docker stats <ContainerName>
# 查看所有容器状态
docker stats
容器运行时特殊参数
privileged
使用该参数,container内的root拥有真正的root权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
docker run --privileged ...
-d
设置要读取的磁盘,默认前缀为 /dev/sd
或者 /dev/xvd
的磁盘
docker run -d /dev/sdb
-s
设置每次读取的数据量大小,单位为字节,默认为 67108864
(也就是 64MB
)
docker run -s 67108864
-c
设置每个子进程读取的次数,默认为 20
次,也就是读取 20*64MB
数据后子进程退出
docker run -c 20
Docker-Compose的操作
启动
docker-compose up
停止容器
docker-compose down
停止容器并且移除数据
docker-compose down -v
关于.NetCore中的DockerFile如下
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"]
项目中简单点
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
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),那么我们可以通过循环的方式或者熔断的方式如下代码所示:
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
app.UseInitUserDatabase(loggerFactory).Wait();
关于.NetCore中的简单发布的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
参考链接
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739


尘叶心繁
大家注意,DockerFile我的目录结构有点不同