首页
关于
留言
接口
搜索
首页
登录
登录
搜索
KAKA 梦很美
累计撰写
47
篇文章
累计收到
0
条评论
首页
栏目
首页
登录
页面
首页
关于
留言
接口
Docker
2022-12-30
Dockerfile 与 Docker-Compose 的区别
先简单理解 Docker 的使用过程,它分为镜像构建与容器启动。 镜像构建 即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 Dockerfile 来完成的。 容器启动 容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。 而如果涉及多个容器的运行(如服务编排)就可以通过 docker-compose 来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。 dockerfile - 构建镜像 docker run - 启动容器 docker-compose - 启动服务 我们从头梳理下。 假如你不用 docker, 搭建个 wordpress 项目应该怎么弄? 大概是这样的: 首先应该是找台服务器, 假设其 OS 是 CentOS, 然后按照文档一步步敲命令, 写配置。 用 docker 呢?大概是这样的: 找台服务器,不管什么操作系统,只要支持 docker 就行, 执行命令 docker run centos, docker 会从官方源里拉取最新的 CentOS 镜像,可以认为你开了个 CentOS 虚拟机,然后一步步安装,跟上面一样。 但是你发现没有? 这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。 但是镜像一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。 一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。 有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。 现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。 如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 Nginx ,数据库 Mysql, 邮件服务等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。 更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。 docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume 等信息都包含在 docker-compose.yml 里。 要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compose stop/down 简而言之, Dockerfile 记录单个镜像的构建过程。 docker-compose.yml 记录一个项目(project, 一般是多个镜像)的构建过程。 有些教程用了 dockerfile + docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要了; 如果镜像是需要 build 的,那就需要提供 Dockerfile。 docker-compose 是 编排容器 的。例如, 你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等一系列的操作,相当繁琐。而用了docker-compose之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。 Dockerfile 的作用是 从无到有的构建镜像。Dockerfile - 为 docker build 命令准备的,用于建立一个独立的 image 。在 docker-compose 里也可以用来实时 build docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container, 包括他们之间的关系、用官方 image 还是自己 build、各种网络端口定义、储存空间定义等。
2022年-12月-30日
168 阅读
0 评论
Docker
2022-12-28
Docker 启动 Mysql 一直报错 lower_case_table_names
操作系统 MacOS 在安装 Docker 后无法启动 Mysql8.0, 无形中遇到一个大坑, Docker 日志一直报错 Different lower_case_table_names settings for server ('2') and data dictionary ('0') , 不管怎么修改 docker-compose.yml 文件还是 mysql 配置都无济于事, 就是无法启动, 网上很多教程都是没用的。 经过发现, 主要导致无法启动 Mysql 的原因是 Docker 应用设置/首选项里(默认)选中 使用 gRPC 进行文件共享 (Use gRPC FUSE for file sharing) [gRPC Fuse 设置导致此问题, 它与数据字典0不兼容]。 解决方法 取消选中 使用 gRPC 进行文件共享 (Use gRPC FUSE for file sharing), 然后重启容器服务就可以了。 这主要还是 Docker 需要解决的应用程序错误, 而不是 Mysql 本身。 在后续的版本中, Docker 20.10.10 应该是已经修复了该问题, 因为我发现即使开了该选项也能正常启动了。
2022年-12月-28日
178 阅读
0 评论
Docker
2022-11-13
Docker 宝典|常用命令
先感受下图, 几乎所有命令分布都在里面。 登录退出 - 镜像仓库 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub docker login [OPTIONS] [SERVER] # OPTIONS 说明 # -u: 登录的用户名 # -p: 登录的密码 # # docker login -u 用户名 -p 密码 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub docker logout 镜像相关操作 从Docker Hub查找镜像 docker search [OPTIONS] TERM # OPTIONS 说明 # --automated: 只列出 automated build类型的镜像 # --no-trunc: 显示完整的镜像描述 # -f <过滤条件>: 列出收藏数不小于指定值的镜像 # # 从 Docker Hub 查找所有镜像名包含 php, 并且收藏数大于 10 的镜像 # docker search -f stars=10 php 参数说明: NAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 OFFICIAL: 是否 docker 官方发布 STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思 AUTOMATED: 自动构建 从镜像仓库中拉取或者更新指定镜像 docker pull [OPTIONS] NAME[:TAG|@DIGEST] # OPTIONS 说明 # -a: 拉取所有 tagged 镜像 # --disable-content-trust: 忽略镜像的校验, 默认开启 # # docker pull raylin666/golang:1.17 列出本地镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] # OPTIONS 说明 # -a: 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) # --digests: 显示镜像的摘要信息 # -f: 显示满足条件的镜像 # --format: 指定返回值的模板文件 # --no-trunc: 显示完整的镜像信息 # -q: 只显示镜像ID 删除本地一个或多个镜像 docker rmi [OPTIONS] IMAGE [IMAGE...] # OPTIONS 说明 # -f: 强制删除 # --no-prune: 不移除该镜像的过程镜像,默认移除 # # 强制删除本地镜像 # docker rmi -f raylin666/php:v7.3 标记本地镜像,将其归入某一仓库 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] # 将镜像 openresty:latest 标记为 raylin666/openresty:1.19.9.1 镜像 # docker tag openresty:latest raylin666/openresty:1.19.9.1 使用 Dockerfile 创建镜像 docker build [OPTIONS] PATH | URL | - # OPTIONS 说明 # --build-arg=[]: 设置镜像创建时的变量 # --cpu-shares: 设置 cpu 使用权重 # --cpu-period: 限制 CPU CFS周期 # --cpu-quota: 限制 CPU CFS配额 # --cpuset-cpus: 指定使用的CPU ID # --cpuset-mems: 指定使用的内存 ID # --disable-content-trust: 忽略校验,默认开启 # -f: 指定要使用的 Dockerfile 路径 # --force-rm: 设置镜像过程中删除中间容器 # --isolation: 使用容器隔离技术 # --label=[]: 设置镜像使用的元数据 # -m: 设置内存最大值 # --memory-swap: 设置Swap的最大值为内存+swap,"-1"表示不限swap # --no-cache: 创建镜像的过程不使用缓存 # --pull: 尝试去更新镜像的新版本 # --quiet, -q: 安静模式,成功后只输出镜像 ID # --rm: 设置镜像成功后删除中间容器 # --shm-size: 设置 /dev/shm 的大小,默认值是 64M # --ulimit: Ulimit 配置 # --squash: 将 Dockerfile 中所有的操作压缩为一层 # --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签 # --network: 默认 default。在构建期间设置 RUN 指令的网络模式 # # 1. 使用当前目录的 Dockerfile 创建镜像,标签为 raylin666/php:7.4 # docker build -t raylin666/php:7.4 . # # 2. 使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像 # docker build github.com/creack/docker-firefox # # 3. 也可以通过 -f Dockerfile 文件的位置 # docker build -f /path/to/php/Dockerfile . 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。可以通过 docker build 构建自己的镜像再上传, 也可以通过 docker tag 标记本地镜像到某个仓库后再上传。 docker push [OPTIONS] NAME[:TAG] # OPTIONS 说明 # --disable-content-trust: 忽略镜像的校验, 默认开启 # # docker push raylin666/php:v7.4.26 查看指定镜像的创建历史 docker history [OPTIONS] IMAGE # OPTIONS 说明 # -H: 以可读的格式打印镜像大小和日期,默认为TRUE # --no-trunc: 显示完整的提交记录 # -q: 仅列出提交记录ID # # 查看本地镜像 raylin666/mysql:8.0.27 的创建历史 # docker history raylin666/mysql:8.0.27 将指定镜像保存成 tar 归档文件 docker save [OPTIONS] IMAGE [IMAGE...] # OPTIONS 说明 # -o: 输出到的文件 # # 将镜像 raylin666/php:7.4 生成 my_php74.tar 文档 # docker save -o my_php74.tar raylin666/php:7.4 导入使用 docker save 命令导出的镜像 docker load [OPTIONS] # OPTIONS 说明 # --input, -i: 指定导入的文件,代替 STDIN # --quiet, -q: 精简输出信息 # # docker load < busybox.tar.gz # docker load --input fedora.tar 将文件系统作为一个 tar 归档文件导出到 STDOUT docker export [OPTIONS] CONTAINER # OPTIONS 说明 # -o: 将输入内容写到文件 # # 将ID为 a404c6c174a2 的容器按日期保存为tar文件 # docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2 从归档文件中创建镜像 docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] # OPTIONS 说明 # -c: 应用 docker 指令创建镜像 # -m: 提交时的说明文字 # # 从镜像归档文件 my_php74.tar 创建镜像,命名为 raylin666/php:7.4 # docker import my_php74.tar raylin666/php:7.4 容器相关操作 创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # OPTIONS 说明 # -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 # -d: 后台运行容器,并返回容器ID # -i: 以交互模式运行容器,通常与 -t 同时使用 # -P: 随机端口映射,容器内部端口随机映射到主机的端口 # -p: 指定端口映射,格式为: 主机(宿主)端口:容器端口, 例如: 8080:80 # -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用 # --name="nginx": 为容器指定一个名称 # --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致 # --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致 # -h "bars": 指定容器的 hostname # -e username="raylin666": 设置环境变量 # --env-file=[]: 从指定文件读入环境变量 # --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行 # -m: 设置容器使用内存最大值 # --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 # --link=[]: 添加链接到另一个容器 # --expose=[]: 开放一个端口或一组端口 # --volume, -v: 绑定一个卷 # # 1. 使用 docker 镜像 nginx:latest 以后台模式启动一个容器, 并将容器命名为 mynginx # docker run --name mynginx -d nginx:latest # # 2. 使用镜像 nginx:latest 以后台模式启动一个容器, 并将容器的 80 端口映射到主机随机端口 # docker run -P -d nginx:latest # # 3. 使用镜像 nginx:latest,以后台模式启动一个容器, 将容器的 80 端口映射到主机的 80 端口, 主机的目录 /www/data 映射到容器的 /data # docker run -p 80:80 -v /www/data:/data -d nginx:latest # # 4. 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上 # docker run -p 127.0.0.1:80:8080/tcp ubuntu bash # # 5. 使用镜像 nginx:latest 以交互模式启动一个容器, 在容器内执行 /bin/bash 命令 # docker run -it nginx:latest /bin/bash 启动一个或多个已经被停止的容器 docker start [OPTIONS] CONTAINER [CONTAINER...] 停止一个运行中的容器 docker stop [OPTIONS] CONTAINER [CONTAINER...] 重启容器 docker restart [OPTIONS] CONTAINER [CONTAINER...] 杀掉一个运行中的容器 docker kill [OPTIONS] CONTAINER [CONTAINER...] # OPTIONS 说明 # -s: 向容器发送一个信号 # # 杀掉运行中的容器 mynginx # docker kill -s KILL mynginx 删除一个或多个容器 docker rm [OPTIONS] CONTAINER [CONTAINER...] # OPTIONS 说明 # -f: 通过 SIGKILL 信号强制删除一个运行中的容器 # -l: 移除容器间的网络连接,而非容器本身 # -v: 删除与容器关联的卷 # # 1. 强制删除容器 db01、db02 # docker rm -f db01 db02 # # 2. 移除容器 nginx01 对容器 db01 的连接,连接名 db # docker rm -l db # # 3. 删除容器 nginx01, 并删除容器挂载的数据卷 # docker rm -v nginx01 # # 4. 删除所有已经停止的容器 # docker rm $(docker ps -a -q) 暂停容器中所有的进程 (暂停容器提供服务) docker pause CONTAINER [CONTAINER...] 恢复容器中所有的进程 (恢复容器提供服务) docker unpause CONTAINER [CONTAINER...] 创建一个新的容器但不启动它 [用法同 docker run 一样] docker create [OPTIONS] IMAGE [COMMAND] [ARG...] 在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] # OPTIONS 说明 # -d: 分离模式 - 在后台运行 # -i: 即使没有附加也保持 STDIN 打开 # -t: 分配一个伪终端 # # 1. 在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本 # docker exec -it mynginx /bin/sh /root/runoob.sh # # 2. 在容器 mynginx 中开启一个交互模式的终端 # docker exec -i -t [容器名称或容器ID] /bin/bash 列出容器列表 docker ps [OPTIONS] # OPTIONS 说明 # -a: 显示所有的容器,包括未运行的 # -f: 根据条件过滤显示的内容 # --format: 指定返回值的模板文件 # -l: 显示最近创建的容器 # -n: 列出最近创建的n个容器, 比如 docker ps -n 3 # --no-trunc: 不截断输出 # -q: 静默模式,只显示容器编号 # -s: 显示总的文件大小 # # docker ps 输出详情介绍: CONTAINER ID: 容器 ID IMAGE: 使用的镜像 COMMAND: 启动容器时运行的命令 CREATED: 容器的创建时间 STATUS: 容器状态 - 状态有7种 已创建: created 重启中: restarting 运行中: running 迁移中: removing 暂停中: paused 已停止: exited 已死亡: dead PORTS: 容器的端口信息和使用的连接类型(tcp\udp) NAMES: 自动分配的容器名称 获取容器/镜像的元数据 docker inspect [OPTIONS] NAME|ID [NAME|ID...] # OPTIONS 说明 # -f: 指定返回值的模板文件 # -s: 显示总的文件大小 # --type: 为指定类型返回JSON # # 1. 获取镜像 raylin666/openresty:1.19.9.1 的元信息 # docker inspect raylin666/openresty:1.19.9.1 # # 2. 获取正在运行的容器 openresty 的 IP # docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' openresty 查看容器中运行的进程信息,支持 ps 命令参数 docker top [OPTIONS] CONTAINER [ps OPTIONS] 容器运行时不一定有 /bin/bash 终端来交互执行 top 命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。 查看容器 php 的进程信息 查看所有运行容器的进程信息 连接到正在运行中的容器 docker attach [OPTIONS] CONTAINER 要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。 官方文档中说attach后可以通过CTRL-C来 detach,但实际上经过我的测试,如果 container 当前在运行 bash,CTRL-C 自然是当前行的输入,没有退出; 如果 container 当前正在前台运行进程,如输出 nginx 的 access.log 日志,CTRL-C 不仅会导致退出容器,而且还 stop 了。这不是我们想要的,detach 的意思按理应该是脱离容器终端,但容器依然运行。好在 attach 是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。 从服务器获取实时事件 docker events [OPTIONS] # OPTIONS 说明 # -f: 根据条件过滤事件 # --since: 从指定的时间戳后显示所有事件 # --until: 流水时间显示到指定的时间为止 # # 1. 显示 docker 2021年11月28日后的所有事件 # docker events --since="1638091082" # # 2. 显示 docker 镜像为 mysql:8.0 2021年11月28日后的相关事件 # docker events -f "image"="mysql:8.0" --since="1638091082" # # 如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如--since="2021-11-28"。 获取容器的日志 docker logs [OPTIONS] CONTAINER # OPTIONS 说明 # -f: 跟踪日志输出 # --since: 显示某个开始时间的所有日志 # -t: 显示时间戳 # --tail: 仅列出最新N条容器日志 # # 1. 跟踪查看容器 mysql 的日志输出 # docker logs -f mysql # # 2. 查看容器 php 从2021年11月27日后的最新10条日志 # docker logs --since="2021-11-27" --tail=10 php 阻塞运行直到容器停止,然后打印出它的退出代码 docker wait [OPTIONS] CONTAINER [CONTAINER...] 列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT到面向公众的端口 docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]] ➜ test docker port openresty 80/tcp -> 0.0.0.0:19100 从容器创建一个新的镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # OPTIONS 说明 # -a: 提交的镜像作者 # -c: 使用 Dockerfile 指令来创建镜像 # -m: 提交时的说明文字 # -p: 在 commit 时,将容器暂停 # # 将容器 a404c6c174a2 保存为新的镜像, 并添加提交人信息和说明信息 # docker commit -a "raylin666" -m "my openresty" a404c6c174a2 raylin666/openresty:1.19.9.1 用于容器与主机之间的数据拷贝 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH # OPTIONS 说明 # -L: 保持源目标中的链接 # # 1. 将主机 /www/html 目录拷贝到容器 96f7f14e99ab 的 /www 目录下 # docker cp /www/html 96f7f14e99ab:/www/ # # 2. 将主机 /www/html 目录拷贝到容器 96f7f14e99ab 中,目录重命名为 www # docker cp /www/html 96f7f14e99ab:/www # # 3. 将容器 96f7f14e99ab 的 /www 目录拷贝到主机的 /tmp 目录中 # docker cp 96f7f14e99ab:/www /tmp/ 检查容器里文件结构的更改 docker diff [OPTIONS] CONTAINER ➜ test docker diff openresty C /run C /run/openresty A /run/openresty/nginx-uwsgi A /run/openresty/nginx-client-body A /run/openresty/nginx-fastcgi A /run/openresty/nginx-proxy A /run/openresty/nginx-scgi
2022年-11月-13日
168 阅读
0 评论
Docker