將.netcore5.0(.net5)部署在Ubuntu的docker容器中

環境:
    宿主機:winows 10 家庭版
    虛擬機管理軟件:Hyper-V
    虛擬機系統:Ubuntu 20.10
    Docker版本:Docker CE 20.10.2
    Core版本:5.0
本文不講docker的基礎知識,關於虛擬機配置和網絡共享看這裏

一、配置Ubuntu固定網絡,和DNS。方便後面ssh連接, 配置完記得ping一ping

不想後面各種網絡問題就先配置好這個!

  1. 使用ifconfig命令查看網卡
  2. 更改配置信息(注意這裏DNS設置和網關設置)
sudo vi /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    ens33:     #配置的網卡的名稱
      addresses: [192.168.137.35/24]    #之前分配的地址是137網段的,配置的靜態ip地址和掩碼
      dhcp4: no    #關閉DHCP,一般自動獲取才yes
      optional: true
      gateway4: 192.168.137.1    #網關地址
      nameservers:
         addresses: [192.168.137.1,8.8.8.8]    #DNS服務器地址,多個DNS服務器地址需要用英文逗號分隔開,共享內網 192.168.137.1 就行了
  version: 2
  renderer: networkd    #指定後端採用systemd-networkd或者Network Manager,可不填寫則默認使用systemd-workd
  1. 使配置的ip地址生效
sudo netplan apply

二、Ubuntu 安裝Docker 一把梭,反正我是成功了。

# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
#最後測試是否安裝成功
docker version

三、.net core 添加Docker支持

直接在項目目錄下添加Dokerfile,這裏沒有用自帶的doker支持

文件內容

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #.net 5基礎鏡像,很明顯沒有了那個core
WORKDIR /app #設置工作目錄
COPY . /app #這裏是將當前目錄下的文件拷貝到 鏡像 /app 目錄下面
##EXPOSE 8586 #暴露出去的端口,這裏我們通過程序裏面監聽不使用這個配置

##使用國內鏡像源
RUN echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" > /etc/apt/sources.list


# 用gdi+繪製的功能就需要安裝這個包支持
RUN apt-get update && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
# 運行 CMD命令
ENTRYPOINT ["dotnet", "FtCap.Mvc.Web.dll"]

這裏注意的三點:

  1. FROM 基礎鏡像在5.0後就去除了core 官方也有說明,對於開發這是3.1到5.0最大的改動,關於.net5 鏡像源其他說明可以到 這裏 去查看
  2. 不同系統的國內鏡像源版本代號不同,這裏使用的是阿里雲的地址,更多 查看阿里雲OPSX鏡像站,而我這裏是找的最新的debian源,因爲系統比較新..安裝其他的需要添加密鑰的認證,沒有鏡像的情況下 就很慢了
  3. apt-get install -y libgdiplus 目的是安裝gdi+的支持,windows系統自帶,但是到linux下面需要手動安裝,不然無法使用圖形繪製等功能,比如圖形驗證碼

四、發佈並部署.net5

  1. OK,文件創建好了,直接發佈項目到文件夾.注意看dockerfile 一定要發佈出來

  2. 然後通過 scp或其他軟件上傳到Ubuntu虛擬機。我這裏僅僅只用了scp來上傳,cd到publish上級目錄運行以下命令

scp -r publish Ubuntu用戶名@UbuntuIP:/home #我這裏連文件夾一起拷貝到了home下面,注意設置publish的讀寫權限 由於是本地我直接 chmod 777.
  1. 到這裏文件已經拷貝到ubuntu上了,然後 製作鏡像->啓動容器一把梭,反正我是成功了....
cd /home/publish #進入剛纔發佈的目錄裏面

創建鏡像

docker build -t dockerdemo001 . #(注意最爲英文句號,表示在當前目錄下搜索Dockerfile文件),如果沒有報錯基本就創建成功了
docker images #檢查一下看看名稱是否對如果是 none就解決問題刪了重來 ,刪除 docker rmi <ID>

參數分解:

  1. -t ---指定鏡像名稱 小寫
  2. 命令結尾處 . ---表示build上下文爲當前目錄,默認情況下docker會使用在上下文的根目錄下找到Dockerfile文件

啓動容器

docker run --name dockerdemowww -p 8586:8585 -d dockerdemo001 #如果沒有報錯基本上沒啥問題

參數分解:

  1. -d ,表示在後臺以守護態(daemonized)形式運行容器

  2. -p 外部端口與內部容器端口映射。外部端口:內部端口

  3. --name 指定容器的名稱。當然可以不指定,默認會爲我們創建

  4. 最後一個參數 dockerdemo001 就是我們剛創建的鏡像名稱

  5. 查看並運行發佈的程序

docker ps #查看正在運行的docker容器,如果有說明已經啓動成功,沒有看看 docker ps -a ,是否存在,存在嘗試 docker start <容器名稱> 啓動
#測試請求網站,如果成功就完成了docker上的部署
curl -i "http://127.0.0.1:8586"
#外網訪問開放防火牆端口
ufw allow 8586

局域網訪問,成功!

到這裏就完成了.net5 在docker上部署了

五、其他注意事項

  1. 我這裏每次重啓電腦,都需要重新在 網絡連接 進行 上文中共享網絡的操作。也就是先關閉共享再重新共享,不然ubuntu無法正常聯網。如果在已經啓動的ubuntu下,還需要重啓docker0網橋,不然容器內部無法聯網
  2. 關於容器內部的持久化和維護可以使用 docker 中的 Volume來實現。這樣就不用每次進入容器去查看或修改一些操作了

額外贈送docker基礎命令一打,注意大多數linux命令都能通過 docker xx 來用。比如 docker top

docker --help
docker run --help #使用類似的寫法查看子命令的幫助
exit #退出容器
docker run -it busybox #啓動busybox鏡像的新容器實例
docker run -it --name <name> busybox #--name爲容器指定名稱,在我們使用docker run啓動容器的時候,有以下選項來選擇網卡的工作模式:-net=
–net=bridge— #默認選項,用網橋的方式來連接docker容器。
–net=host— docker #跳過配置容器的獨立網絡棧。 
–net=container:NAME_or_ID— #新建的容器使用已有容器的網絡配置。 
–net=none— #新建的容器建立一個網絡棧,但不對這個網絡棧進行任何配置,所以只能訪問本地網絡,沒有外網。 
docker ps #查看正在運行的容器,加-a顯示全部,-q只顯示容器ID,-f篩選,docker ps -a -f=ancestor=busybox 按照名稱篩選
docker rm <容器ID> #刪除容器,使用docker rm $(docker ps -q -a) 這樣的寫法可以刪除全部
docker start <容器ID> #啓動一個容器實例,後臺運行
docker stop <容器ID> #停止
docker run -d busybox #創建實例並後臺運行,但如果容器沒什麼操作,會自動停止,start不會停止
docker attach <容器ID> #start 容器後默認後臺運行,attach可以進入容器
docker images #列出所有鏡像
sudo docker rmi <鏡像ID> #刪除鏡像,刪除前需要先刪除該鏡像的容器
docker exec -it mynginx /bin/sh #進入 mynginx 容器中以交互模式

#查看端口映射信息:
docker port <id> #3306/tcp -> 0.0.0.0:330
#查看logs:
docker logs <id>
docker network inspect bridge #查看網絡橋接
docker network ls #列出網絡信息
docker network inspect <容器ID> #網絡檢測
docker inspect <容器ID> #查看容器元數據,信息比較完整
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章