b站视频:【进击的Docker】2023年Docker疾速入门教程,蕴含.Net我的项目的部署

抖音视频:【进击的Docker】2023年Docker疾速入门教程,蕴含.Net我的项目的部署

官网地址:https://docs.docker.com/

一、什么是Docker,它能做什么

概念:

Docker 是一个用于开发、运维和运行应用程序的开放平台。Docker 使您可能将应用程序与基础架构离开,以便您能够疾速交付软件。

作用场景:

  • 应用 Docker 将应用程序推送到测试环境中,并执行主动和手动测试。
  • 当开发人员发现bug时,能够在开发环境中修复,重新部署到测试环境中进行测试验证。
  • 传统的交付是代码的交付,而应用了Docker 咱们交付的是性能,因为我能够把程序打包成镜像给运维人员,对于运维人员不须要晓得程序是什么语言编写的,他们只须要执行docker命令让程序跑起来就行了。

    架构图:

二、学习预期后果

  • 装置docker engine,理解docker常用命令
  • 构建并运行镜像作为容器
  • 应用带有tomcat的多个容器部署 Docker 应用程序
  • 学习Dockerfile
  • 理解Docker Compose

    三、依据官网教程,咱们来实操

3.1.筹备工作

1. Docker Engine的装置

$ sudo yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-engine
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin


systemctl start docker
docker run hello-world

2.装置git、zip(文件解压/压缩)

##装置gityum install -y git## 装置zipyum install -y zip

3.Docker常用命令(重要)

  • 点击跳往

3.2.疾速开始

1.概述

名词解释

1.(容器)镜像

简略的解释:比作类

官网解释

运行容器时,它应用隔离的文件系统。此自定义文件系统由容器映像提供。因为镜像蕴含容器的文件系统,它必须蕴含运行应用程序所需的所有——所有依赖项、配置、脚本、二进制文件等。镜像还蕴含容器的其余配置,例如环境变量、要运行的默认命令、和其余元数据。

2.容器
简略的解释:比作类的实例

容器是机器上的沙盒过程,与主机上的所有其余过程隔离。

2.容器化应用程序

https://docs.docker.com/get-started/02_our_app/

3.更新应用程序

https://docs.docker.com/get-started/03_updating_app/

4.将利用推送到DockerHub

https://docs.docker.com/get-started/04_sharing_app/

5.保留数据

https://docs.docker.com/get-started/05_persisting_data/

6.应用绑定装置(绑定挂载)

https://docs.docker.com/get-started/06_bind_mounts/

命名卷(Named volumes)绑定挂载(Bind mounts)
主机地位Docker 抉择你的决定
装置示例(应用--mount)type=volume,src=my-volume,target=/usr/local/datatype=bind,src=/path/to/data,target=/usr/local/data
应用容器内容填充新卷是的
反对卷驱动是的

3.3.部署一个dotnet应用程序(webapp)

第一步:在服务器上创立一个新我的项目 或应用vs studio创立个我的项目上传服务器

webapi(基于netcore3.1): 下载链接

第二步:构建镜像

须要dockerfile的常识: [点击跳往](#l31Qk)

第三步:运行咱们的容器

https://docs.docker.com/language/dotnet/develop/

第四步:应用docker compose

须要dockerCompose的常识: 点击跳往

ps:留神这里是优先启动mysql服务

services: mysql_db:   image: mysql:5.7   container_name: mysql_db   restart: always   environment:     MYSQL_ROOT_PASSWORD: mysql123456   volumes:     - mysql-data:/var/lib/mysql adminer:   image: adminer   restart: always   ports:     - 8080:8080 donet-app:   build:#cotext配置中是个.意味着它是处于以后根目录进行build操作,此处寻找默认的Dockerfile文件     context: .#dockerfile配置了,如果是绝对路径就按绝对路径取 如果是相对路径会针对这个Dockerfile文件名 寻找并build     dockerfile: Dockerfile   ports:     - 5000:80   depends_on:     - mysql_dbvolumes: mysql-data:

如果咱们配置mysql_db外面的数据卷具体,能够这么配置

services: mysql_db:   image: mysql:5.7   container_name: mysql_db   restart: always   environment:     MYSQL_ROOT_PASSWORD: mysql123456   volumes:     - type: volume       source: mysql-data       target: /var/lib/mysql       volume:         nocopy: true

如果须要寻找内部的mysql-data这个数据卷,能够在volumes中减少一个配置external: true

volumes: mysql-data:  external: true

上面是一个webapi的我的项目,我配置的docker-compose文件

### 第一级别有services (服务)、volumes(数据卷)、networks(网络) configs(配置,注此处没用)### secrets(比方https证书) services: mysql:   image: mysql:5.7   container_name: mysql_db   restart: always   ports:      ## 别忘记映射端口        - 3306:3306   environment:     MYSQL_ROOT_PASSWORD: mysql123456     MYSQL_DATABASE: my_db   volumes:     - mysql-data:/var/lib/mysql   networks:     - mysql-net        adminer:   image: adminer   container_name: db_adminer_manage   restart: always   ports:     - 8080:8080   networks:     - mysql-net   app:   build:     context: .   container_name: dotnet-app   ports:     - 5000:80   ## depends_on示意服务之间的启动和敞开依赖关系 比方这里须要mysql启动 整个利用能力失常运行 退出redis也是如此的     depends_on:     - mysql   networks:     - mysql-net  volumes: mysql-data:networks: mysql-net: {} 

参考链接:

使 .NET 利用容器化 (参考案例是控制台程序)

https://learn.microsoft.com/zh-cn/dotnet/core/docker/build-container?tabs=windows

ASP.NET Core 的 Docker 映像:

https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1

如何在 Visual Studio 中自定义 Docker 容器

https://learn.microsoft.com/zh-cn/visualstudio/containers/container-build?view=vs-2019

.NET and ASP.NET Core的官网镜像

https://hub.docker.com/_/microsoft-dotnet

四、常用命令与Dockerfile(重要)

4.1 常用命令

1、镜像相干命令

## 查看镜像docker images## 搜寻镜像docker search <imageName>###示例[root@ecs-356882 ~]# docker search redis## 下载镜像docker pull <imageName>###示例[root@ecs-356882 ~]# docker pull redis### 下载指定版本的redis镜像[root@ecs-356882 ~]# docker pull redis:6.2## 删除镜像docker rmi <IMAGEList>        --- -f,--force 强制删除镜像###示例 删除多个redis镜像[root@ecs-356882 ~]# docker rmi 1f2e359f9324 2f66aad5324a## 构建一个镜像

2、容器相干命令

## 启动容器docker run <imageName>     -d 当前台形式运行容器     -it 以交互的形式运行容器      --name 指定容器名称      --network 容器能够拜访自定义网络### 示例[root@ecs-356882 ~]# docker run redis:6.2---以交互的形式运行容器[root@ecs-356882 ~]# docker run -it redis:6.2 /bin/bash---运行的mysql连贯到自定义网络docker run --name mysql01 --network=mysql_network -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7## 显示容器列表docker ps       显示正在运行的所有容器    --all , -a        显示所有容器## 进行容器docker stop [OPTIONS] CONTAINER [CONTAINER...]### 示例[root@ecs-356882 ~]# docker stop fd4405ab0bde## 删除容器docker rm [OPTIONS] CONTAINER [CONTAINER...]    --- -f,--force 强制删除容器## 启动进行的容器docker start [OPTIONS] CONTAINER [CONTAINER...]## 重启容器docker restart [OPTIONS] CONTAINER [CONTAINER...]### 示例docker start fd4405ab0bde## 查看容器详情信息docker inspect### 示例root@ecs-356882 ~]# docker inspect 5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e[    {        "Id": "5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e",        "Created": "2023-02-11T03:11:18.664894024Z",        "Path": "docker-entrypoint.sh",        "Args": [            "redis-server"        ],        "Image": "sha256:1f2e359f9324e978cb509c1fa583af9c679efb33969f5584368b3ddd9568592b",    }]## 进入正在运行的容器内docker exec [OPTIONS] CONTAINER COMMAND [ARG...]### 示例docker exec -it 5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e /bin/bash## 退出容器//已交互的形式进入的Ctrl+D ==》会进行容器exit ==》会进行容器---仅退出容器 但不会敞开容器 Ctrl+P 加Ctrl+Q

3、对于数据卷

## 创立数据卷 docker volume create <卷名>## 查看所有的数据卷  docker volume ls### 示例[root@ecs-356882 ~]# docker volume lsDRIVER    VOLUME NAMElocal     ef5bbfaa89dc8988e40a02f4e65ff222f8669f12bae0c3a42dc77741146374c8local     hello##查看指定数据卷的详细信息  docker volume inspect### 示例[root@ecs-356882 ~]# docker volume inspect hello[    {        "CreatedAt": "2023-02-11T12:00:46+08:00",        "Driver": "local",        "Labels": null,        "Mountpoint": "/var/lib/docker/volumes/hello/_data",        "Name": "hello",        "Options": null,        "Scope": "local"    }]##删除数据卷docker volume rm [OPTIONS] VOLUME [VOLUME...]## 运行容器并挂载数据卷docker run -v [宿主机地位:容器所在位置]### 示例1docker run --name mysql01 -v /home/mysql/conf:/etc/mysql/conf.d  -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql123456 -d  -p 3389:3306  mysql:5.7### 示例2docker run --name myredis -p 6379:6379 -v /home/redis/data:/data -v /home/redis/conf:/etc/redis -d redis:6.2 redis-server /etc/redis/redis.conf### 示例3 --mount指定卷装载的选项docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

4、自定义网络

1.创立网络 docker network create [OPTIONS] NETWORK    -d 关联网络的驱动 默认是bridge(桥接模式)## 示例 docker network create  my-bridge-network     docker network create -d bridge my-bridge-network2.查看网络列表 docker network ls## 示例[root@ecs-356882 ~]# docker network lsNETWORK ID     NAME                DRIVER    SCOPEe91ea2f84b1e   my-bridge-network   bridge    local3.查看网络详情 docker network inspect [OPTIONS] NETWORK [NETWORK...]## 示例[root@ecs-356882 ~]#  docker network inspect my-bridge-network[    {        "Name": "my-bridge-network",        "Id": "e91ea2f84b1e7de64828a628cf476fda9e805fd49a6a8000e9166166bf28fb85",        "Created": "2023-02-11T14:39:53.48799159+08:00",        "Scope": "local",        "Driver": "bridge",        "EnableIPv6": false        }]4.移除网络 docker network rm NETWORK [NETWORK...]## 示例[root@ecs-356882 ~]# docker network rm my-bridge-networkmy-bridge-network

4.2 对于Dockerfile

以下指令列表反对环境变量Dockerfile:ADDCOPYENVEXPOSEFROMLABELSTOPSIGNALUSERVOLUMEWORKDIRONBUILD(当联合上述反对的指令之一时)----------------------------------------- FROM 指令FROM [--platform=<platform>] <image> [AS <name>]或者FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]或者FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]--- ENV 指令ENV <key>=<value> ...### 示例ENV abc="123"ENV MY_NAME="John" MY_DOG="555"--- RUN 指令 (能够运行非docker的指令)RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)RUN ["executable", "param1", "param2"] (exec form)RUN dotnet new webapi -n MyApi--- WORKDIR 指令给(ADD COPY)等指令 设置工作目录,path 这个是绝对镜像的WORKDIR <path>--- COPY 指令COPY [--chown=<user>:<group>] <src>... <dest>COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]### 示例COPY /src .--- EXPOSE 指令 (裸露端口)EXPOSE <port> [<port>/<protocol>...]### 示例EXPOSE 8090

理解 CMD 和 ENTRYPOINT 是如何交互的

一个Dockerfile中只能有一条CMD指令。如果您列出多个CMD 命令则只有最初一个CMD会失效。
CMD和指令都ENTRYPOINT定义了运行容器时执行的命令。很少有规定形容他们的单干。

  1. Dockerfile 应指定至多一个CMD或ENTRYPOINT命令。
  2. ENTRYPOINT应该在将容器用作可执行文件时定义。
  3. CMD应该用作为命令定义默认参数ENTRYPOINT或在容器中执行长期命令的一种形式。
  4. CMD在应用可选参数运行容器时将被笼罩。

下表显示了针对不同ENTRYPOINT/CMD组合执行的命令:

No ENTRYPOINTENTRYPOINT exec_entry p1_entryENTRYPOINT [“exec_entry”, “p1_entry”]
No CMD谬误,不容许/bin/sh -c exec_entry p1_entryexec_entry p1_entry
CMD [“exec_cmd”,“p1_cmd”]exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry exec_cmd p1_cmd
CMD exec_cmd p1_cmd/bin/sh -c exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

4.3 对于Docker Compose

Docker Compose的文件标准:

### 服务(镜像和容器)services:  ### 数据卷volumes: ### 配置 如redis的配置文件configs:  ### 认证模块 如https证书secrets:   ### 自定义网络networks:   

拆分模块:

1、services

services:  foo:    image: foo  bar:    image: bar    profiles:      - test  baz:    image: baz    depends_on:      - bar    profiles:      - test

2、volumes

### 简洁版services:  backend:    image: awesome/backend    volumes:      - db-data: /var/run/postgres/postgres.sockvolumes:  db-data:### 具体版services:  backend:    image: awesome/backend    volumes:      - type: volume        source: db-data        target: /data        volume:          nocopy: true      - type: bind        source: /var/run/postgres/postgres.sock        target: /var/run/postgres/postgres.sockvolumes:  db-data:

3、configs

redis下载:https://download.redis.io/releases/redis-6.2.1.tar.gz
解压后执行make命令
进入src目录执行启动命令:.>./redis-server ../redis.conf
--- 进入命令行
同样的进入src目录启动cli端命令:.>./redis-cli

services:  redis:    image: redis:6.2    configs:      - my_configconfigs:  my_config:    file: ./my_config.txt  my_other_config:    external: true##转储DB的文件名dbfilename dump.rdb         

4、networks

services:  frontend:    image: awesome/webapp    networks:      - front-tier      - back-tiernetworks:  front-tier:  back-tier: