DOCKER基础

120 阅读6分钟

什么是docker?

“Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布镜像到可执行的机器上。”

1.png

docker三要素

  1. 镜像:镜像是一个可读的模板,可以用来创建docker容器,一个镜像可以创建多个容器。
  2. 容器:docker利用容器独立运行一个或一组应用,应用程序或服务运行在容器里面,容器就类似一个虚拟化的运行环境,容器是用镜像创建的运行实例。
  3. 仓库:就是集中存放镜像的场所,类似于git仓库,仓库分为公开和私有。

docker架构图解

2.png

docker常用命令

  1. docker info
  2. docker --help
  3. docker run --help
  4. docker run xxx镜像 启动容器
  5. docker ps 查看容器运行状态
  6. docker stop 停止容器
  7. docker restart 重启容器
  8. docker exec 重新进入容器
  9. docker commit 从容器创建镜像
  10. docker network ls 查看网络
  11. docker network create 网络名称 创建网络
  12. docker network rm 网络id 删除网络
  13. docker images 查看镜像
  14. docker search xxx镜像名称 搜索镜像
  15. docker pull xx镜像名称 拉去镜像
  16. docker system df 查看镜像/容器/数据卷所占空间
  17. docker rmi xxx镜像名称 删除镜像
  18. docker tag 镜像:版本 新名称:版本 给镜像打标签
  19. docker push 镜像名称:版本 推送镜像到仓库

镜像

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS(联合文件系统)。

3.png

镜像是可以继承的

4.png

5.png

镜像加载过程

在Docker镜像的最底层是bootfs,bootfs(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加载kernel。

Linux刚启动时会加bootfs文件系统,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。

当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸bootfs,开始运行rootfs(root file system)。

rootfs(root file system)在 bootfs之上。包含的就是典型 Linux系统中的 /dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如 Ubuntu,Centos等等。

之后会加载其他分层文件。

镜像层加载完成后,会在最上层加载一个容器层,后续我们的操作都在容器层。

6.png

删除容器时,Docker 守护进程会删除容器层,保留镜像层

1 获取一个镜像

    a. docker search nginx

    b. docker pull nginx

    c. 查看本地可用镜像 docker images

    d. 删除镜像 docker rmi nginx, 如果容器未停止 需要加 -f 参数强制删除

2 创建一个自己的镜像

    a. 启动一个容器 docker run -it --privileged=true -u root centos /bin/sh

    b. 安装 yum install vim

    c. 提交当前修改到镜像 docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag]

    d. 可以通过docker push 镜像id 推送到仓库

    e. 安装错误处理cloud.tencent.com/developer/a…

容器操作

  1. 启动容器:docker run -it --name localPhp -v /local/path:/container/path php74 /bin/bash

  2. docker 常用参数

    --name 容器新名称

    -d 后台运行容器并返回容器id,即启动守护模式容器(后台运行)

    -i 以交互式运行容器,通常和-t同时使用

    -t 为容器分配一个伪输入终端,通常和-i同时使用

    -P 随机端口

    -p 指定端口

    --network 指定网络名称

    -v 设置容器数据卷,将本地目录映射到容器目录

    --privileged=true container内的root拥有真正的root权限
    -u 指定用户

  3. 退出容器:

    a. exit run进容器,exit退出,容器停止

    b. ctrl + p + q run进容器,ctrl + p + q,容器不停止

  4. 启动已停止运行的容器 docker start 容器id或容器名称

  5. 重启容器 docker restart 容器id或容器名称

  6. 停止容器 docker stop 容器id或容器名称

  7. 强制停止 docker kill 容器id或容器名称

  8. 删除已停止 docker rm 容器id,未停止需要 -f 参数,删除所有容器,docker rm -f $(docker ps -a -q)

  9. 查看容器日志 docker logs 容器id

  10. 查看容器运行状态 docker top 容器id

  11. 查看容器内部细节 docker inspect 容器id

  12. 进入正在运行的容器并以命令行交互

  13. docker exec -it 容器id bashshell

  14. docker attach 容器id 区别:

    attach直接进入容器启动的终端,不会启动新进程,exit退出,会导致容器停止。

    exec 是在容器中打开新的终端,并且可以启动新的进程,exit退出不会导致容器停止。

  15. 文件拷贝

    a. docker cp 容器id:容器内路径 目的主机路径

    b. docker cp 当前主机路径 容器id:容器内路径

  16. 容器导入导出

    export 导出容器内容作为一个tar包归档,docker export 容器id > 文件名称.tar

    import 从tar包中的内容创建一个新的文件系统再导入为镜像,docker 文件名称.tar | docker import - 镜像用户/镜像名:镜像版本号

Docker网络

docker安装后会自动创建3种网络:bridge、host、none

  1. bridge模式

7.png

Docker默认网络模式是bridge模式, docker0网桥是在docker 启动时自动创建的,之后创建的docker容器都会在docker0自网范围内选取一个未占用的ip并连接到docker0网桥上,docker0以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。

虚拟网络接口对 veth pair: zhuanlan.zhihu.com/p/293659939

  1. host模式

host模式可以让容器共享宿主机网络,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。此种模式目前只在linux环境下支持,测试mac下无法访问。

  1. none模式

none模式是指禁用网络功能。

  1. 共享其他容器模式

container模式,使用--net=container:NAME_or_ID指定

Docker自定义网络

此种模式下,容器与容器之间可以通信。

创建自定义网络

支持自定义网段、网关等 默认bridge

--subnet 网段

--gateway 网关

docker network create -d bridge test_network1

docker network create -d bridge --subnet 172.77.0.0/24 --gateway 172.77.0.1 test_network2

docker network inspect test_network2

同网段可以直接通信

不同网段可以通过 docker network connect test_network2 centos1 通信, 意思就是给两个需要互相通信的容器添加同一网络

8.png

通过配置文件dockerfile创建镜像

docker build -f ./Dockerfile -t penglin/php74nginx:0.0.1 ./

9.png

dockerfile常命令

10.png

11.png

  • 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
  • 如果有多个CMD,只有最后一个运行
  • 如果有多个Entrypoint,只有最后一个运行
  • 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数

12.png

服务编排docker-compose

docker compose是一个命令行工具,是用于定义和运行多容器Docker应用程序的工具;通过Compose,开发者可以使用YML文件来配置应用程序需要的所有服务。

13.png