【進擊的Docker】2023年Docker快速入門教程,包含.Net項目的部署

image.png

b站視頻【進擊的Docker】2023年Docker快速入門教程,包含.Net項目的部署

抖音視頻【進擊的Docker】2023年Docker快速入門教程,包含.Net項目的部署

官網(wǎng)地址:https://docs.docker.com/
<a name="x7KwM"></a>

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

<a name="YnRdy"></a>

概念:

Docker 是一個用于開發(fā)、運維和運行應(yīng)用程序的開放平臺。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,以便您可以快速交付軟件。

<a name="t5mx8"></a>

作用場景:

  • 使用 Docker 將應(yīng)用程序推送到測試環(huán)境中,并執(zhí)行自動和手動測試。

  • 當(dāng)開發(fā)人員發(fā)現(xiàn)bug時,可以在開發(fā)環(huán)境中修復(fù),重新部署到測試環(huán)境中進行測試驗證。

  • 傳統(tǒng)的交付是代碼的交付,而使用了Docker 我們交付的是功能,因為我可以把程序打包成鏡像給運維人員,對于運維人員不需要知道程序是什么語言編寫的,他們只需要執(zhí)行docker命令讓程序跑起來就行了。
    <a name="sRfy5"></a>

架構(gòu)圖:

[圖片上傳失敗...(image-a252ed-1677719912208)]

<a name="kmBgY"></a>

二、學(xué)習(xí)預(yù)期結(jié)果

  • 安裝docker engine,了解docker常用命令
  • 構(gòu)建并運行鏡像作為容器
  • 使用帶有tomcat的多個容器部署 Docker 應(yīng)用程序
  • 學(xué)習(xí)Dockerfile
  • 了解Docker Compose
    <a name="y0zsT"></a>

三、根據(jù)官方教程,我們來實操

<a name="f4YlI"></a>

3.1.準(zhǔn)備工作

<a name="SOIu0"></a>

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

<a name="zZSzw"></a>

2.安裝git、zip(文件解壓/壓縮)

##安裝git
yum install -y git

## 安裝zip
yum install -y zip

<a name="h3W1w"></a>

3.Docker常用命令(重要)

<a name="Xzx6H"></a>

3.2.快速開始

<a name="MIxiY"></a>

1.概述

名詞解釋
[圖片上傳失敗...(image-b008c5-1677719912208)]

<a name="Ql3Bm"></a>

1.(容器)鏡像

簡單的解釋:比作類

官方解釋

運行容器時,它使用隔離的文件系統(tǒng)。此自定義文件系統(tǒng)由容器映像提供。由于鏡像包含容器的文件系統(tǒng),它必須包含運行應(yīng)用程序所需的一切——所有依賴項、配置、腳本、二進制文件等。鏡像還包含容器的其他配置,例如環(huán)境變量、要運行的默認(rèn)命令、和其他元數(shù)據(jù)。

<a name="NEYej"></a>

2.容器

簡單的解釋:比作類的實例

容器是機器上的沙盒進程,與主機上的所有其他進程隔離。

<a name="PQnI7"></a>

2.容器化應(yīng)用程序

https://docs.docker.com/get-started/02_our_app/
<a name="BzI8N"></a>

3.更新應(yīng)用程序

https://docs.docker.com/get-started/03_updating_app/
<a name="pYcug"></a>

4.將應(yīng)用推送到DockerHub

https://docs.docker.com/get-started/04_sharing_app/
<a name="yimw0"></a>

5.保存數(shù)據(jù)

https://docs.docker.com/get-started/05_persisting_data/
<a name="sIdV0"></a>

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
使用容器內(nèi)容填充新卷 是的
支持卷驅(qū)動 是的

<a name="QrXUg"></a>

3.3.部署一個dotnet應(yīng)用程序(webapp)

<a name="EXezJ"></a>

第一步:在服務(wù)器上創(chuàng)建一個新項目 或使用vs studio創(chuàng)建個項目上傳服務(wù)器

**webapi(基于netcore3.1): **下載鏈接

<a name="Xmef5"></a>

第二步:構(gòu)建鏡像

需要dockerfile的知識: [點擊跳往](#l31Qk)

<a name="AULwV"></a>

第三步:運行我們的容器

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

<a name="yInwD"></a>

第四步:使用docker compose

需要dockerCompose的知識: 點擊跳往

ps:注意這里是優(yōu)先啟動mysql服務(wù)

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配置中是個.意味著它是處于當(dāng)前根目錄進行build操作,此處尋找默認(rèn)的Dockerfile文件
     context: .
#dockerfile配置了,如果是絕對路徑就按絕對路徑取 如果是相對路徑會針對這個Dockerfile文件名 尋找并build
     dockerfile: Dockerfile
   ports:
     - 5000:80
   depends_on:
     - mysql_db
volumes:
 mysql-data:

如果我們配置mysql_db里面的數(shù)據(jù)卷詳細(xì),可以這么配置

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這個數(shù)據(jù)卷,可以在volumes中增加一個配置external: true

volumes:
 mysql-data:
  external: true

下面是一個webapi的項目,我配置的docker-compose文件

### 第一級別有services (服務(wù))、volumes(數(shù)據(jù)卷)、networks(網(wǎng)絡(luò)) 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表示服務(wù)之間的啟動和關(guān)閉依賴關(guān)系 比如這里需要mysql啟動 整個應(yīng)用才能正常運行 加入redis也是如此的  
   depends_on:
     - mysql
   networks:
     - mysql-net  
volumes:
 mysql-data:
networks:
 mysql-net: {} 

參考鏈接:

使 .NET 應(yīng)用容器化 (參考案例是控制臺程序)

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

<a name="yKM4W"></a>

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

<a name="gfCmW"></a>

4.1 常用命令

1、鏡像相關(guān)命令

## 查看鏡像
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


## 構(gòu)建一個鏡像

2、容器相關(guān)命令


## 啟動容器
docker run <imageName>
     -d 以后臺方式運行容器
     -it 以交互的方式運行容器
    --name 指定容器名稱
    --network 容器可以訪問自定義網(wǎng)絡(luò)

### 示例
[root@ecs-356882 ~]# docker run redis:6.2
---以交互的方式運行容器
[root@ecs-356882 ~]# docker run -it redis:6.2 /bin/bash

---運行的mysql連接到自定義網(wǎng)絡(luò)
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",
    }
]



## 進入正在運行的容器內(nèi)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
### 示例
docker exec -it 5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e /bin/bash

## 退出容器
//已交互的方式進入的
Ctrl+D ==》會停止容器
exit ==》會停止容器
---僅退出容器 但不會關(guān)閉容器 Ctrl+P 加Ctrl+Q

3、關(guān)于數(shù)據(jù)卷

## 創(chuàng)建數(shù)據(jù)卷 

docker volume create <卷名>

## 查看所有的數(shù)據(jù)卷  
docker volume ls

### 示例
[root@ecs-356882 ~]# docker volume ls
DRIVER    VOLUME NAME
local     ef5bbfaa89dc8988e40a02f4e65ff222f8669f12bae0c3a42dc77741146374c8
local     hello

##查看指定數(shù)據(jù)卷的詳細(xì)信息  
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"
    }
]


##刪除數(shù)據(jù)卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]

## 運行容器并掛載數(shù)據(jù)卷
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、自定義網(wǎng)絡(luò)

1.創(chuàng)建網(wǎng)絡(luò)
 docker network create [OPTIONS] NETWORK
    -d 關(guān)聯(lián)網(wǎng)絡(luò)的驅(qū)動 默認(rèn)是bridge(橋接模式)

## 示例
 docker network create  my-bridge-network   
 docker network create -d bridge my-bridge-network

2.查看網(wǎng)絡(luò)列表
 docker network ls

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


3.查看網(wǎng)絡(luò)詳情
 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.移除網(wǎng)絡(luò)
 docker network rm NETWORK [NETWORK...]

## 示例
[root@ecs-356882 ~]# docker network rm my-bridge-network
my-bridge-network


<a name="l31Qk"></a>

4.2 關(guān)于Dockerfile


以下指令列表支持環(huán)境變量Dockerfile:
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD(當(dāng)結(jié)合上述支持的指令之一時)
--------------------------------------
--- 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)等指令 設(shè)置工作目錄,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


<a name="mIPeP"></a>

了解 CMD 和 ENTRYPOINT 是如何交互的

一個Dockerfile中只能有一條CMD指令。如果您列出多個CMD 命令則只有最后一個CMD會生效。
CMD和指令都ENTRYPOINT定義了運行容器時執(zhí)行的命令。很少有規(guī)則描述他們的合作。

  1. Dockerfile 應(yīng)指定至少一個CMD或ENTRYPOINT命令。
  2. ENTRYPOINT應(yīng)該在將容器用作可執(zhí)行文件時定義。
  3. CMD應(yīng)該用作為命令定義默認(rèn)參數(shù)ENTRYPOINT或在容器中執(zhí)行臨時命令的一種方式。
  4. CMD在使用可選參數(shù)運行容器時將被覆蓋。

下表顯示了針對不同ENTRYPOINT/CMD組合執(zhí)行的命令:

** ** 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

<a name="bkhOZ"></a>

4.3 關(guān)于Docker Compose

Docker Compose的文件規(guī)范:

### 服務(wù)(鏡像和容器)
services:

  
### 數(shù)據(jù)卷
volumes:
 
### 配置 如redis的配置文件
configs:
  
### 認(rèn)證模塊 如https證書
secrets:
   
### 自定義網(wǎng)絡(luò)
networks:
   

拆分模塊:
<a name="Bj5hU"></a>

1、services

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

<a name="MKNF2"></a>

2、volumes


### 簡約版
services:
  backend:
    image: awesome/backend
    volumes:
      - db-data: /var/run/postgres/postgres.sock
volumes:
  db-data:


### 詳細(xì)版

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:

<a name="muQjc"></a>

3、configs

redis下載https://download.redis.io/releases/redis-6.2.1.tar.gz
解壓后執(zhí)行make命令
進入src目錄執(zhí)行啟動命令:.>./redis-server ../redis.conf
--- 進入命令行
同樣的進入src目錄啟動cli端命令:.>./redis-cli
[圖片上傳失敗...(image-5aa262-1677719912208)]

services:
  redis:
    image: redis:6.2
    configs:
      - my_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

##轉(zhuǎn)儲DB的文件名
dbfilename dump.rdb     
    

<a name="VWMBm"></a>

4、networks

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

networks:
  front-tier:
  back-tier:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容