Docker 系统架构
- Docker Daemon docker 系统之间通信
- Image 用于创建docker 容器的模板,就像oop中的类
- Container 镜像运行的实体。一个类可以创建多个实体,实体之间是隔离的(sandbox)
- Respository 共用仓库,可以是外网共享的,也可以是私有的
- Tag 区分镜像的一种标识,<respository>:<tag>,同一仓库具有不同标签
- 镜像中心 Registry 镜像仓库
docker 基本操作图解
Linux 安装
1、安装 yum-utils 工具
1 | yum install -y yum-utils |
2、设置镜像
1 | yum-config-manager --add-repo |
2、安装
1 | yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
4、启动docker
1 | systemctl start docker |
5、设置自启动
1 | systemctl anable docker |
ubuntu 下
1 | # service 命令的用法 |
docker 卸载
卸载
1
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
删除
1
2rm -rf /var/lib/docker
rm -rf /var/lib/containerd
镜像仓库:
- Docker Official Image:. docker 官方维护的 镜像仓库
- Verified Publisher: 官方审核过的镜像仓库,一般是大型公司
- Sponsored docker公司赞助的镜像仓库,一般为个人,组织,团队开发
- 无认证仓库
命令解析
查看帮助 docker pull –help
- docker pull
拉取镜像, -a 拉取全部版本,
- docker images
查看本地镜像
- docker search
搜索查看镜像
- docker rmi nginx
移除镜像
- docker ps -a
查找所有运行的容器
-n 最新启动的几个
-l 最后几个
-q 只输出容器ID
- docker save -o myoutput.tar nginx
-o 指定输出路径
导出镜像 nginx 为 当前目录 myoutput.tar
- docker load -i myoutput.tar
-i 指定导入的文件
将导出的镜像导入/恢复
- docker logs nginx
–since,-f “2022-12-12” 时间筛选,自从
–util, -t 直到 xxx 时间
–tail,-n 3 只输出三条
显示运行中容器日志
- docker cp
复制容器中文件到指定位置,不支持容器间文件传递
1 docker cp nginx:/root/xxx.txt ./
- docker rm xxx
-f 强制删除
删除容器
docker run
-i 指定为交互状态
-t 指定伪客户端
-p 端口映射 宿主机port: 容器应用port, -P 表示自动分配映射端口
-d 指定后台运行(守护进程方式运行)
–name 指定运行容器的名字,默认是镜像的名字
docker exec -it nginx /bin/bash
运行一个命令在一个容器里面,exit 退出,容器还在运行
-it
-w 指定工作目录,进入容器后进入这个目录
1 | // 在容器 nginx 中执行命令 nginx -v |
- docker attach
与 docker exec 功能一样,但是 exit 退出时,容器也退出了。
但是此命令对tomcat无效,进不去。原因在于tomcat的dockerFile CMD 命令
容器内进程查看,命令可携带ps命令的选项
1 docker top nginx
- docker start/restart/stop/kill/
容器的启停
1
2 // 关闭所有容器
docker kill (docker ps -qa)
- docker commit
-a 作者
-c 增加指令
-m 备注
-p 提交时暂停容器执行
创建一个新的镜像, 不写标签 centos:net-tools,会生成玄虚镜像
1 docker commit -a "zs <zs@qq.com>" -m "add net-tools" mycentos centos:net-tools
- docker image prune
删除玄虚镜像
- docker inspect 名字/id
查看镜像详情
- docker export
-o 指定输出路径
导出容器 快照,体积会小一点,镜像分层只包含原容器生成的一层信息
1 docker export -o mynginx.tar导入容器
1 docker import mynginx.tar nginx:myNginx
- docker history 镜像id
查看镜像分层
- docker pause/unpause nginx
暂停容器对外提供服务,容器本身并没有暂停
- docker create
创建容器不运行, 命令参数与 docker run 基本一致,没有-d
- docker system
- df 查看磁盘信息
- events 获取实时的服务信息
- info 显示系统信息
- prune 移除不使用的数据
21、docker tag
更新镜像标签,其实就是将镜像复制了一份,然后重命名
1 docker tag nginx nginx:2.0
镜像分层
为啥镜像是分层的?
可以在不同镜像间实现资源共享,不同版本镜像可以复用镜像层
容器运行的本质
就是运行其中中的应用,让应用对外提供服务,应用结束了,容器就自动停止了
以交互方式运行 Ubuntu 容器
1 | // -i 指定交互状态 -t 指定为客户端 运行ubuntu 的/bin/bash |
1 | // cmd 命名 不结束进程退出继续编辑 |
使用 Dockerfile 构建新的镜像
用于构建Docker镜像的脚本文件,由一系列指令构成。指令由上到下执行
1 | // -t 指定名字, . 表示从当前文件目录查找 dockerFile 文件 |
Dockerfile
1 | FROM nginx |
构建新镜像的而方式
- docker build
- docker import
- docker commit
- docker compose
- docker hub 中的 autoBuild
scratch 镜像 它是一个特殊镜像,是空镜像,只能在DockerFile 中被继承,不能拉取,不能run,也没有tag。它是所有镜像的基础镜像
ADD
语法 ADD[“src”, “dest”], ADD src dest
src 可以是指定文件也可以是URL,最好不要使目录,会将其全部拷贝到目标。dest是一个绝对路径,其后面路径必须要加上斜杆,否则最后的目录是当作文件名
COPY
功能与ADD指令相同,只不过src不能是URL。若src 是压缩文件,复制到容器不会自动解压
ARG
ARG<key = value> 定义一个变量,该变量会使用镜像构建运行时。定义多个使用多次。
build 时 使用命令 –build name=123 动态设置key的值,name必须是设置过的
ONBUILD
子镜像构建时运行的命令
EXPOSE
暴露端口 如:8080,但实际上运行时还是通过 -p 指定,这个只是给人看的注释一样的东西
RUN
RUN <command> command 指shell 命令,RUN [“EXECUTABLE”,”PARAM1”,”PARAM2”] docker build 过程中会使用shell运行指定的 command
CMD
CMD [“EXECUTABLE”, “PARAM1”, “PARAM2”…] docker run 后会立即执行 EXECUTABLE,并使用后面第二三参数作为程序运行参数
CMD command param1 param2…
CMD [“params1”, “params2”] 这种方式是把内容作为 ENTRYPOINT 参数出现的
ENTRYPOINT
ENTRYPOINT [“EXECUTABLE”, “PAARAM1”, “PAARAM2”…]
ENTRYPOINT command param1 param2…
总结
Dockerfile 中 [command] / [“EXCUTABLE”] 如果是通过CMD指定的,则该镜像启动命令 docker run 中是不能添加参数【ARG】的。因为Dockerfile 中的CMD是可以被命令中的[COMMAND]代替的,如果命令中的 IMAGE 后仍然有内容,此时对于docker daemon 来说其首先认为是代替的[command] ,如果有两个以上的内容,后面才会认为[ARG] 所以,添加的-y会报错,因为没有-y 这样的 [command]
ENTRYPOINT 指定的命令是不会被覆盖的,镜像后i面的参数一定会被当作是 参数然后拼接运行
发布一个java应用
Dockerfile
1 | # 选择父级镜像 jdk8 |
构建镜像
1 | docker build -t hello-docker:1.0 . |
启动
1 | # 后台运行容器 hd 使用镜像 hello-docker:1.0 将容器中的 8080端口映射到宿主机9002 |
build cache 机制
Docker Daemnon 通过 Dockerfile 构建镜像时,当发现即将新构建出的镜像(层)与本地已存在的某镜像(层)重复时,默认会复用已存在镜像(层)而不是重新构建新的镜像(层),这种机制称为 docker build cache 机制。该机制不仅加快了镜像的构建过程,同时也大量节省了Docker 宿主机的空间。
docker build cache 并不是占用内存的 cache,而是一种对磁盘中相应镜像层的检索、复用机制。所以,无论是关闭 Docker 引擎,还是重启 Docker 宿主机,只要该镜像(层)存在于本地,那么就会复用。
cache机制失效
- DockerFile 文件中某个指令内容发生变化时,其后面的所有指令层缓存都失效
- ADD/COPY 指令内容变化
- RUN指令外部依赖发生变化,如外部安装的镜像版本不一样了
- 指定了不使用 build chache –no-cache
数据持久化
为防止容器被删除或丢失导致修改的数据的丢失。
- 定制镜像持久化:将修改过的容器生成新的镜像,只读镜像
- 数据卷持久化:将这些修改通过数据卷同步到宿主机
- 数据卷
- Bind mounts 绑定挂载
- tmpfs 临时文件系统
数据卷:
宿主机中的一个特殊的文件/目录,这个文件/目录与容器中的另一个文件/目录进行了直接关联,在任何一端文件/目录的写操作,在另一端都会同时发生相应变化。在宿主中的这个文件/目录就称为数据卷,而容器中的这个关联文件/目录则称为该数据卷在该容器中的挂载点
1 | docker run -it -v/宿主机目录绝对路径:/容器目录绝对路径 镜像 |
【注意】无论是宿主机中的数据卷还是容器中的挂载点,如果指定的目录不存在,那么docker 引擎会自动创建,即使是多级目录
文件夹挂载
- 允许不存在的文件夹或者存在的空文件夹挂载进container, container中对应的文件夹将被清空
- 非空文件夹挂载进container将会覆盖container中原有文件夹
文件挂载
- 禁止将不存在的文件挂载进container中已经存在的文件上
- 存在的文件挂载进container中将会覆盖container中对应的文件, 若文件不存在则新建
nginx 挂载卷 示例
1 | 1、测试环境 |
Nginx 映射地址
通过下面命令进入容器查看
1
2
3
4
5
#启动容器
docker run -itd nginx ``/bin/bash
#进入容器
docker attach xxxxxxxxxx
说明 | 文件 | 挂载路径 | nginx路径 |
---|---|---|---|
配置文件√ | nginx.conf | /data/nginx/conf/nginx.conf | /etc/nginx/nginx.conf |
配置文件文件夹 | conf.d文件夹 | /data/nginx/conf.d | /etc/nginx/conf.d |
首页文件夹html路径√ | html文件夹 | /data/nginx/html | /usr/share/nginx/html |
日志文件√ | log文件夹 | /data/nginx/logs | /var/log/nginx |
数据卷容器
多个容器共享数据卷的一种方案。
将一个数据卷在多个容器中设置挂载点
1
2
3 # --volumes-from 容器名, 设置新的容器与与这个容器共享数据卷
# 此时 容器 nginx1 就是数据卷容器
docker run -itp 8080:80 --name nginx2 --volumes-from nginx1 nginx
Dockerfile 设置持久化
VOLUME 指令可以在容器中创建挂载点
1
2
3
4 # 设置挂载点
VOLUME /etc/nginx/nginx.conf /logs/nginx
# 查看自动分配的挂载卷 Mounts
docker docker inspect 名字/id
docker 网络
docker 网络底层原理是 Linux 的Network Namespace。
Network Namespace 是 Linux 内核提供的用于实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,每个独立的网络空间内的防火墙、网卡、路由表、邻居表、协议栈都是独立的。不管是虚拟机还是容器,当运行在独立的命名空问时,就像是一台单独的主机一样。
1 | 创建命名空间 |
CNM
CNM,Container Network Model,容器网络模型,其是一种网络连接的解决方案,是一种设计规范、设计标准,其规定了 Docker 网络的基础组成要素。·
- CNM 中定义了三个基本要素: 沙盒 Sandbox,终端 Endpoint 与网络 Network。
- 沙盒:一个独立的网络栈,其中包括以太网接口、端口号、路由表、DNS 配置等。LinuxNetwork Namespace 是沙盒的标准实现。
- 终端:虚拟网络接口,主要负责创建连接,即将沙盒连接到网络上。一个终端只能接入某一个网络。“
- 网络:802.1d 网桥的软件实现,是需要交瓦的终端的集合。
docker 网桥工作原理
在 Linux 主机上,Docker 的 bridge 网络由 Bridge 驱动创建,其在创建时会创建一个默认的网桥 docker0。容器与网桥间是通过 veth pair 技术实现的连接,网桥与外网间是通过“网络地址转换 NAT 技术”实现的连接,即将通信的数据包中的内网地址转换为外网地址。
Bridge 驱动的底层是基于 Linux 内核的 Linux Bridge 技术。该技术已经经历了近 20 年的考验,这就意味着该模式是高性能且非常稳定的。
linux 安装 网桥工具包
1 | yum install bridge-utils |
1 | 创建容器 默认连接网桥 docker0 |
Bridge 网络
也称为单机桥接网络,是Docker 默认的网络模式,该网络模式只存在于单个Docker主机上,其只能用于连接所在Docker主机上的容器
创建并连接到指定网络
1 | 创建 bridge2 网络 |
none 网络
没有网络。容器仍然有命名空间,但是没有网络没有ip,网关等属性
host网络
创建容器网络为host网络模型,没有独立的namespace。没有独立的网络接口与ip,全部与宿主机共享。加入网络的容器无需暴露端口,其端口就直接在宿主机的 namespace 上
1 docker run -d --name bb6 --network host busybox /bin/bash
docker 安装mysql
1 | 测试安装 |
解决乱码问题
新增 /root/mysql/conf/my.cnf
1 | [client] |
重启查看
1 | 进入MySQL容器中查看 |
方式2:
SET NAMES utf8,此命令相当于
1
2
3 SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';
mysql 集群,读写分离
master
1 | docker run --name mysql_master \ |
修改 /root/mysql/conf/my.cnf
1 | [client] |
给master 创建用户,设置权限
1 | # 创建用户 |
slave
1 | docker run --name mysql_slave \ |
修改
1 | [client] |
设置启动
1 | # |
docker compose
容器编排外部工具,解决需要启动大量的容器管理的问题。
compose.yml 默认文件,包含6个顶级属性,version,services,networks,volumes,configs,secrets
下载docker compose:
1 | sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose |
授予权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
测试
1 | docker-compose --version |
comppose.yml
1 | service: |
检查配置文件
1 | docker-compose config -q |
启动
1 | docker-compose -f compose.yml up -d |
1 | services: |
图形化界面系统
- Docker UI 平台
- Portainer管理平台
- Shipyard管理平台
- CIG 系统 (docker status)
发布镜像到公网
1、官网注册
2、CMD 登录,登出
1 | docker login |
3、推送本地镜像,登录后才能操作
1 | 会推送 镜像 hello-world:1.0 到账户仓库 donglinge(没有就创建) |
4、国内一般把镜像上传到阿里云
略。。。
distribution镜像中心搭建
搭建私有镜像中心
拓展文章
-
演示如何架设 WordPress 网站。
- 方法 A:自建 WordPress 容器
- 方法 B:采用官方的 WordPress 容器
- 方法 C:采用 Docker Compose 工具
docker-compose 搭建wordpress配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
web:
image: wordpress
links:
- mysql
environment:
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=123456
ports:
- "8080:80"
working_dir: /var/www/html
volumes:
- wordpress:/var/www/html
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/docker/基础/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!