Docker 快速通关
一、Docker 大致介绍Docker 可以帮助我们完成应用的运行run、构建build和分享share。它的核心目标很简单把应用和环境打包起来让应用在不同机器上尽量保持一致方便部署、迁移和分发二、Docker 的几个核心概念1. Docker Host首先我们需要一台 VPS在这台 VPS 上安装 Docker。这台装了 Docker 环境的 VPS通常叫做Docker Host也就是 Docker 主机。2. Docker DaemonDocker Daemon 是 Docker 的守护进程。它会一直运行负责接收命令并处理容器、镜像等操作。3. Docker CLIDocker CLI 是命令行工具也就是我们平时输入的docker命令。比如dockerpull redis这个命令就是由 Docker CLI 发给 Docker Daemon 去执行。4. RegistryRegistry 可以理解成镜像仓库也就是 Docker 的应用市场。里面有很多常见镜像比如MySQLNginxRedis这些镜像可以直接下载使用。5. Image 和 ContainerImage镜像可以理解成应用模板Container容器镜像运行起来后的实例镜像是静态的容器是运行中的。三、Docker 的基本工作流程1. 拉取镜像dockerpull redis这个命令的意思是Docker Daemon 接收到命令去 Registry 找redis镜像下载到本地2. 运行容器dockerrun redis这个命令的意思是先看本地有没有redis镜像如果没有就去 Registry 下载然后用这个镜像启动一个 Redis 容器3. 多个容器同一个镜像可以启动多个容器。比如你可以同时启动多个 Redis 容器每个容器都是独立隔离的。四、Docker 能做什么Docker 最常见的用途就是这三件事1. Run运行应用把镜像变成正在运行的容器。2. Build构建镜像dockerbuild xxx这个命令可以用来制作自己的镜像。3. Share分享镜像dockerpush xxx这个命令可以把自己做好的镜像推送到 Registry方便别人下载和使用。五、简单理解 Docker 的关系可以这样记Docker Host安装了 Docker 的机器Docker Daemon后台守护进程负责干活Docker CLI我们输入命令的地方Registry镜像仓库存放镜像Image镜像应用模板Container容器镜像运行后的实例六、Docker 的安装在 VPS 中可以直接执行官方安装脚本curl-fsSLhttps://get.docker.com|bash官方文档https://docs.docker.com/engine/install/ubuntu/七、Docker 无法连接时的配置如果 Docker 无法连接可以创建这个文件/etc/docker/daemon.json在里面可以配置Docker 数据目录Registry 镜像加速本地代理示例配置{data-root:/data/docker,registry-mirrors:[https://docker.1ms.run],proxies:{http-proxy:http://127.0.0.1:7890,https-proxy:http://127.0.0.1:7890,no-proxy:localhost,127.0.0.1}}1.data-rootdata-root是 Docker 的数据根目录。镜像、容器、卷等持久化数据默认都放在这里。Linux 默认值是/var/lib/docker如果你想把 Docker 数据放到别的盘可以修改这个值比如data-root:/data/docker2.registry-mirrors这个配置是镜像加速地址。常见用途是加速拉取镜像。如果已经配置了可用的国内镜像很多情况下就不需要再额外配代理了。3.proxies这个配置是代理。适合本机无法直接访问外网镜像仓库的情况。八、代理和镜像的简单理解一般来说国外机器通常只需要配置data-root国内机器通常会配置data-root 代理也可以直接配置国内镜像加速一个常见场景A国内 VPS安装 Docker需要拉外网镜像B国外 VPS安装 Tinyproxy作为 HTTP 正向代理A 机器的 Docker daemon在daemon.json里把代理指向 B这样 A 就能通过 B 去拉镜像。九、在国外 VPS 上安装 Tinyproxy在国外 VPS 上可以这样安装sudoaptupdatesudoaptinstall-ytinyproxy安装完成后Tinyproxy 可以作为 HTTP 正向代理使用。十、国外服务器 BTinyproxy 完整配置/etc/tinyproxy/tinyproxy.confUser nobody Group nogroup Port 8888 Timeout 600 Listen 0.0.0.0 Allow 1.2.3.4 BasicAuth dockerproxy StrongPass123 Syslog On LogLevel Info # 不写 ConnectPort 表示允许 CONNECT 到所有目标端口 # 如果以后想收紧只允许标准 HTTPS可以取消下面这一行注释 # ConnectPort 443配置说明User nobody/Group nogroupTinyproxy 的运行身份按机器实际存在的用户组来写Port 8888代理监听端口Timeout 600连接空闲超时Listen 0.0.0.0监听全部网卡Allow 1.2.3.4只允许国内 A 机公网 IP 访问BasicAuth dockerproxy StrongPass123代理认证Syslog On日志输出到 syslogLogLevel Info日志级别ConnectPort 443如果启用只允许 CONNECT 到 443 端口十一、Docker daemon 的代理配置示例{data-root:/data/docker,registry-mirrors:[https://your-mirror.example.com],proxies:{http-proxy:http://dockerproxy:StrongPass123203.0.113.10:8888,https-proxy:http://dockerproxy:StrongPass123203.0.113.10:8888,no-proxy:localhost,127.0.0.1,.local}}说明如果已经配置了可用的国内镜像很多情况下就不需要再额外配代理了如果还是需要访问外网镜像仓库就可以继续保留代理配置no-proxy里写本机地址和局域网域名避免这些地址走代理十二、国内服务器通过 systemd 给 Docker 配代理国内服务器还可以通过 systemd 单独给 Docker 服务配代理。配置文件/etc/systemd/system/docker.service.d/http-proxy.conf内容[Service] EnvironmentHTTP_PROXYhttp://dockerproxy:StrongPass123203.0.113.10:8888 EnvironmentHTTPS_PROXYhttp://dockerproxy:StrongPass123203.0.113.10:8888 EnvironmentNO_PROXYlocalhost,127.0.0.1,.local说明这样 Docker 服务启动之后就默认使用这个代理。修改完以后执行sudosystemctl daemon-reloadsudosystemctl restartdocker额外说明修改了/etc/docker/daemon.json后只需要执行sudosystemctl restartdocker修改了/etc/systemd/system/docker.service.d/http-proxy.conf后需要先执行sudosystemctl daemon-reloadsudosystemctl restartdocker十三、Docker 常用命令Docker 的基础环境和运行原理了解之后就可以开始学常用命令了。下面这些是最常用的一批命令。1.docker search搜索镜像。dockersearch redis2.docker pull从镜像仓库拉取镜像。dockerpull redisdocker pull的完整写法docker pull的本质是镜像名:标签比如dockerpull nginx实际上等价于dockerpull nginx:latest因为不写标签时默认就是latest。如果你拉取了nginx再用dockerimages就能看到本地已经有这个镜像了。下载指定版本镜像如果你想下载指定版本就直接在镜像名后面加标签比如dockerpull nginx:1.26.0这表示下载nginx的1.26.0版本。3.docker images查看本地有哪些镜像。dockerimages4.docker ps查看正在运行的容器。dockerpsdocker ps是查看正在运行中的容器。5.docker ps -a查看所有容器包括已经停止的。dockerps-adocker ps -a是查看正在运行 已停止的所有容器。6.docker run运行一个容器。dockerrun redis7.docker stop停止一个正在运行的容器。dockerstop 容器ID8.docker start启动一个已经停止的容器。dockerstart 容器ID已停止的容器可以通过docker start再次运行。9.docker restart重启容器。dockerrestart 容器ID已经运行的容器可以通过docker restart重新运行。10.docker rm删除容器。dockerrm容器ID删除容器时容器必须已经停止。你也可以使用dockerrm-f容器ID这个方式可以强制删除正在运行中的容器。11.docker rmi删除镜像。dockerrmi 镜像ID12.docker logs查看容器日志。dockerlogs 容器ID13.docker exec进入正在运行的容器执行命令。dockerexec-it容器IDbash14.docker inspect查看容器或镜像的详细信息。dockerinspect 容器ID15.docker build构建镜像。dockerbuild-tmyapp:1.0.16.docker push推送镜像到仓库。dockerpush myapp:1.017.docker stats查看容器资源使用情况。dockerstats十四、镜像和容器命令补充说明前面这一节已经把最常用的镜像和容器命令列出来了这里做一个简单归类镜像相关docker searchdocker pulldocker imagesdocker rmidocker builddocker commitdocker savedocker loaddocker logindocker tagdocker push容器相关docker rundocker psdocker ps -adocker stopdocker startdocker restartdocker rmdocker logsdocker execdocker inspectdocker stats一些常见组合dockerps-aqdockerrm-f$(dockerps-aq)dockercommit-m修改了Nginx首页mynginx myNginx:v1.0dockersave-onginx.tar nginx:1.26.0dockerload-inginx.tar十五、保存镜像的几个命令十五、保存镜像的几个命令1.docker commit把正在运行的容器保存成一个新的镜像。dockercommit-m修改了Nginx首页mynginx myNginx:v1.0这个命令的意思是-m提交说明mynginx容器名myNginx:v1.0新的镜像名和版本执行完docker commit -m 修改了Nginx首页 mynginx myNginx:v1.0之后再执行dockerimages就可以看到你自己的镜像了。2.docker save把镜像保存成一个文件。dockersave-onginx.tar nginx:1.26.0docker save -o后面写导出的.tar文件名再写镜像名和版本就可以把镜像导出成xxx.tar。这个xxx.tar可以用scp传输给其他机子。3.docker load把保存好的镜像文件重新加载回来。dockerload-inginx.tar执行完docker load -i xxx.tar后再执行dockerimages就可以看到有这个镜像了。十六、Docker 镜像分享社区Docker 镜像分享到社区时通常会用到这三个命令1.docker login登录镜像仓库。默认登录的是 Docker Hub。如果是个人 Harbor也可以登录你的 Harbor 仓库地址。2.docker tag给本地镜像打标签改成仓库地址格式。3.docker push把镜像推送到仓库。个人 Harbor 的完整流程假设你的 Harbor 地址是harbor.example.com完整流程一般是这样dockerlogin harbor.example.com然后给镜像打标签dockertag mynginx:v1.0 harbor.example.com/library/mynginx:v1.0最后推送dockerpush harbor.example.com/library/mynginx:v1.0如果是 Docker Hub流程也类似只是仓库地址会换成 Docker Hub 的命名方式。docker tag为什么需要docker tag是因为推送的镜像需要满足仓库的命名要求。也就是说先把本地镜像改成“仓库地址 项目名 版本号”的格式docker push才知道推到哪里。十七、Docker 命令速记图镜像 - docker search - docker pull - docker images - docker rmi 容器 - docker run - docker ps - docker stop - docker start - docker restart - docker stats - docker logs - docker exec - docker rm 分享 - docker commit - docker save - docker load - docker login - docker tag - docker push十八、一个小技巧docker ps -aq-a打印所有容器-q只打印容器 ID所以dockerps-aq表示打印所有容器的 ID包括运行中的和停止的。删除所有容器dockerrm-f$(dockerps-aq)这个命令的意思是docker ps -aq先拿到所有容器 IDdocker rm -f再强制删除这些容器所以它可以删除所有运行中的和停止的容器。十九、Docker 存储目录挂载和卷映射Docker 的存储方式常见有两种目录挂载卷映射1. 目录挂载目录挂载可以用-v把宿主机目录映射到容器里。例如dockerrun-v./data:/data nginx或者使用绝对路径dockerrun-v/data/app:/data nginx目录挂载的意思是宿主机上的文件夹映射到 Docker 容器内目录挂载适合什么情况如果这些文件是容器运行之后生成的目录挂载就很合适。比如日志文件上传文件数据文件容器运行后才生成的配置文件目录挂载的问题如果这些文件是容器一开始就需要存在的目录挂载就可能有问题。因为容器里原本有内容但宿主机挂进去的是空目录结果把容器里的原始内容覆盖掉了除非你在宿主机上提前把这些文件准备好否则目录挂载可能会对容器产生严重影响。2. 卷映射卷映射可以解决这个问题。它适合容器需要持久化数据不想直接依赖宿主机具体路径想让 Docker 自己管理数据卷映射的默认位置卷映射默认会放在 Docker 的数据根目录下面。如果没有改过配置默认是在/var/lib/docker/volumes/volume-name/_data如果你在/etc/docker/daemon.json里配置了data-root:/data/docker那么卷映射的数据位置也会跟着变到/data/docker/volumes/volume-name/_data也就是说data-root会影响 Docker 整体数据存放位置卷映射的位置也会一起改变。目录挂载和卷映射的写法目录挂载目录挂载是把宿主机目录映射到容器目录。写法通常是dockerrun-v/app/nghtml:/usr/share/nginx/html nginx如果使用相对路径也可以这样写dockerrun-v./data:/data nginx目录挂载要注意区分绝对路径写法/app/nghtml:/usr/share/nginx/html相对路径写法./data:/data卷映射卷映射也是用-v但左边通常不是你自己指定的宿主机目录而是 Docker 管理的卷名。例如dockerrun-vngconf:/etc/nginx nginx宿主机变化会不会影响容器无论是目录挂载还是卷映射宿主机里的内容变化都会反映到容器内部。也就是说宿主机改了文件容器里会看到变化容器里改了文件宿主机里也会看到变化这就是挂载和卷映射的意义让宿主机和容器共享同一份数据目录挂载和卷映射的区别目录挂载你自己指定宿主机路径比如/app/nghtml或./data适合自己明确知道文件放哪的场景卷映射Docker 自己管理路径默认在 Docker 数据目录下的_data里更适合长期持久化数据目录挂载的场景示例比如 Nginx 日志容器启动后会不断生成新文件这种场景适合目录挂载dockerrun-v/data/nginx/logs:/var/log/nginx nginx一开始就需要存在的文件比如某些应用启动时必须读取配置文件如果容器里本来就有默认配置而宿主机挂进去的是空目录就会出问题。这个时候更适合先把宿主机文件准备好或者改用卷映射。二十、Docker 网络Docker 默认会有一个docker0网络。为什么需要自定义 Docker 网络假设有两个容器app1app2宿主机端口映射如下app1宿主机 88 端口映射到容器内部 80app2宿主机 99 端口映射到容器内部 80如果使用 Docker 默认网络那么容器内部的app1想访问app2通常要先访问宿主机地址curlhttp://宿主机IP:99这就很绕明明两个容器就在同一台机器里却非要先绕到宿主机端口再访问。可以把它理解成同事就在你旁边你却先跑到公司门口再重新进来找他聊天。很绕也很不自然。docker0 是 Docker 的默认网络docker0是 Docker 默认网络。你可以通过下面的命令查看容器的详细信息dockercontainer inspect xxx里面会看到容器在docker0网络中的 IP 地址比如172.17.0.2这个 IP 就是容器在docker0网络中的地址。直接用容器 IP 访问的问题你可以通过容器 IP 来访问另一个容器但有一个问题容器启动顺序不同IP 可能变化容器重启后IP 也可能变化所以直接用容器 IP 不够稳定。容器名和内部 IP 的访问方式容器名访问比直接写 IP 更好一些。因为容器名更容易记也更稳定。为什么要自定义 Docker 网络Docker 默认的docker0网络通常不适合直接用容器名互相访问。如果你想让容器之间直接通过容器名内部 IP来访问就需要在运行容器时把它们加入一个自定义网络。这样容器之间就可以直接互相通信不需要先绕到宿主机端口。创建和使用自定义网络先创建一个自定义网络dockernetwork create mynet然后把容器加入这个网络dockerrun--networkmynet--nameapp1 nginxdockerrun--networkmynet--nameapp2 redis这样app1就可以直接通过容器名访问app2curlhttp://app2:6379二十一、最简单的总结Docker 的安装和基础配置可以先记住这几件事安装curl -fsSL https://get.docker.com | bash配置文件/etc/docker/daemon.jsondata-rootDocker 数据目录registry-mirrors镜像加速proxies代理配置Tinyproxy可以作为国外 VPS 的 HTTP 正向代理出口也可以通过 systemd 给 Docker 服务单独配置代理如果你先把这些搞明白Docker 的入门就算通了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479917.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!