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 容器,一个镜像可以创建很多容器。
  • 容器
    • Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

    • 它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

    • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

    • 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

  • 仓库
    • 仓库(Repository)是集中存放镜像文件的场所。

    • 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

    • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

Docker结构

服务端:接收命令或远程请求,操作镜像或容器

客户端:发送命令或者请求到Docker服务端

Docker架构

二、Docker常用命令

1. 镜像操作

1.1 镜像名

  • 镜名称一般分两部分组成:[repository]:[tag]。

  • 在没有指定tag时,默认是latest,即最新版本的镜像

 如图,代表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. 数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

 

 一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

3.1 操作命令

基本语法

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume

  • inspect 显示一个或多个volume的信息

  • ls 列出所有的volume

  • prune 删除未使用的volume

  • rm 删除一个或多个指定的volume

例:创建数据卷html

docker volume create html

查看数据卷的详细信息

docker volume inspect html

可以看出数据卷挂载在宿主机的哪个目录

挂载数据卷

创建容器时,可以通过 -v 将数据卷挂载到容器内的目录

docker run的命令中通过 -v 参数挂载文件或目录到容器中:

  • -v volume名称:容器内目录

  • -v 宿主机文件:容器内文

  • -v 宿主机目录:容器内目录

docker run --name mynginx -v html:/root/html p 80:80 -d nginx

-v html:/root/html 代表将 html 数据卷挂载到容器内的 /root/html 中

挂载后通过修改本机目录中的文件实现修改容器内相应目录的文件

 

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

- 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
- 直接挂载模式:宿主机目录 ---> 容器内目录(不建议,可能会出现错误)

三、DockerFile 自定义镜像

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"]

注意:

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。

如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

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", …]

注意

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

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

用于指定哪些目录挂载为卷

格式:

VOLUME ["/path/to/dir"]

注意

Dockerfile 中使用 VOLUME 指令只是一种提示,实际的挂载工作是在运行容器时通过命令行参数或者 Docker Compose 文件来完成的。

3.12 USER

USER 指令用于将会用以什么样的用户去运行

格式:

USER user
USER user:group

注意

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、 ENTRYPOINT都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过-u参数来覆盖所指定的用户。

3.13 ONBUILD

帮助别人定制而准备的

格式:

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网桥是每个容器的默认网关。 docker0 docker中所有网络接口都是虚拟的。 虚拟转发效率高。只要容器删除,对应的网桥就没有了。

2. 容器互联

容器之间可以根据容器名互联(自定义网络)

语法格式:

--link <name or id>:alias
参数:
  • name和id是源容器的name和id,alias是源容器在link下的别名。

例:

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 路由

  • mynet 自定义网络名字

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结构

docker-compose.yml文件分为三个主要部分:services、networks、volumes

  • services主要用来定义各个容器。

  • networks定义需要使用到的network.

  • volumes定义services使用到的volume.

服务(service)定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数给docker container create一样。

同样,网络和卷的定义类似于给 docker network create 和 docker volume create传递参数。

正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,不需要在docker-compose.yml中再次指定它们。

示例文件:

复制代码
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): 定义了各个服务,每个服务包含了它的配置信息。在上面的例子中,有两个服务,分别是 webdatabase

    • 镜像 (image): 指定服务使用的 Docker 镜像。

    • 端口映射 (ports): 定义容器端口与主机端口之间的映射关系。

    • 卷映射 (volumes): 定义容器内部路径与主机路径之间的映射关系。

    • 环境变量 (environment): 设置容器的环境变量。

    • 网络 (networks): 指定服务连接到哪个网络。

  • 网络 (networks): 定义了使用的网络,包括网络名称和驱动类型。

  • 卷 (volumes): 定义了使用的卷,例如数据库数据卷。

posted @   ygdgg  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示