跳至主要內容

Docker基本操作

IT王小二约 3190 字

Docker基本操作

作者:IT王小二

博客:https://itwxe.comopen in new window

Docker容器及镜像的基本操作,操作命令和Linux极其相似,比较简单,本文仅演示部分命令。

同时个人学习过程中命令参考来自 菜鸟教程open in new window ,个人认为入门命令或许最轻松简单的就是这里了,每条命令运行完都有示例结果。

一、镜像操作

1. 镜像操作常用命令

# 列出本地镜像列表
docker images

# 获取镜像
docker pull [镜像名:版本]

# 删除镜像
docker rmi [镜像名:版本或镜像ID]

# Dockerfile 创建镜像
docker build -t [镜像名:版本] [path]

# 查看指定镜像的创建历史
docker history [镜像名:版本]

# 将镜像保存成 tar 归档文件的两种方式,通常不使用,都是使用镜像仓库存储
docker save -o xxx.tar [镜像名:版本]
save [镜像名:版本]>xxx.tar

# 从归档文件加载镜像的两种方式,通常不使用,都是使用镜像仓库获取
docker load --input xxx.tar / docker load<xxx.tar

列出本地镜像列表

docker images

列出本地镜像列表

  • REPOSITORY:镜像所在仓库的名称
  • TAG:镜像标签(镜像版本)
  • IMAGEID:镜像ID
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小

获取镜像

docker pull [镜像名:版本]

当不加入版本号时默认最后一个版本,即最新的版本。

例如获取 MySQL5.7 版本,命令:

获取mysql5.7镜像

删除镜像

docker rmi [镜像名:版本或镜像ID]

例如删除 hello-world 镜像。

删除hellor-world镜像

二、容器操作

1. 容器生命周期管理命令

# 查看容器列表(默认查看正在运行的容器,-a查看所有容器)
docker ps

# 创建一个新的容器并运行一个命令,run为创建并运行,create仅创建不运行
docker run/create [参数] [镜像名:版本]

# 启动/停止/重启一个容器
docker start/stop/restart [容器名或容器ID]

# 直接杀掉容器,不给进程响应时间
docker kill [容器名或容器ID]

# 删除已经停止的容器
docker rm [容器名或容器ID]

# 暂停/恢复容器中的进程
docker pause/unpause [容器名或容器ID]

这部分命令比较简单,仅解释容器列表含义、容器启动参数详解。

容器通常情况下都是随用随删,要注意数据挂载保存!

查看容器列表

docker ps

查看容器列表

  • CONTAINER ID:容器ID,具有唯一性
  • IMAGE:容器实例化出来的镜像名称和版本号
  • COMMAND:启动容器时运行的命令
  • CREATED:容器创建时间
  • STATUS:容器状态,有七种
    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)
  • PORTS:容器的端口映射信息
  • NAMES:容器名称

创建并运行容器

docker run [参数] [镜像名:版本]

常用参数:

-d:后台运行容器,并返回容器ID;
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p:端口映射,格式为:宿主机端口:容器端口
--restart=always:代表 docker 重启时,dockerHub 容器也总是随之启动
--name 容器名称:为容器指定一个名称
-v:挂载宿主机目录到容器目录,格式为-v [宿主机目录]:[容器目录]
-m:设置容器使用内存最大值
后台启动容器

创建一个tomcat8.0服务,以后台方式运行,映射主机端口8090,容器名称tomcat8090,命令如下:

docker run -d --name tomcat8090 -p 8090:8080 tomcat:8.0

后台启动tomcat8090

启动成功之后,访问看下tomcat服务是否正常,当然前提宿主机的8090端口需要开放,我的地址为:http://192.168.5.33:8090

交互式创建容器并进入容器

创建一个tomcat8.0服务,,以交互式方式运行,映射主机端口8091,容器名称tomcat8091,命令如下:

docker run -it --name tomcat8091 -p 8091:8080 tomcat:8.0

交互式创建容器并进入容器

可以看到两者的不同,但是需要注意,交互式启动容器,一旦执行 exit 命令那么容器也会 stop,查看结果如下图,tomcat8091 已经处于停止状态。

image-20210627203710815

如果需要交互式运行却不退出容器,可以使用 ctrl + q + p 退出交互式页面,这样容器不会退出运行。

挂载宿主机目录到容器

当我们想挂载宿主机的文件目录到容器,或者持久化容器某些内容时,例如 MySQL 数据持久化,往 tomcat 容器运行项目,此处就以 tomcat 容器运行项目挂载为例。

此处使用的项目为开源项目: https://github.com/jgraph/drawioopen in new window,这也是我用来画图的开源工具,工具支持中文,如果你不想使用付费工具,那么这个开源工具绝对值得你尝试,话不多说,命令写上:

1、首先干掉所有容器

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

2、这里我就使用 https://github.com/jgraph/drawioopen in new window 这个画图的开源项目来示例

# 宿主机创建挂载目录
mkdir -p /itwxe/tomcat/webapps

# wget下载 war 包到创建的目录,也可以下载 war 后上传
cd /itwxe/tomcat/webapps
wget https://github.com/jgraph/drawio/releases/download/v14.8.0/draw.war

# 启动 tomcat 容器,挂载的路径都必须是绝对路径
docker run -d --name tomcat_drawio -p 8090:8080 -v /itwxe/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.0

启动成功后访问 http://192.168.5.33:8090/draw 看看效果,效果如下图:

draw挂载目录运行效果

可以看到,war 包正常挂载到了容器,draw项目也部署运行起来了。

2. 容器操作运维

# 查看容器配置元数据
docker inspect [容器名或容器ID]

# 进入容器环境中交互操作
docker exec -it [容器名或容器ID] /bin/bash

# 查看容器日志
docker logs [--since="2019-02-01"] [-f] [--tail=10] [容器名或容器ID]

# 容器文件系统作为一个 tar 归档文件
docker export -o test.tar [容器名或容器ID]
docker export [容器名或容器ID]>test.tar

# 导入归档文件,成为一个镜像
docker import test.tar [镜像名:版本]

查看容器配置元数据

docker inspect [容器名或容器ID]

例如查看启动的 tomcat_drawio 元数据:docker inspect tomcat_drawio

里面可以看到绑定ip,挂载目录,容器ip 等信息,通常情况下得网段 ip 为:

docker容器默认网段ip

通常情况无需修改,默认即可,需要修改是可以在 /etc/docker/daemon.json 添加 bip 配置

vim /etc/docker/daemon.json

# 添加bip配置,修改网段为 172.17.5.1,通常默认 172.17.0.1
{
  "bip": "172.17.5.1/24",
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}

# 更新配置
systemctl daemon-reload
systemctl restart docker

再次查看信息,可以看到网段已经更改了,通常默认即可

docker更改网段ip

同样宿主机和docker相互访问也是通过网卡来访问的,docker安装后会新增一个网卡,使用 ip addr 命令查看。

docker网卡

进入容器环境中交互操作

docker exec -it [容器名或容器ID] /bin/bash

例如进入已经启动的容器 tomcat_drawio 中。

docker exec -it tomcat_drawio /bin/bash

可以看到命令执行后就进入了容器中,容器中的命令和Linux的使用基本没差别,不过仅支持最小化的Linux命令,例如查看文件命令 ll 命令就不支持,仅支持 ls 命令。

进入容器进行交互操作

查看容器日志

docker logs [--since="2019-02-01"] [-f] [--tail=10] [容器名或容器ID]

查看 docker 容器日志命令和 Linux 系统中 tail 命令类似,例如查看 tomcat_drawio 的运行日志。

docker logs -f tomcat_drawio

3. 容器rootfs命令

# path 容器与主机之间的数据拷贝
docker cp [主机文件路径] [容器名或容器ID:[容器路径]]

# 通过容器生成镜像
docker commit [参数] [容器名称或容器ID] [镜像名称[:版本]]

# 检查容器里文件结构的更改
docker diff [容器名称或容器ID]

容器与主机之间的数据拷贝

docker cp [主机文件路径] [容器名或容器ID]

以复制 draw.war 文件到 tomcat 容器的 /usr/local/tomcat 目录为例,当然通常 war 包不放在这里。

docker cp /itwxe/tomcat/webapps/draw.war tomcat_drawio:/usr/local/tomcat

可以看到 draw.war 成功拷贝进了容器中。

容器和主机间的数据拷贝

通过容器生成镜像

docker commit [参数] [容器名称或容器ID] [镜像名称[:版本]]

参数:

-a:提交的镜像作者
-c:使用Dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit时,将容器暂停

有时候我们需要将我们改动的容器逆向生成镜像,这样通过镜像创建出来的容器就有了我们所有的更改。

例如需要将部署了 drawio 项目的 tomcat 容器(tomcat_drawio) 逆向生成镜像。

需要注意的是,通过 -v 挂载的目录数据不会封装到镜像,所以需要把数据拷贝到容器中

# 干掉其它的示例容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

# 启动一个新的容器
docker run -dit --name tomcat8090 -p 8090:8080 tomcat:8.0

# 往里面拷贝 draw.war 包,war包会自动解压部署
docker cp /itwxe/tomcat/webapps/draw.war tomcat8090:/usr/local/tomcat/webapps/

# 容器生成镜像
docker commit -a "itwxe" -m "itwxe create tomcat drawio" tomcat8090 tomcat:itwxe_drawio

# 启动容器
docker run -dit --name tomcat9000 -p 9000:8080 tomcat:itwxe_drawio

可以看到生成镜像成功,启动也没问题,同时 http://192.168.5.33:8090/draw 当然也可以正常访问的。

通过容器生成镜像

通常情况下生成速度都很快,这是因为容器创建时其实只是在镜像文件上面多创建了一层可读写的文件,而通过容器生成镜像时只需要把这一层的文件从可读写修改成只读即可,而基础镜像层会复用。

三、仓库操作

1. 仓库操作常用命令

# 登陆仓库 
docker login

# 标记本地镜像,将其归入某一仓库
docker tag [镜像名:版本] [仓库]/[镜像名:版本]

# 推送镜像到仓库 --需要登陆
docker push [仓库]/[镜像名:版本]

# 在仓库中查询镜像,无法查询到 tag 版本
# 其中 OFFICIAL 参数值为 [OK] 的代表官方镜像,通常使用官方镜像比较安全
docker search [镜像名]

# 下载镜像到本地
docker pull [镜像名:版本]

# 退出账号
docker logout

2. Docker官方仓库

前提

1、首先 DockerHubopen in new window 注册账号,邮件激活,这就不多说了。

2、创建仓库,用于存放需要上传的镜像,此处我仍然以 itwxe/tomcat_drawio 为例,公开或私有自己选择。

创建docker仓库

上传示例

1、登录 docker,输入注册的用户名密码登录即可,警告可参考提示文档解决。

docker登录

2、再使用 tag 命令标记一个镜像,指定自己创建的仓库。

docker指定自己的仓库

3、使用 push 命令推送此镜像到 docker 官方仓库里。

docker推送镜像到官方仓库

4、查询自己的仓库,可以看到刚才设置的 v1 版本已经提交了,如果是公共仓库,那么别人也可以从你这里获取镜像,命令:docker pull itwxe/tomcat_drawio:v1

docker查看提交的镜像

3. Docker私服仓库

通常情况下在开发部署测试时可能都没有外网(内网通信),又或者你不想把你的镜像放在公网上,那么就需要私服仓库了。

搭建私服仓库

1、下载 registry 镜像,当前时间最新版本是2.x.x,所以就不指定版本了。

docker pull registry

2、配置允许 http 访问,默认仅允许 https 访问。

vim /etc/docker/daemon.json

# 添加 insecure-registries 配置,修改 ip 端口为你自己的
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
  "insecure-registries": ["192.168.5.33:5000"]
}

# 刷新配置,重启 docker
systemctl daemon-reload
systemctl restart docker

3、启动私服仓库容器。

docker run -d --name dockerHub -p 5000:5000 registry

docker ps -a

curl http://192.168.5.33:5000/v2/_catalog

启动私服仓库容器

可以 curl 查看仓库的镜像内容,也可以浏览器 http://ip:port/v2/_catalog 查看。

提交镜像到私服仓库

提交私服仓库过程和提交官方仓库步骤一致,以提交 itwxe/tomcat_drawio 到私服仓库为例。

提交镜像到私服仓库

同样,拉取镜像的时候也加上 ip:port

docker pull 192.168.5.33:5000/tomcat_drawio:private1