在Aspnetcore开发中的docker使用笔记
docker 使用笔记
系统centos 8.2,且关闭Selinux; docker 版本 19系列
docker
docker 安装
卸载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
dnf install -y device-mapper-persistent-data lvm2
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf install -y docker-ce --nobest
docker info #查看docker信息
docker 服务
systemctl start docker #运行Docker守护进程
systemctl stop docker #停止Docker守护进程
systemctl restart docker #重启Docker守护进程
systemctl enable docker #设置Docker开机自启动
systemctl status docker #查看Docker状态
docker 配置
镜像加速配置
配置文件 /etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
其他配置
数据目录配置
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"],
"data-root": "/data/docker-root"
}
sudo systemctl daemon-reload
sudo systemctl restart docker
网络
如果容器需要指定ip, 那么这个容器使用的网络要指定
--subnet
#创建
docker network create --driver=bridge --subnet=172.100.0.0/16 --gateway=172.100.0.1 my-net-01
#查看网络详情
docker network inspect my-net-01
#删除
docker network rm my-net-01
基础服务
mssql
# 数据目录
mkdir -p /data/docker/mssql0
#更改权限
chown -R 10001:0 /data/docker/mssql0/
# 镜像
docker pull mcr.microsoft.com/mssql/server:2019-latest
# 外部端口映射到 6033; MSSQL_PID 激活码; MSSQL_COLLATION:排序规则,这个很重要
docker run -d --name mssql0 --net my-net-01 --ip=172.100.0.52 \
--restart=always -p 6033:1433 \
-e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=密码' \
-e 'MSSQL_PID=激活码' \
-e MSSQL_COLLATION='Chinese_PRC_CI_AS' \
-v /etc/localtime:/etc/localtime \
-v /data/docker/mssql0:/var/opt/mssql \
mcr.microsoft.com/mssql/server:2019-latest
# 进入容器
docker exec -it mssql0 bash
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
exit
jenkins
mkdir -p /data/data/jenkins
docker run -d --name jenkins --restart=always -u root -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean:1.24.3
redis
同目录下 redis.conf 是 redis 6 系列版本
docker pull redis #获取redis 镜像
mkdir -p /data/docker/redis0/data # 数据目录
# 运行 外部端口指向6379 ,请注意安全策略配置;如果不需要外网访问,可用不用映射端口
docker run --name redis0 -d \
--net my-net-01 --ip=172.100.0.51 \
--restart=always -p 6379:6379 \
-v /data/docker/redis0/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/docker/redis0/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf
# 进入容器
docker exec -it redis0 bash
#
cd /usr/local/bin
#
redis-cli
#查看密码
config get requirepass
#修改 密码 123
#config set requirepass 123
#认证
auth 123
#重启
docker restart redis01
nginx
nginx last
mkdir -p /data/docker/nginx0/{htmls,cert,log}/
# copy nginx.config
docker run --name tmp-nginx-container -d nginx
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /data/docker/nginx0/
docker rm -f tmp-nginx-container
# 运行
docker run -d --name nginx0 \
-p 80:80 -p 443:443 --restart=always \
-v /data/docker/nginx0/htmls:/usr/share/nginx/html:ro \
-v /data/docker/nginx0/cert:/etc/nginx/cert:ro \
-v /data/docker/nginx0/cert:/etc/nginx/cert:ro \
-v /data/docker/nginx0/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx
docker exec -it nginx0 bash
# 配置文件测试
nginx -T
# 重新加载配置文件
nginx -s roload
# 网络连接
docker network connect my-net-01 nginx0
# 删除连接
# docker network disconnect my-net-01 nginx0
反向代理配置(删除其中的注释)
server {
listen 80;
listen 443;
server_name abc.com;
# 微信api txt
location ~ \.txt {
root /usr/share/nginx/html/abc.com;
index index.html index.htm;
}
location / {
proxy_pass http://172.100.0.51;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Consul
服务发现 界面端口:8500
mkdir -p /data/docker/consul0/{data,config}
docker pull consul
# 集群版 绑定网卡
docker run -d --name=consul0 --restart=always \
--net=host -e CONSUL_BIND_INTERFACE='eth0' \
-p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \
-v /data/docker/consul0/data:/consul/data \
-v /data/docker/consul0/config:/consul/config consul:latest \
agent -server -bootstrap -bootstrap-expect=3 -bind='172.100.0.30' \
-ui -client='0.0.0.0' -datacenter=dc1 -datacenter=dc2
# 集群版 非绑定网卡
docker run -d --name=consul0 --restart=always \
--net=my-net-01 --ip=172.100.0.30 \
-p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \
-v /data/docker/consul0/data:/consul/data \
-v /data/docker/consul0/config:/consul/config consul:latest \
agent -server -bootstrap -bind='172.100.0.30' \
-ui -client='0.0.0.0' -datacenter=dc1
# 第二个
mkdir -p /data/docker/consul1/{data,config}
docker run -d --name=consul1 --restart=always \
--net=my-net-01 --ip=172.100.0.31 \
#-p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \
-v /data/docker/consul1/data:/consul/data \
-v /data/docker/consul1/config:/consul/config consul:latest \
agent -server -bind='172.100.0.31' -datacenter=dc2 -join=172.100.0.30
# 第三个
mkdir -p /data/docker/consul2/{data,config}
docker run -d --name=consul2 --restart=always \
--net=my-net-01 --ip=172.100.0.32 \
#-p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \
-v /data/docker/consul2/data:/consul/data \
-v /data/docker/consul2/config:/consul/config consul:latest \
agent -server -bind='172.100.0.32' -join=172.100.0.30
# 简单版
docker run -d --name=consul0 -e CONSUL_BIND_INTERFACE=eth0 \
-v /data/docker/consul0/data:/consul/data \
-v /data/docker/consul0/config:/consul/config \
consul -ui -datacenter=dc1
# 查看成员
docker exec -it consul0 consul members
项目
dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["src/WebApi/WebApi.csproj", "src/WebApi/"]
COPY ["src/ServiceHub/ServiceHub.csproj", "src/ServiceHub/"]
COPY ["src/ExcelProvider/ExcelProvider.csproj", "src/ExcelProvider/"]
COPY ["src/Mall.Order/csproj", "src/Mall.Order/"]
RUN dotnet restore "src/WebApi/WebApi.csproj" -s 这里可用指定你自己的nuget服务器 -s https://api.nuget.org/v3/index.json
COPY . .
WORKDIR "/src/src/WebApi"
RUN dotnet build "WebApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApi.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
RUN mkdir /app/logs -p
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApi.dll"]
说明
指令 | 说明 |
---|---|
-e ASPNETCORE_ENVIRONMENT="Development" | 指定运行环境为测试,不指定默认:Production |
-v /etc/localtime:/etc/localtime | 指定时区与系统一致 |
网关
gateway 部署脚本
mkdir -p /data/demo/volume/gateway
docker pull 镜像地址/gateway:版本号
docker run -d --name=demo_gateway --net=my-net-01 --ip=172.100.0.58 \
-e ASPNETCORE_ENVIRONMENT="Development" \
-v /etc/localtime:/etc/localtime \
-v /data/demo/volume/gateway/appsettings.json:/app/appsettings.json \
-v /data/demo/volume/gateway/appsettings.Development.json:/app/appsettings.Development.json \
-v /data/demo/volume/gateway/ocelot.json:/app/ocelot.json \
镜像地址/gateway:版本号
用户API
member_webapi 部署脚本
mkdir -p /data/demo/volume/member
docker pull 镜像地址/member_webapi:版本号
docker run -d --name=demo_member --restart=always \
--net=my-net-01 --ip=172.100.0.60 \
-v /etc/localtime:/etc/localtime \
-e ASPNETCORE_ENVIRONMENT="Development" \
-v /data/demo/volume/member/appsettings.json:/app/appsettings.json \
镜像地址/member_webapi:版本号
产品API
product_webapi 部署脚本
mkdir -p /data/demo/volume/product
docker pull 镜像地址/product_webapi:版本号
docker run -d --name=demo_product --restart=always \
--net=my-net-01 --ip=172.100.0.62 \
-e ASPNETCORE_ENVIRONMENT="Development" \
-v /data/demo/volume/product/appsettings.json:/app/appsettings.json \
镜像地址/product_webapi:版本号
trouble shooting
docker
docker容器 无法访问网路
注意 brige的名称是不是
docker0
, 或者说是容器的网络是不是docker0
nmcli connection modify docker0 connection.zone trusted
systemctl stop NetworkManager.service
firewall-cmd --permanent --zone=trusted --change-interface=docker0
systemctl start NetworkManager.service
nmcli connection modify docker0 connection.zone trusted
systemctl restart docker.service
列出所有容器ip
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
性能
限制使用内存 请参考docker run -m参数
限制使用cpu 请参考docker run CUP系列参数
docker stats
docker stats 容器Id/容器名
日志
docker logs -f -t 容器Id/容器名
参数 | 说明 |
---|---|
-f | Follow 日志实时显示 |
-t | 显示时间 |
--since | 从什么时间开始显示 |
--until | 显示到什么时间为止 |
其他
忘记指定容器
--restart
参数,或者想修改
docker update 容器Id/容器名 --restart=always