如何设计网站以网络为中心的企业文化,包装设计效果图生成器,余姚企业网站建设公司,wordpress跨域Docker技巧汇总 前言使用流程安装配置镜像管理创建并运行容器使用容器/常用命令导出和导入查看元数据挂载数据卷端口映射/转发VS Code连接Docker 前言
Docker 是一个开源的应用容器引擎#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中#xf… Docker技巧汇总 前言使用流程安装配置镜像管理创建并运行容器使用容器/常用命令导出和导入查看元数据挂载数据卷端口映射/转发VS Code连接Docker 前言
Docker 是一个开源的应用容器引擎可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中然后发布到任何流行的 Linux 机器上。容器使用沙箱机制相互独立且性能开销极低。
本文介绍Docker使用技巧内容包含使用流程、安装配置、镜像管理、创建并运行容器、使用容器、导入和导出、查看元数据、挂载数据卷、端口映射、VS Code连接Docker、等等。
使用流程
安装Docker配置Docker拉取镜像创建容器启动容器进入容器退出容器
安装配置
首次使用需要安装和配置
# 安装Docker
sudo apt install docker.io# 配置Docker
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker镜像管理
查看镜像
docker images此命令可以查看本地主机上存在的镜像。
搜索镜像
docker search [searchName]# 示例从docker hub中搜索docker名为centos的镜像
docker search centos此命令可以从docker hub中搜索镜像其中 name代表此镜像的名称 description此镜像的描述 stars下载次数 official是否由官方提供
拉取镜像 方式1DockerHub下载 DockerHub官网链接
方式2命令行下载 下载命令可在DockerHub获取
docker pull [options] imageName[:tag]# 默认拉取最新版本
docker pull imageName
docker pull imageName:latest# 拉取指定版本
docker pull imageName:version其中imageName为镜像名称tag和version为版本。 注意公共服务器上若已存在所需镜像则无需下载镜像直接创建容器即可。
删除镜像
docker rmi [imageName]
# or
docker image rm [imageName]# 强制删除
docker rmi -f [imageName]注意若存在容器正在引用镜像则无法删除镜像需要使用 -f 强制删除。但不推荐这种做法推荐先删除引用此镜像的容器再删除此镜像。
创建并运行容器
使用如下命令创建并运行容器
# 简洁语法
docker run [options] image [command] [args]
# 详细语法
docker run -it --privileged --name [dockerName] -p [hostPort:dockerPort] -v [hostDir:dockerDir] imageName[:tag] [command]# 示例
docker run -it --privileged --name my_ubuntu -p 8020:22 -v $PWD:/workspace ubuntu:20.04
docker run -it --privileged --name my_ubuntu -p 8020:22 -v /home/[user]/work:/workspace ubuntu:20.04 /bin/bash变量说明
command可省略若不想省略可填写 /bin/bash 或 bash
dockerName为容器名称可自定义
imageName为要选择的镜像
tag一般为镜像版本
hostPort为主机端口dockerPort为容器端口
hostDir为主机目录dockerDir为容器目录目录需为绝对路径
$PWD代表终端的当前路径
user代表当前用户名
args为其他参数options说明详情可见官方文档或菜鸟教程
-d 后台运行容器并返回容器ID
-i 以交互模式运行容器通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端通常与 -i 同时使用
-it 为 -i 和 -t 结合
--name 为容器自定义名称
-p 为端口映射/转发命令可将容器端口映射到主机中用法: -p [hostPort:dockerPort]
-v 为挂载数据卷命令可将主机目录挂载到容器中可实现文件同步目录需为绝对路径用法: -v [hostDir:dockerDir]补充 推荐使用-p和-v命令 使用-p命令进行端口映射后可通过ssh连接容器示例
# 访问主机的8020端口即可通过ssh连接容器
-p 8020:22使用-v命令挂载数据卷后可同步容器外和容器内的文件示例
# 将主机当前目录挂载到容器的workspace目录
-v $PWD:/workspace-p 和 -v 可创建多个映射示例
-p [hostPort1:dockerPort1] -p [hostPort2:dockerPort2] -v [hostDir1:dockerDir1] -v [hostDir2:dockerDir2]使用容器/常用命令
查看容器状态
# 查看已运行容器
docker ps
# 查看所有容器包含已运行和已停止的容器
docker ps -a查看容器信息 其中dockerName为容器名称dockerId为容器ID二选一即可。
# 查看容器元数据
docker inspect [dockerName/dockerId]
# 查看容器ID
docker inspect [dockerName/dockerId] | grep Id
# 查看容器IP地址
docker inspect [dockerName/dockerId] | grep IPAddress
# 查看容器端口映射需先启动容器
docker port [dockerName/dockerId]启动容器
docker start [dockerName/dockerId]停止容器
docker stop [dockerName/dockerId]重启容器 restart 等同于 stop start 。
docker restart [dockerName/dockerId]进入容器 进入已运行容器前需先启动容器使容器保持运行状态。
# attach 退出时会导致容器停止运行
docker attach [dockerName/dockerId]# exec 退出时不会导致容器的停止
# 一定要加/bin/bash或bash或其它可执行的文件
docker exec -it [dockerName/dockerId] /bin/bash退出容器
# 在容器内使用
exit删除容器 删除容器时容器必须是停止状态。
# 删除一个或多个容器
docker rm [dockerName] [dockerName]
# or
docker rm [dockerId] [dockerId]# 删除全部停止容器
docker prune重命名容器 oldName为旧容器名newName为新容器名。
docker rename [oldName] [newName]导出和导入
导出容器 可使用 docker export 从容器创建快照文件
docker export [dockerName/dockerId] [name.tar]
# or
docker export --output[name.tar] [dockerName/dockerId]# 示例
docker export my_ubuntu ./docker/my_ubuntu.tar其中name.tar 为快照文件。
导入容器镜像 可使用 docker import 从容器快照文件中再导入为镜像
cat [name.tar] | docker import - [imageName]
# 示例
cat ./docker/my_ubuntu.tar | docker import - my/ubuntu:v1其中imageName 为容器镜像。
从容器创建镜像
docker commit [opt] [dockerName/dockerId] [imageName[:tag]]
# 示例
docker commit -a user -m my ubuntu my_ubuntu my/ubuntu:v1其中opt说明如下
-a提交的镜像作者
-c使用Dockerfile指令来创建镜像
-m提交时的说明文字
-p在commit时将容器暂停。补充 导入或创建镜像后可以使用docker run命令创建并运行新容器。
查看元数据
此命令可以参考容器/镜像的元数据。 其中NetworkSettings 中的 Networks - IPAddress 即为容器的IP地址。
# 查看所有数据
docker inspect [dockerName/dockerId]
# 查看容器ID
docker inspect [dockerName] | grep Id
# 查看容器IP地址
docker inspect [dockerName/dockerId] | grep IPAddress挂载数据卷
数据卷 Docker容器在产生数据的时候如果不通过docker commit生成新的镜像使得数据作为镜像的一部分保存下来那么当容器删除之后数据自然而然的也会消失。为了能保存数据容器中引用了数据卷的概念。
卷就是目录或者文件存在一个或者多个容器之中由docker挂载到容器但是不属于联合文件系统因此能够绕过Union File System提供一些用于持续存储或者共享数据的特性。
卷的设计目的就是数据的持久化完全独立于容器的生存周期因此docker不会再容器删除时删除其挂载的数据卷。
数据卷特点
数据卷可在容器之间共享或者重用数据。卷中的更改可以直接生效。数据卷中的更改不会包含在镜像的更新中。数据卷的生命周期一直持续到没有容器使用它为止。
挂载命令 此命令一般在创建容器时使用。
docker run -it -v [hostDir:dockerDir] [image] /bin/bash# 示例
docker run -it -v /home/test01:/home centos /bin/bashhostDir为主机目录dockerDir为容器目录目录需为绝对路径。 挂载后这两个目录是同步的状态在容器目录中写入任何新的文件都会同步到主机目录下同样主机目录中写入新文件也会同步到容器目录。
端口映射/转发
若未创建容器则通过 docker run 命令创建容器时添加 -p 选项设置端口映射即可。 若已创建容器则可通过以下方案配置端口映射推荐使用方案1方便快捷。假设主机端口为hostPort容器端口为dockerPort。
方案1重新创建容器 使用 docker export 或 docker commit 命令将已创建容器生成新镜像再从新镜像创建新容器新容器正常后删除旧容器。
# 停止容器
docker stop [dockerName/dockerId]
# 提交一个已创建容器生成镜像
docker commit [dockerName/dockerId] [newImageName]
# 创建新容器并添加端口映射
docker run -it --privileged --name [newDockerName] -p [hostPort:dockerPort] -v [hostDir:dockerDir] [newImageName]# 新容器可正常使用后删除原容器
docker rm [oldDockerName]
# 重命名新容器为原名称
docker rename [newDockerName] [oldDockerName]方案2修改容器配置文件 停止容器
docker stop [dockerName/dockerId]停止Docker服务
sudo systemctl stop docker进入容器目录
# 查看容器ID
docker inspect [dockerName] | grep Id
# 切换为root用户
su
# 进入容器目录
cd /var/lib/docker/containers/[dockerId]修改配置文件 hostconfig.json在 PortBindings 修改以下配置。
PortBindings:{[dockerPort]/tcp:[{HostIp:,HostPort:[hostPort]}]}
# 示例
PortBindings:{22/tcp:[{HostIp:,HostPort:8020}]}config.v2.json在 ExposedPorts 增加以下配置。
ExposedPorts:{[dockerPort]/tcp:{}}
示例
AttachStderr:true,ExposedPorts:{22/tcp:{}},Tty:true保存文件后开启Docker服务和容器
sudo systemctl start docker
sudo systemctl enable docker
docker start [dockerName/dockerId]方案3修改iptables 注意 使用iptables相关命令时需要管理员权限。 查看iptables
# 显示nat表所有链
sudo iptables -t nat -vnL
# 显示nat表DOCKER链
sudo iptables -t nat -vnL DOCKER
# 显示行号
sudo iptables -t nat -vnL DOCKER --line-number查看已创建容器的IP
docker inspect [dockerName/dockerId] | grep IPAddress增加iptables规则
sudo iptables -t nat -A DOCKER -p tcp --dport [hostPort] -j DNAT --to-destination [dockerIP:dockerPort]
# 示例
sudo iptables -t nat -A DOCKER -p tcp --dport 8021 -j DNAT --to-destination 172.17.0.2:22删除iptables规则 若添加错误或需要修改可删除规则再次添加。
sudo iptables -t nat -D DOCKER [lineNumber]保存iptables规则 通常情况下定义的规则会被设置为持续到下一次重启。如果不保存当计算机重启后所有的规则都会丢失因此需要对iptables规则进行保存。
# 普通保存
sudo iptables-save
# 保存到文件
sudo iptables-save [fileName]
# 从文件恢复
sudo iptables-restore [fileName]# 示例
sudo iptables-save /etc/iptables/rules
sudo iptables-restore /etc/iptables/rulesVS Code连接Docker
有2个方案可在VS Code连接Docker方案1不需要进行容器端口映射方案2需要进行容器端口映射可自行选择。推荐使用方案2比较灵活。
方案1需要在VS Code安装 Dev Containers 扩展方案2需要安装 Remote - SSH 扩展推荐安装 Remote Development 扩展包含前2个扩展。
方案1通过VS Code的容器插件链接 此方法不需要进行容器端口映射。 打开VS Code点击远程扩展按钮远程资源管理器选择开发容器选中已经存在的容器选择在新窗口中附加即可如下图
方案2通过VS Code的SSH插件连接 此方法需要进行容器端口映射。 此方法与SSH连接主机相同只需将SSH默认端口号22修改为主机的映射端口号hostPort即可。 连接前需要确保设置容器用户密码、安装openssh-server、修改sshd配置、开启ssh服务详细步骤请见本人的另一篇博文 VS Code技巧汇总 中的 远程SSH连接 章节。