# Docker **Repository Path**: lztkdr/docker ## Basic Information - **Project Name**: Docker - **Description**: No description available - **Primary Language**: Docker - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-07-28 - **Last Updated**: 2022-02-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Docker 1. 可定制的“安装包” 2. 不建议有运行时需要修改的配置文件(其实很多都要改,如redis、nignx) 3. 尽量重用docker hub的基础镜像 ## 安装 ### 1. 在root 用户下,卸载旧的安装包 ``` shell yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine ``` ### 2. 安装需要的安装包 ``` shell yum install -y yum-utils ``` ### 3. 设置镜像的仓库 默认是国外的 ```shell yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ``` 如果没有vpn 建议安装阿里云的 ```shell yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ``` 更新yum 索引安装包 ``` shell # CentOS 7 以及以前版本 yum makecache fast # CentOS 8 sudo yum makecache ``` ### 4. 安装docker相关的 如果出错 ``` shell yum install docker-ce docker-ce-cli containerd.io ``` 执行下面的 ``` shell # centOS 8 dnf install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm -y yum install -y docker-ce --nobest yum install -y docker-ce --allowerasing ``` ### 5. 启动docker并设置开机自启 ``` shell systemctl start docker && systemctl enable docker ``` ### 6. 查看Docker版本,是否安装成功 ```shell docker --version # Docker version 20.10.7, build f0df350 ``` ### 7. 验证 hello-world 镜像 ``` shell # 本机没有这个镜像,就会去下载 docker run hello-world #查看所有的docker 镜像 docker images ``` ## 卸载 ``` shell # 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 删除资源 rm -rf /var/lib/docker ``` ## 常用指令 ``` shell # docker 版本 docker --version # docker 帮助 docker --help docker ps --help # docker 信息 docker info # 查看 Docker 的底层信息 docker inspect 镜像名称/容器id # 登陆镜像仓库 docker login # 查看当登陆的账号 docker info | grep User # 退出 docker logout # 推送仓库 语法 docker tag local-image:tagname new-repo:tagname docker push new-repo:tagname # 将 给本地镜像 coremvc:latest 起 新的镜像名称 docker tag coremvc:latest lztkdr/coremvc:v1 # 推送到 远程仓库 docker push lztkdr/coremvc:v1 # 拉取 自己的 远程仓库 docker pull lztkdr/coremvc:v1 # 启动 容器 docker run --name coremvc -d -p 8080:80 lztkdr/coremvc:v1 # 注:不管容器有没有启动,拷贝命令都会生效。 # 将 容器 拷贝到 宿主机 docker cp 9e20df156c6d:/app /usr/www/ # 将 宿主机 拷贝到 容器 docker cp /usr/www/ms.txt 9e20df156c6d:/app # 进入 容器内部 docker exec -it b30529b71578 /bin/bash # ls 查看 多出来 ms.txt 文件 root@b30529b71578:/app# ls # apt-get你去更新一下软件列表 # root@b30529b71578:/app# apt-get update # 退出 exit # 提交 docker commit -m='测试更新' -a='lztkdr' b305 lztkdr/coremvc:v2 # 执行 docker images 会发现出来 lztkdr/coremvc:v2 镜像 docker images # 推送v2 版本 docker push lztkdr/coremvc:v2 # docker将本地文件添加到镜像中 # https://blog.csdn.net/u011622208/article/details/103491095 # 获取/构建镜像 # 获取镜像,如:docker pull mcr.microsoft.com/dotnet/core/aspnet:latest docker pull 名称 # 查找镜像,如:docker search httpd docker search 名称 # NAME: 镜像仓库源的名称 # DESCRIPTION: 镜像的描述 # OFFICIAL: 是否 docker 官方发布 # stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。 # AUTOMATED: 自动构建。 # 构建镜像,从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像,如:docker build -t coremvc . docker build -t coremvc -f ./Dockerfile . # -f:dockerfile的路径 # -t:要build的镜像的名字 后面是tag # . 最后的不能丢掉 # 设置镜像标签 docker tag 命令,为镜像添加一个新的标签。 docker tag 860c279d2fec runoob/centos:dev docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。 #删除镜像(会提示先停止使用中的容器) docker rmi 镜像name/镜像id # 删除镜像 docker rmi -f 镜像id (可以根据 docker images 查询) # 删除所有镜像 docker rmi -f $(docker images) # 删除所有 镜像 docker rmi `docker image ls -f dangling=true -q` docker rmi $(docker images -f "dangling=true" -q) docker rmi $(docker images -q) -f # 查看所有镜像 docker images # 查询 镜像 docker images | grep '' # 注:镜像也是 docker 的核心组件之一,镜像是容器运行的基础,容器是镜像运行后的形态。 # 查看所有容器 docker ps -a #查询docker 容器状态 docker stats 容器name/容器id # 查看容器运行日志 docker logs 容器名称/容器id # 停止容器运行 docker stop 容器name/容器id # 终止容器后运行 docker start 容器name/容器id # 容器重启 docker restart 容器name/容器id # 删除容器 docker rm -f 容器name/容器id # 删除所有 容器 docker rm $(docker ps -aq) # 启动容器 # 启动容器 docker run -it nginx /bin/bash # -i: 交互式操作。 # -t: 终端。 # -d 后台运行 # nginx: nginx镜像。 # /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。(exit 退出终端) # shell 到容器目录 ,如:docker exec -it 02be /bin/bash docker exec -it 容器name/容器id /bin/bash # 退出 用 exit 或 Ctrl + D exit # [root@localhost ~]# docker exec -it 02be /bin/bash # 进入到容器的目录中 ,查看 appsettings # root@02be482f9ac5:/app# cat appsettings.json # root@02be482f9ac5:/app# cat 'log\log.txt' # 此方式常常被翻译为优雅的停止容器 docker stop 容器ID或容器名 # 参数 -t:关闭容器的限时,如果超时未能关闭则用kill强制关闭,默认值10s,这个时间用于容器的自己保存状态 docker stop -t=60 容器ID或容器名 # 直接关闭容器 docker kill 容器ID或容器名 # 由此可见stop和kill的主要区别:stop给与一定的关闭时间交由容器自己保存状态,kill直接关闭容器 # 停用全部运行中的容器: docker stop $(docker ps -q) # 删除全部容器: docker rm $(docker ps -aq) # 一条命令实现停用并删除容器: docker stop $(docker ps -q) & docker rm $(docker ps -aq) # 容器导入导出 # 如果要导出本地某个容器,可以使用 docker export 命令。 docker export 1e560fca3906 > nginx.tar # 可以使用 docker import 从容器快照文件中再导入为镜像 $ cat docker/ubuntu.tar | docker import - test/ubuntu:v1 # 也可以通过指定 URL 或者某个目录来导入 $ docker import http://example.com/exampleimage.tgz example/imagerepo ``` ## Nginx容器化 ``` shell docker pull nginx docker images docker run --name nginx -p 8080:80 -d nginx mkdir -p /usr/local/deploy/nginx docker cp nginx:/etc/nginx/conf.d /usr/local/deploy/nginx/ docker cp nginx:/etc/nginx/nginx.conf /usr/local/deploy/nginx/ docker cp nginx:/usr/share/nginx/html /usr/local/deploy/nginx/ # 配置拷贝完成后,删除原来启动的容器 docker rm -f nginx # 启用自己 定义的配置 # ro :文件权限设置为只读 # rw :文件权限可读可写 docker run --name nginx -p 8000:80 -v /usr/local/deploy/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v/usr/local/deploy/nginx/conf.d:/etc/nginx/conf.d:ro -v /usr/local/deploy/nginx/html/:/usr/share/nginx/html:rw -d nginx ``` ## Redis容器化 ``` shell docker pull redis docker images docker run --name redis -p 6380:6379 -d redis # 容器内没有配置,需得翻墙下载配置文件 wget -P /usr/local/deploy/redis http://download.redis.io/redis-stable/redis.conf # 修改 redis.conf # 绑定0.0.0.0 bind 0.0.0.0 # 不保护,支持远程登陆 protected-mode no # 开启AOF持久化,aof-use-rdb-preamble yes 默认yes,这样的化就默认开启了 混合模式 持久化。 appendonly yes # requirepass <当前redis 密码> # masterauth # masteruser # slaveof mkdir -p /usr/local/deploy/redis cd /usr/local/deploy/redis mkdir redis1 redis2 redis3 # redis1 6381 # redis2 6382 # redis3 6383 # 启动3台Redis服务 docker run -d -p 6001:6381 -v /usr/local/deploy/redis/redis1/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/deploy/redis/redis1:/data:rw --name redis1 redis:latest redis-server /usr/local/etc/redis/redis.conf docker run -d -p 6002:6382 -v /usr/local/deploy/redis/redis2/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/deploy/redis/redis2:/data:rw --name redis2 redis:latest redis-server /usr/local/etc/redis/redis.conf docker run -d -p 6003:6383 -v /usr/local/deploy/redis/redis3/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/deploy/redis/redis3:/data:rw --name redis3 redis:latest redis-server /usr/local/etc/redis/redis.conf # 主从架构: 在 6002,6003 执行 slaveof 192.168.17.131 6001 ``` redis.conf ``` conf bind 0.0.0.0 protected-mode no port 6381 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo no set-proc-title yes proc-title-template "{title} {listen-addr} {server-mode}" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb rdb-del-sync-files no dir ./ # masterauth # masteruser replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 # requirepass foobared # slaveof lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lazyfree-lazy-user-del no lazyfree-lazy-user-flush no oom-score-adj no oom-score-adj-values 0 200 800 disable-thp yes appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes ``` ## Docker管理工具 - docker-mechine 用的很少,基本没人用。 - docker-compose 中产阶级,还算常用。 - docker-swarm 慢慢被k8s替代。 - k8s 正在流行。 ### docker-compose ​ Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 YAML教程 https://www.runoob.com/w3cnote/yaml-intro.html Compose 使用的三个步骤: • 使用 Dockerfile 定义应用程序的环境。 • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。 #### 下载 最新版本:https://docs.docker.com/compose/install/ ``` shell curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose ``` #### 授权 ``` shell chmod +x /usr/local/bin/docker-compose ``` #### 命令 ``` shell docker-compose docker-compose --version docker-compose stop ``` ``` shell docker stop $(docker ps -q) & docker rm $(docker ps -aq) # 在当前目录执行 docker-compose.yaml 文件 执行 # -d 后台运行 docker-compose up –d # 由当前目录执行 docker-compose.yaml 文件 启动的docker 容器,全部停掉 docker-compose stop ``` #### 示例 服务器上,cd 到 docker-compose.yaml 的位置,然后执行 docker-compose up –d。 在 /vip/file/Zhaoxi.AspNetCore31.DockerProject 项目文件 会有个 Dockerfile 文件,up 命令执行时 会 执行的dockerfile的内容,进行build。 **docker-compose.yaml** ``` yaml version: '3.3' services: service1: build: context: /vip/file/Zhaoxi.AspNetCore31.DockerProject image: composecore31v4.3 ports: - 8081:80/tcp service2: image: composecore31v4.3 ports: - 8082:80/tcp command: ["dotnet", "/app/Zhaoxi.AspNetCore31.DockerProject.dll"] nginx: image: nginx:latest ports: - 8086:80/tcp volumes: - /vip/enginx/nginx.conf:/etc/nginx/nginx.conf redis: image: redis:6.0 ports: - 8085:6380/tcp volumes: - /vip/eredis/redis.conf:/usr/local/etc/redis/redis.conf - /vip/eredis/data:/data:rw command: ["redis-server", "/usr/local/etc/redis/redis.conf"] ``` 语法检查:https://toyaml.com/index.html ### docker-machine Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。 Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。 ### Docker Swarm Docker Swarm 是 Docker 的集群管理工具。 现在一般都用K8S。 # .Net5 部署 Docker ## 第一种方式-源码部署 ### 1. 新建项目时,勾选 `启用Docker支持` ### 2. 将 Dockerfile 文件复制到 项目的一层目录 也就是复制到 和 项目文件夹 所在的同一目录。 ### 3.选择解决方案,清理解决方案,防止传输dll文件太大耗时 ### 4. 上传 Dockerfile 所在目录到 服务器 ### 5. cd 进入到服务器上的 Dockerfile 所在目录 ### 6. 执行build构建镜像,通过Docker文件去编译程序 执行后,会自动下载运行环境 ``` shell cd /usr/www/Proj202107 ls # Dockerfile 所在目录位置 # Dockerfile Proj202107.sln WebAppDocker # coremvc 为镜像名称,. 表示当前路径 docker build -t coremvc . # 冒号后面跟 tag,一般为版本号 docker build -t coremvc:v1 -f ./Dockerfile . # -f:dockerfile的路径 # -t:要build的镜像的名字 后面是tag # 查看镜像 docker images ``` ![1627473275268](media/1627473275268.png) ### 7. 运行.net 的Docker 容器 ``` shell # --name 为容器指定一个名称 # -d: 后台运行容器,并返回容器ID # -P: 随机端口映射,容器内部端口随机映射到主机的端口 # coremvc 要运行的镜像名称 docker run --name netcore-mvc -d -p 8080:80 coremvc ``` ![1627473364164](media/1627473364164.png) ``` shell docker ps ``` ``` shell curl http://192.168.17.131:8080 ``` ![1627474669418](media/1627474669418.png) ## 第二种方式-发布部署+负载均衡 通过发布包部署 ### 1. 先关闭防火墙,防止 Docker部署出现问题 虚拟机需要这样,如果用的是阿里云,云服务的话,不需要关闭防火墙。 ``` shell # 关闭当前防火墙 systemctl stop firewalld # 开机防火墙不启动 systemctl disable firewalld ``` ### 2. 防止后面出问题,先重启服务器 ``` shell reboot ``` ### 3. Docker创建 bridge 网络 如果需要和nginx 一起实现负载均衡,则需要创建网卡,实现互通。 Docker在默认情况下,分别会建立一个bridge、一个host和一个none的网络: - **bridge**:多由于独立container之间的通信 bridge模式 可以将各个容器的端口设为对立的,这样外部宿主机或者容器需要通过该容器所在ip+该容器的端口进行访问,并且本宿主机可以访问本宿主机中的容器。 - host: 直接使用宿主机的网络,端口也使用宿主机的 - overlay:当有多个docker主机时,跨主机的container通信 - **macvlan**:每个container都有一个虚拟的MAC地址 macvlan模式 可以将各个容器的ip地址设置为与宿主机同一个网段的地址,这样每个容器就是独立的ip,其他宿主机或其他宿主机里的容器都可以通过ip进行互访,但是宿主机不能同该宿主机里的容器进行访问。 - none: 禁用网络 ```shell [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ddc5416839a0 bridge bridge local 892df3d2e1a5 host host local defa1db4ba12 none null local ``` ``` shell # subnet 子网掩码 # gateway 默认网关 # corenet 新的网卡名称 # 创建 bridge 网络 docker network create --driver bridge --subnet 192.37.0.0/16 --gateway 192.37.0.1 corenet # 54f3047c7d619413c36ae4a690919d37eecb125f4fda00659366bc2b24589d15 ``` ``` shell [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ddc5416839a0 bridge bridge local 2e9042816e35 corenet bridge local # 多出 corenet 892df3d2e1a5 host host local defa1db4ba12 none null local ``` ### 4. 从镜像仓库中 获取 aspnet 镜像 ``` shell docker pull mcr.microsoft.com/dotnet/core/aspnet:latest # 指定版本 docker pull mcr.microsoft.com/dotnet/aspnet:5.0 ``` ### 5. 发布asp.net core 5 项目 - 发布:\bin\Release\net5.0\publish,与Dockerfile文件没关系,可以没有Dockerfile - 将下面的文件上传到 /usr/www/WebAppDocker - Index.cshtml @Context.Connection.LocalIpAddress.MapToIPv4().ToString() 显示服务器本机的IP地址 ### 6. Dcoker运行asp.net core 5 项目,一份程序 跑 多份 ``` shell # -d 后台运行容器,并返回容器ID # -p 随机端口映射,容器内部端口随机映射到主机的端口 ===> 宿主机端口 转发 80 端口。 # --net 指定 连接网络 # -v 挂载本地目录,===> 物理路径/容器路径 # --workdir /app mcr.microsoft.com/dotnet/aspnet dotnet /app/WebAppDocker.dll # mcr.microsoft.com/dotnet/aspnet 这里为运行环境 # 在app虚拟目录下执行:mcr.microsoft.com/dotnet/aspnet dotnet /app/WebAppDocker.dll # 运行后,访问 http://192.168.17.131:8091/ IP显示为:192.37.0.2 docker run -d -p 8091:80 --net corenet -v /usr/www/WebAppDocker:/app --workdir /app mcr.microsoft.com/dotnet/aspnet dotnet /app/WebAppDocker.dll # 运行后,访问 http://192.168.17.131:8092/ IP显示为:192.37.0.3 docker run -d -p 8092:80 --net corenet -v /usr/www/WebAppDocker:/app --workdir /app mcr.microsoft.com/dotnet/aspnet dotnet /app/WebAppDocker.dll # 运行后,访问 http://192.168.17.131:8093/ IP显示为:192.37.0.4 docker run -d -p 8093:80 --net corenet -v /usr/www/WebAppDocker:/app --workdir /app mcr.microsoft.com/dotnet/aspnet dotnet /app/WebAppDocker.dll # 一份程序 用多个容器 运行 .... ``` **注:** 如果执行之后,没有运行起来,则执行 **docker log 容器名称/容器id ** , 查看 容器日志。 如果执行之后,没有运行起来,则先不要后台执行,去除 -d 参数,看报什么错误! 如果是ECS,则需要 安全组 开放端口。 ### 7.docker nginx 搭建负载均衡 #### 1. docker 下载 nginx 镜像 ``` shell docker pull nginx:latest ``` #### 2. 先把nginx.conf 文件复制到linux下面的home/ config下面 ,这样启动才可以根据配置 nginx.conf ``` nginx ##代码块中的events、http、server、location、upstream等都是块配置项## ##块配置项可以嵌套。内层块直接继承外层快,例如:server块里的任意配置都是基于http块里的已有配置的## ##Nginx worker进程运行的用户及用户组 #语法:user username[groupname] 默认:user nobody nobody #user用于设置master进程启动后,fork出的worker进程运行在那个用户和用户组下。当按照"user username;"设置时,用户组名与用户名相同。 #若用户在configure命令执行时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组。 #user nobody; ##Nginx worker进程个数:其数量直接影响性能。 #每个worker进程都是单线程的进程,他们会调用各个模块以实现多种多样的功能。如果这些模块不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程,反之,有可能出现阻塞式调用,那么,需要配置稍多一些的worker进程。 worker_processes 1; ##ssl硬件加速。 #用户可以用OpneSSL提供的命令来查看是否有ssl硬件加速设备:openssl engine -t #ssl_engine device; ##守护进程(daemon)。是脱离终端在后台允许的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示。这样一来,进程也不会被任何终端所产生的信息所打断。## ##关闭守护进程的模式,之所以提供这种模式,是为了放便跟踪调试nginx,毕竟用gdb调试进程时最繁琐的就是如何继续跟进fork出的子进程了。## ##如果用off关闭了master_proccess方式,就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求 #daemon off; #查看是否以守护进程的方式运行Nginx 默认是on #master_process off; #是否以master/worker方式工作 默认是on ##error日志的设置# #语法: error_log /path/file level; #默认: error_log / log/error.log error; #当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段; #leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大。 #当level的级别为error时,error、crit、alert、emerg级别的日志就都会输出。大于等于该级别会输出,小于该级别的不会输出。 #如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项。 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; ##pid文件(master进程ID的pid文件存放路径)的路径 #pid logs/nginx.pid; events { #仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR] #这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。 #debug_connection 10.224.66.14; #或是debug_connection 10.224.57.0/24 #这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。 #注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。 worker_connections 1024; } ##核心转储(coredump):在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心映像)写入一个文件(core文件),以作为调试只用,这就是所谓的核心转储(coredump). http { ##嵌入其他配置文件 语法:include /path/file #参数既可以是绝对路径也可以是相对路径(相对于Nginx的配置目录,即nginx.conf所在的目录) include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; upstream taishan { #weigth参数表示权值,权值越高被分配到的几率越大 #下面表示137有3分之2几率,138有3分之1几率 server 192.168.17.131:8091 weight=2; server 192.168.17.131:8092 weight=1; server 192.168.17.131:8092 weight=1; } #gzip on; server { ##listen监听的端口 #语法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ] #default_server: 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块 listen 80; #主机名称:其后可以跟多个主机名称,开始处理一个HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级见文末。 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #location / { # root html; # index index.html index.htm; #} ##location 语法: location [=|~|~*|^~] /uri/ { ... } # location的使用实例见文末。 #注意:location时有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理。 location / { proxy_pass http://taishan; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://39.96.34.52:8091; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } ``` #### 3. 运行安装文件启动 ``` shell # -d 后台运行容器,并返回容器ID # -p 随机端口映射,容器内部端口随机映射到主机的端口 # --net 指定 连接网络 # -v 挂载本地目录 # -v /home/config/:/var/log/nginx/ 映射日志路径 # -v /home/config/nginx.conf:/etc/nginx/nginx.conf:ro 映射配置路径 # --name 新容器名称 要使用的镜像名称 docker run -d -p 8090:80 --net corenet -v /home/config/:/var/log/nginx/ -v /home/config/nginx.conf:/etc/nginx/nginx.conf:ro --name nginx nginx ``` 访问 http://192.168.17.131:8090/ ,刷新显示出 不同的服务器本机IP 。 参考其他配置: ``` shell # 在/usr/local目录下创建多个目录 mkdir conf conf.d html # nginx-test:容器名称 # /etc/nginx/nginx.conf:容器的配置文件 # /usr/local/nginx/conf/nginx.conf:目标路径 docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf docker cp nginx-test:/etc/nginx/conf.d/default.conf /usr/local/nginx/conf.d docker cp nginx-test:/usr/share/nginx/html /usr/local/nginx/html/ ``` ``` shell # -v:第一个是挂在nginx的配置文件 # -v: 第三个是挂在nginx的默认文件 # -v:第三个是挂在nginx的html页面 # /usr/local/nginx/conf/nginx.conf:本地路径 # /etc/nginx/nginx.conf:容器的路径 # ro :文件权限设置为只读 # rw :文件权限可读可写 # 挂在外部配置文件 docker run --name nginx-test -p 8001:80 -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -v/usr/local/nginx/conf.d:/etc/nginx/conf.d:ro -v /usr/local/nginx/html/:/usr/share/nginx/html:rw -d nginx ``` # Dockerfile指令 ``` dockerfile #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. # From 一个基础镜像 FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build WORKDIR /src COPY ["WebAppDocker/WebAppDocker.csproj", "WebAppDocker/"] RUN dotnet restore "WebAppDocker/WebAppDocker.csproj" COPY . . WORKDIR "/src/WebAppDocker" RUN dotnet build "WebAppDocker.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebAppDocker.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebAppDocker.dll"] ``` ![1627571793352](media/1627571793352.png) ### FROM 命令 指定基础镜像,必须为第一个命令 ``` dockerfile 格式:   FROM   FROM :   FROM @ 示例:   FROM mysql:5.6 注:   tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像 ``` ### MAINTAINER 命令 维护者信息 ``` dockerfile 格式: MAINTAINER 示例: MAINTAINER Jasper Xu MAINTAINER sorex@163.com MAINTAINER Jasper Xu ``` ### RUN 命令 构建镜像时执行的命令 ``` dockerfile RUN用于在镜像容器中执行命令,其有以下两种命令执行方式: shell执行 格式: RUN exec执行 格式: RUN ["executable", "param1", "param2"] 示例: RUN ["executable", "param1", "param2"] RUN apk update RUN ["/etc/execfile", "arg1", "arg1"] 注:   RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache ``` ### ADD 命令 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget ``` shell 格式: ADD ... ADD ["",... ""] 用于支持包含空格的路径 示例: ADD hom* /mydir/ # 添加所有以"hom"开头的文件 ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/ ``` ### COPY 命令 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 ### CMD 命令 构建容器后调用,也就是在容器启动时才进行调用。 ``` shell 格式: CMD ["executable","param1","param2"] (执行可执行文件,优先) CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 (执行shell内部命令) 示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"] 注:   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。 ``` ### ENTRYPOINT 命令 配置容器,使其可执行化。配合CMD可省去"application",只使用参数。 ``` shell 格式: ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先) ENTRYPOINT command param1 param2 (shell内部命令) 示例: FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"] 注:    ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 ``` ### LABEL 命令 用于为镜像添加元数据 ``` shell 格式: LABEL = = = ... 示例:   LABEL version="1.0" description="这是一个Web服务器" by="IT笔录" 注:   使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。 ``` ### ENV 命令 设置环境变量 ``` shell 格式: ENV #之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量 ENV = ... #可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行 示例: ENV myName John Doe ENV myDog Rex The Dog ENV myCat=fluffy ``` ### EXPOSE 命令 指定于外界交互的端口 ``` shell 格式: EXPOSE [...] 示例: EXPOSE 80 443 EXPOSE 8080 EXPOSE 11211/tcp 11211/udp 注:   EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口 ``` ### VOLUME命令 用于持久化目录 ``` dockerfile 格式: VOLUME ["/path/to/dir"] 示例: VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2" 注:   一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它 ``` ### WORKDIR 命令 工作目录,类似于cd命令 ``` dockerfile 格式: WORKDIR /path/to/workdir 示例: WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c) 注:   通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。 ``` ### USER 命令 ​ 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。 ``` dockerfile 格式:   USER user   USER user:group   USER uid   USER uid:gid   USER user:gid   USER uid:group 示例:   USER www 注:   使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。 ``` ### ARG 命令 用于指定传递给构建运行时的变量 ``` dockerfile 格式: ARG [=] 示例: ARG site ARG build_user=www ``` ### ONBUILD 命令 用于设置镜像触发器 ``` dockerfile 格式:   ONBUILD [INSTRUCTION] 示例:   ONBUILD ADD . /app/src   ONBUILD RUN /usr/local/bin/python-build --dir /app/src 注:   当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发 ```