|
相关视频:
官网地址:
一、什么是Docker,它能做什么
概念:
Docker 是一个用于开发、运维和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件。
作用场景:
- 使用 Docker 将应用程序推送到测试环境中,并执行自动和手动测试。
- 当开发人员发现bug时,可以在开发环境中修复,重新部署到测试环境中进行测试验证。
- 传统的交付是代码的交付,而使用了Docker 我们交付的是功能,因为我可以把程序打包成镜像给运维人员,对于运维人员不需要知道程序是什么语言编写的,他们只需要执行docker命令让程序跑起来就行了。
架构图:

二、学习预期结果
- 安装docker engine,了解docker常用命令
- 构建并运行镜像作为容器
- 使用带有tomcat的多个容器部署 Docker 应用程序
- 学习Dockerfile
- 了解Docker Compose
三、根据官方教程,我们来实操
3.1.准备工作
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
---安装yum-utils包
$ sudo yum install -y yum-utils
---设置yum管理使用阿里云镜像
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
---安装 Docker Engine、containerd 和 Docker Compose
$ sudo yum install docker-ce docker-ce-cli containerd docker-compose-plugin


---启动docker
systemctl start docker
---通过运行镜像验证 Docker Engine 安装是否成功
docker run hello-world3.1.2.安装git、zip(文件解压/压缩)
##安装git
yum install -y git
## 安装zip
yum install -y zip3.13.Docker常用命令(重要)
3.2.快速开始
3.2.1.概述
名词解释

(容器)镜像
简单的解释:比作类
官方解释运行容器时,它使用隔离的文件系统。此自定义文件系统由容器映像提供。由于镜像包含容器的文件系统,它必须包含运行应用程序所需的一切——所有依赖项、配置、脚本、二进制文件等。镜像还包含容器的其他配置,例如环境变量、要运行的默认命令、和其他元数据。 3.2.2.容器
简单的解释:比作类的实例
容器是机器上的沙盒进程,与主机上的所有其他进程隔离。 3.2.3.容器化应用程序
[Containerize an application](Containerize an application)
3.2.4.更新应用程序
[Update the application](Update the application)
3.2.5.将应用推送到DockerHub
[Share the application](Share the application)
3.2.6.保存数据
[Persist the DB](Persist the DB)
3.2.7.使用绑定安装(绑定挂载)
[Use bind mounts](Use 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创建个项目上传服务器
第二步:构建镜像
需要dockerfile的知识: [点击跳往](#l31Qk)
第三步:运行我们的容器
[Use containers for development](Use containers for development)
第四步:使用docker compose
需要dockerCompose的知识: [点击跳往](#bkhOZ)
ps:注意这里是优先启动mysql服务
yaml
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里面的数据卷详细,可以这么配置
yaml
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
yaml
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: {} 四、常用命令与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
## 构建一个镜像
docker build -t <ImageName>[:tag]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
[
{
&#34;Id&#34;: &#34;5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e&#34;,
&#34;Created&#34;: &#34;2023-02-11T03:11:18.664894024Z&#34;,
&#34;Path&#34;: &#34;docker-entrypoint.sh&#34;,
&#34;Args&#34;: [
&#34;redis-server&#34;
],
&#34;Image&#34;: &#34;sha256:1f2e359f9324e978cb509c1fa583af9c679efb33969f5584368b3ddd9568592b&#34;,
}
]
## 进入正在运行的容器内
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
### 示例
docker exec -it 5d2dc551c7e383cd7cfb483b80a44ece504b1998a42fa33b2457053ef5a00a1e /bin/bash
## 退出容器
//已交互的方式进入的
Ctrl+D ==》会停止容器
exit ==》会停止容器
---仅退出容器 但不会关闭容器 Ctrl+P 加Ctrl+Q3、关于数据卷
## 创建数据卷
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
[
{
&#34;CreatedAt&#34;: &#34;2023-02-11T12:00:46+08:00&#34;,
&#34;Driver&#34;: &#34;local&#34;,
&#34;Labels&#34;: null,
&#34;Mountpoint&#34;: &#34;/var/lib/docker/volumes/hello/_data&#34;,
&#34;Name&#34;: &#34;hello&#34;,
&#34;Options&#34;: null,
&#34;Scope&#34;: &#34;local&#34;
}
]
##删除数据卷
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
[
{
&#34;Name&#34;: &#34;my-bridge-network&#34;,
&#34;Id&#34;: &#34;e91ea2f84b1e7de64828a628cf476fda9e805fd49a6a8000e9166166bf28fb85&#34;,
&#34;Created&#34;: &#34;2023-02-11T14:39:53.48799159+08:00&#34;,
&#34;Scope&#34;: &#34;local&#34;,
&#34;Driver&#34;: &#34;bridge&#34;,
&#34;EnableIPv6&#34;: 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=&#34;123&#34;
ENV MY_NAME=&#34;John&#34; MY_DOG=&#34;555&#34;
--- 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 [&#34;executable&#34;, &#34;param1&#34;, &#34;param2&#34;] (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>] [&#34;<src>&#34;,... &#34;<dest>&#34;]
### 示例
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:拆分模块:
4.3.1、services
services:
foo:
image: foo
bar:
image: bar
profiles:
- test
baz:
image: baz
depends_on:
- bar
profiles:
- test4.3.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下载: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_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
##转储DB的文件名
dbfilename dump.rdb 4.3.4、networks
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
networks:
front-tier:
back-tier: |
|