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(文件解压/压缩)
##装置gityum install -y git## 装置zipyum 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_dbvolumes: 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 lsDRIVER VOLUME NAMElocal ef5bbfaa89dc8988e40a02f4e65ff222f8669f12bae0c3a42dc77741146374c8local 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 [宿主机地位:容器所在位置]### 示例1docker 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### 示例2docker 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-network2.查看网络列表 docker network ls## 示例[root@ecs-356882 ~]# docker network lsNETWORK ID NAME DRIVER SCOPEe91ea2f84b1e my-bridge-network bridge local3.查看网络详情 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-networkmy-bridge-network
4.2 对于Dockerfile
以下指令列表反对环境变量Dockerfile:ADDCOPYENVEXPOSEFROMLABELSTOPSIGNALUSERVOLUMEWORKDIRONBUILD(当联合上述反对的指令之一时)----------------------------------------- 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定义了运行容器时执行的命令。很少有规定形容他们的单干。
- Dockerfile 应指定至多一个CMD或ENTRYPOINT命令。
- ENTRYPOINT应该在将容器用作可执行文件时定义。
- CMD应该用作为命令定义默认参数ENTRYPOINT或在容器中执行长期命令的一种形式。
- 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.sockvolumes: 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.sockvolumes: 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_configconfigs: 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-tiernetworks: front-tier: back-tier: