
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
如何在 Visual Studio 中自定義 Docker 容器
https://learn.microsoft.com/zh-cn/visualstudio/containers/container-build?view=vs-2019
<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ī)則描述他們的合作。
- Dockerfile 應(yīng)指定至少一個CMD或ENTRYPOINT命令。
- ENTRYPOINT應(yīng)該在將容器用作可執(zhí)行文件時定義。
- CMD應(yīng)該用作為命令定義默認(rèn)參數(shù)ENTRYPOINT或在容器中執(zhí)行臨時命令的一種方式。
- 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: