【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署

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

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

概念:

Docker 是一个用于开发、运维和运转应用程序的开放渠道。Docker 使您能够将应用程序与根底架构分隔,以便您能够快速交给软件。

效果场景:

  • 运用 Docker 将应用程序推送到测验环境中,并履行自动和手动测验。

  • 当开发人员发现bug时,能够在开发环境中修复,重新布置到测验环境中进行测验验证。

  • 传统的交给是代码的交给,而运用了Docker 咱们交给的是功用,因为我能够把程序打包成镜像给运维人员,对于运维人员不需求知道程序是什么言语编写的,他们只需求履行docker指令让程序跑起来就行了。

架构图:

【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署

二、学习预期结果

  • 装置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

【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署
【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署

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.概述

名词解说

【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署

1.(容器)镜像

简略的解说:比作类

官方解说

运转容器时,它运用隔离的文件体系。此自界说文件体系由容器映像提供。因为镜像包括容器的文件体系,它有必要包括运转应用程序所需的全部——一切依靠项、装备、脚本、二进制文件等。镜像还包括容器的其他装备,例如环境变量、要运转的默许指令、和其他元数据

2.容器

简略的解说:比作类的实例

容器是机器上的沙盒进程,与主机上的一切其他进程隔离。

2.容器化应用程序

docs.docker.com/get-started…

3.更新应用程序

docs.docker.com/get-started…

4.将应用推送到DockerHub

docs.docker.com/get-started…

5.保存数据

docs.docker.com/get-started…

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

docs.docker.com/get-started…

** ** 命名卷(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)

第三步:运转咱们的容器

docs.docker.com/language/do…

第四步:运用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 应用容器化 (参阅事例是控制台程序)

learn.microsoft.com/zh-cn/dotne…

ASP.NET Core 的 Docker 映像:

learn.microsoft.com/zh-cn/aspne…

如安在 Visual Studio 中自界说 Docker 容器

learn.microsoft.com/zh-cn/visua…

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

hub.docker.com/_/microsoft…

四、常用指令与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下载:download.redis.io/releases/re… 解压后履行make指令 进入src目录履行发动指令**:.>./redis-server ../redis.conf — 进入指令行 相同的进入src目录发动cli端指令:.>**./redis-cli

【进击的Docker】2023年Docker快速入门教程,包含.Net项目的部署

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     

The filename where to dump the DB

4、networks

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