什么是docker?
“Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布镜像到可执行的机器上。”
docker三要素
- 镜像:镜像是一个可读的模板,可以用来创建docker容器,一个镜像可以创建多个容器。
- 容器:docker利用容器独立运行一个或一组应用,应用程序或服务运行在容器里面,容器就类似一个虚拟化的运行环境,容器是用镜像创建的运行实例。
- 仓库:就是集中存放镜像的场所,类似于git仓库,仓库分为公开和私有。
docker架构图解
docker常用命令
- docker info
- docker --help
- docker run --help
- docker run xxx镜像 启动容器
- docker ps 查看容器运行状态
- docker stop 停止容器
- docker restart 重启容器
- docker exec 重新进入容器
- docker commit 从容器创建镜像
- docker network ls 查看网络
- docker network create 网络名称 创建网络
- docker network rm 网络id 删除网络
- docker images 查看镜像
- docker search xxx镜像名称 搜索镜像
- docker pull xx镜像名称 拉去镜像
- docker system df 查看镜像/容器/数据卷所占空间
- docker rmi xxx镜像名称 删除镜像
- docker tag 镜像:版本 新名称:版本 给镜像打标签
- docker push 镜像名称:版本 推送镜像到仓库
镜像
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS(联合文件系统)。
镜像是可以继承的
镜像加载过程
在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等等。
之后会加载其他分层文件。
镜像层加载完成后,会在最上层加载一个容器层,后续我们的操作都在容器层。
删除容器时,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…
容器操作
-
启动容器:docker run -it --name localPhp -v /local/path:/container/path php74 /bin/bash
-
docker 常用参数
--name 容器新名称
-d 后台运行容器并返回容器id,即启动守护模式容器(后台运行)
-i 以交互式运行容器,通常和-t同时使用
-t 为容器分配一个伪输入终端,通常和-i同时使用
-P 随机端口
-p 指定端口
--network 指定网络名称
-v 设置容器数据卷,将本地目录映射到容器目录
--privileged=true container内的root拥有真正的root权限
-u 指定用户 -
退出容器:
a. exit run进容器,exit退出,容器停止
b. ctrl + p + q run进容器,ctrl + p + q,容器不停止
-
启动已停止运行的容器 docker start 容器id或容器名称
-
重启容器 docker restart 容器id或容器名称
-
停止容器 docker stop 容器id或容器名称
-
强制停止 docker kill 容器id或容器名称
-
删除已停止 docker rm 容器id,未停止需要 -f 参数,删除所有容器,docker rm -f $(docker ps -a -q)
-
查看容器日志 docker logs 容器id
-
查看容器运行状态 docker top 容器id
-
查看容器内部细节 docker inspect 容器id
-
进入正在运行的容器并以命令行交互
-
docker exec -it 容器id bashshell
-
docker attach 容器id 区别:
attach直接进入容器启动的终端,不会启动新进程,exit退出,会导致容器停止。
exec 是在容器中打开新的终端,并且可以启动新的进程,exit退出不会导致容器停止。
-
文件拷贝
a. docker cp 容器id:容器内路径 目的主机路径
b. docker cp 当前主机路径 容器id:容器内路径
-
容器导入导出
export 导出容器内容作为一个tar包归档,docker export 容器id > 文件名称.tar
import 从tar包中的内容创建一个新的文件系统再导入为镜像,docker 文件名称.tar | docker import - 镜像用户/镜像名:镜像版本号
Docker网络
docker安装后会自动创建3种网络:bridge、host、none
- bridge模式
Docker默认网络模式是bridge模式, docker0网桥是在docker 启动时自动创建的,之后创建的docker容器都会在docker0自网范围内选取一个未占用的ip并连接到docker0网桥上,docker0以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。
虚拟网络接口对 veth pair: zhuanlan.zhihu.com/p/293659939
- host模式
host模式可以让容器共享宿主机网络,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。此种模式目前只在linux环境下支持,测试mac下无法访问。
- none模式
none模式是指禁用网络功能。
- 共享其他容器模式
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 通信, 意思就是给两个需要互相通信的容器添加同一网络
通过配置文件dockerfile创建镜像
docker build -f ./Dockerfile -t penglin/php74nginx:0.0.1 ./
dockerfile常命令
- 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
- 如果有多个CMD,只有最后一个运行
- 如果有多个Entrypoint,只有最后一个运行
- 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数
服务编排docker-compose
docker compose是一个命令行工具,是用于定义和运行多容器Docker应用程序的工具;通过Compose,开发者可以使用YML文件来配置应用程序需要的所有服务。