Docker虚拟化容器
一、简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
三要素:镜像、仓库、容器
- 镜像:将应用程序及其依赖、环境、配置打包在一起构成镜像。Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
- 容器
-
-
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
-
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
-
- 仓库
-
-
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
-
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
-
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
-
-
-
服务端:接收命令或远程请求,操作镜像或容器
客户端:发送命令或者请求到Docker服务端
Docker架构
二、Docker常用命令
1. 镜像操作
1.1 镜像名
如图,代表mysql 8.028版本的镜像
1.2 镜像操作
拉取镜像
例:拉取最新版本的nginx镜像
docker pull nginx
查看镜像
docker images
保存镜像到磁盘
语法格式:
docker save -o [保存的目标文件名称] [镜像名称]
例:
docker save -o /usr/local/nginx.tar nginx
删除镜像
docker rmi nginx
加载镜像
docker load -i /usr/local/nginx.tar
2. 容器操作
容器保护三个状态:
-
运行:进程正常运行
-
暂停:进程暂停,CPU不再运行,并不释放内存
-
停止:进程终止,回收进程占用的内存、CPU等资源
其中:
-
docker run:创建并运行一个容器,处于运行状态
-
docker pause:让一个运行的容器暂停
-
docker unpause:让一个容器从暂停状态恢复运行
-
docker stop:停止一个运行的容器
-
docker start:让一个停止的容器再次运行
-
docker rm:删除一个容器
例:创建nginx容器
docker run --name mynginx -p 80:80 -d nginx
命令解读:
-
docker run :创建并运行一个容器
-
--name : 给容器起一个名字,比如叫做mynginx
-
-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-
-d:容器启动后在后台运行
-
nginx:镜像名称
查看启动的容器
docker ps # 查看所有运行的容器 docker ps -a # 查看所有容器包含关闭的
查看日志
docker logs -f mynginx
加 -f 参数可以持续查看日志,不加 -f 只能查看打开时的日志。
停止容器
docker stop mynginx
启动容器
docker start mynginx
进入容器内部
docker exec -it mynginx bash
命令解读:
-
docker exec :进入容器内部,执行一个命令
-
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
-
mynginx :要进入的容器的名称
-
bash:进入容器后执行的命令,bash是一个linux终端交互命令
3. 数据卷
作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
3.1 操作命令
基本语法
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
-
create 创建一个volume
-
inspect 显示一个或多个volume的信息
-
ls 列出所有的volume
-
prune 删除未使用的volume
-
例:创建数据卷html
docker volume create html
查看数据卷的详细信息
docker volume inspect html
可以看出数据卷挂载在宿主机的哪个目录
挂载数据卷
创建容器时,可以通过 -v 将数据卷挂载到容器内的目录
-
-v volume名称:容器内目录
-
-v 宿主机文件:容器内文
-
docker run --name mynginx -v html:/root/html p 80:80 -d nginx
-v html:/root/html 代表将 html 数据卷挂载到容器内的 /root/html 中
挂载后通过修改本机目录中的文件实现修改容器内相应目录的文件
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
- 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
- 直接挂载模式:宿主机目录 ---> 容器内目录(不建议,可能会出现错误)
1. DockerFile介绍
Dockerfile是一个文本格式的配置文件,可以使用Dockerfile快速创建自定义的镜像。2. 自定义镜像
第一步:编写DockerFile
#基础镜像 FROM centos #维护者 MAINTAINER author #启动容器运行命令 CMD echo "hello Dockerfile"
第二步:构建镜像
docker build -t 镜像名:版本 .
注意末尾有个 " . " 代表在当前目录寻找DockerFile
3. DockerFile的指令
3.1 FROM
指定基础镜像,且必须是第一个命令。
格式:
FROM <image> FROM <image>:<tag>
3.2 MAINTAINER
表示作者信息
格式:
MAINTAINER <name>
3.3 WORKER
工作目录,相当于Linux命令中的 " cd "
例:
WORKDIR /usr/workdir
注意
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
3.4 RUN
构建镜像时,执行的指令
格式:
# 1. shell执行 RUN <command> # 2. exec执行 RUN ["executable", "param1", "param2"]
3.5 ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
宿主机不支持绝对路径 ,只能用相对路径 ,容器支持绝对路径
格式:
ADD <src>... <dest>
例:添加所有以"hom"开头的文件
ADD hom* /mydir/
例:? 替代一个单字符,例如:"home.txt"
ADD hom?.txt /mydir/
3.6 COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
格式:
COPY <源路径> <目标路径>
3.7 CMD
构建容器后调用,也就是在容器启动时才进行调用。
指定这个容器启动的时候要运行的命令只有最后一个会生效,可被替换。
格式:
1. shell格式:CMD <命令> 2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]
3.8 ENTRYPOINT
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。 指定容器启动的要运行的命令,可以追加命令
格式:
1.ENTRYPOINT ["executable", "param1", "param2"] 2.ENTRYPOINT command param1 param2 (shell内部令)
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile 中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
3.9 ENV
设置环境变量
格式:
ENV <key>=<value>
3.10 EXPOSE
指定暴露的端口号,用于与外界交互
格式:
EXPOSE 80
3.11
VOLUME ["/path/to/dir"]
注意
Dockerfile 中使用 VOLUME
指令只是一种提示,实际的挂载工作是在运行容器时通过命令行参数或者 Docker Compose 文件来完成的。
3.12 USER
USER 指令用于将会用以什么样的用户去运行
格式:
USER user USER user:group
3.13
格式:
ONBUILD [INSTRUCTION]
四、Docker 网络管理
1. Docker0 网络
安装Docker后,会为Docker分配一个docker0网卡,每启动一个容器,Docker就会为容器分配一个ip。
1.1 evth-path 技术
evth-pair 就是一对的虚拟设备接口,它们都是成对出现,一段彼此连接。 正是因为这个特性,evth-parit桥梁。连接各种各样网络设备。上图的例子中:Tomcat01容器以146为key,147为value,而Docker0以147为key,146为value,形成桥接
总结:
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
--link <name or id>:alias
例:
docker run --name t2 -d -p 8082:8080 --link t1 mytomcat:v1
3. 四种网络模式
3.1 host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
3.2 container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
3.3 none模式
这种网络模式下容器只有io回环网络,没有其他网卡。
none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
3.4 bridge模式
通过 Docker Daemon 创建一个虚拟的网桥,容器连接到这个网桥。这样的容器可以相互通信,也可以与主机通信。
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。
4. 自定义网络
4.1 基础命令
docker network --help
-
docker network connect 将容器连接到网络
-
docker network create 创建一个网络
-
docker network disconnect 断开容器的网络
-
docker network inspect 显示一个或多个网络的详细信息
-
docker network ls 列出网络
-
docker network prune 删除所有未使用的网络
-
docker network rm 删除一个或多个网络
4.2 创建局域网
语法:
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
-
bridge 网络模式桥连接
-
--subnet=192.168.200.0/24命令指定该网络模式网段范围,其中24代表该网段前24位相同,后8位不同,即该网段范围为:192.168.200.1~192.168.200.254,若该命令改为--subnet=192.168.200.0/16,即该网段范围为: 192.168.0.1-192.168.255.254,这个范围就变的很大了。
-
--gateway 路由
-
4.3 容器连接新网络
语法
docker network connect 网络名 容器名
4.4 查看容器网络情况
语法
docker network inspect 网络名
4.5 指定网络模式
docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式
语法
-
host模式:使用 --net=host 指定。
-
none模式:使用 --net=none 指定。
-
bridge模式:使用 --net=bridge 指定,默认设置。
-
container模式:使用 --net=container:NAME_or_ID 指定
4.6 启动容器时加入网络
docker run 创建Docker 容器时,可以用--network加入指定网络。
例
docker run --name t3 -p 8083:8080 -d --network mynet mytomcat:v1
五、Docker-compose
1. 介绍
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。
它使用 YAML 文件来配置应用程序的服务、网络和卷,可以通过一个命令 (docker-compose up
) 启动整个应用栈。Docker Compose 的主要目的是简化容器化应用的部署和管理。
2. docker-compose.yml结构
-
services主要用来定义各个容器。
-
networks定义需要使用到的network.
-
volumes定义services使用到的volume.
服务(service)定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数给docker container create一样。
同样,网络和卷的定义类似于给 docker network create 和 docker volume create传递参数。
version: '3' # Compose 文件的版本 services: # 定义各个服务 web: # 服务名称 image: nginx:latest # 使用的镜像 ports: - "8080:80" # 端口映射 volumes: - ./html:/usr/share/nginx/html # 卷映射 networks: - my_network # 定义使用的网络 database: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example_password volumes: - db_data:/var/lib/mysql networks: - my_network networks: # 定义网络 my_network: driver: bridge volumes: # 定义卷 db_data:
上述 docker-compose.yml
文件的主要结构和组成部分如下:
-
版本 (
version
): 指定 Docker Compose 文件的版本。不同版本支持不同的特性和语法。在上面的例子中,使用的是版本 3。 -
服务 (
services
): 定义了各个服务,每个服务包含了它的配置信息。在上面的例子中,有两个服务,分别是web
和database
。-
镜像 (
image
): 指定服务使用的 Docker 镜像。 -
端口映射 (
ports
): 定义容器端口与主机端口之间的映射关系。 -
卷映射 (
volumes
): 定义容器内部路径与主机路径之间的映射关系。 -
环境变量 (
environment
): 设置容器的环境变量。 -
网络 (
networks
): 指定服务连接到哪个网络。
-
-
网络 (
networks
): 定义了使用的网络,包括网络名称和驱动类型。 -
卷 (
volumes
): 定义了使用的卷,例如数据库数据卷。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)