在Aspnetcore开发中的docker使用笔记

docker 使用笔记

系统centos 8.2,且关闭Selinux; docker 版本 19系列

docker

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

网络

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
posted @ 2021-02-02 11:59  jzblive  阅读(92)  评论(0编辑  收藏  举报