乐趣区

关于运维:进击的Docker2023年Docker快速入门教程包含Net项目的部署

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(文件解压 / 压缩)

## 装置 git
yum install -y git

## 装置 zip
yum 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/data type=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_db
volumes:
 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 ls
DRIVER    VOLUME NAME
local     ef5bbfaa89dc8988e40a02f4e65ff222f8669f12bae0c3a42dc77741146374c8
local     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 [宿主机地位:容器所在位置]


### 示例 1
docker 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
### 示例 2
docker 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-network

2. 查看网络列表
 docker network ls

## 示例
[root@ecs-356882 ~]# docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
e91ea2f84b1e   my-bridge-network   bridge    local


3. 查看网络详情
 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-network
my-bridge-network

4.2 对于 Dockerfile


以下指令列表反对环境变量 Dockerfile:ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD(当联合上述反对的指令之一时)--------------------------------------
--- 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 ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT [“exec_entry”,“p1_entry”]
No CMD 谬误,不容许 /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD [“exec_cmd”,“p1_cmd”] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_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_entry exec_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.sock
volumes:
  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.sock
volumes:
  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_config
configs:
  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-tier

networks:
  front-tier:
  back-tier:
退出移动版