Docker 作为一款强大的容器化工具,在软件开发和部署流程中具有关键作用。以下详细介绍涵盖容器管理、镜像管理、网络管理、仓库以及数据管理等方面的常用命令。

一、容器管理

(一)创建并启动容器

  • 在前台创建并运行容器(之后如果要退出容器但是不关闭容器,按_Ctrl+P+Q_即可)

docker run -it --rm -p 8001:8080 --name my-nginx nginx

1. -it - 交互式 bash 模式

2. --rm - 容器终止运行后自动删除容器文件

3. -p 8001:8080 - 将主机 8001 端口映射到容器中的 8080 端口

4. --name my-nginx - 指定名称

5. nginx - 要使用的镜像

6. -v, --volume pwd:/app # mount(需要绝对路径)

7. -e, --env NAME=hello # 环境变量 env vars

8. --network=host ,直接使用宿主机网络

  • 在后台创建和运行容器,如需容器在后台运行,可使用`-d`参数,例如:

docker run -d -p 80:80 docker/getting-started

1. -d  以分离(后台)模式运行容器

( 二)查看容器

  • 查看正在运行的容器

使用docker ps命令查看当前正在运行的容器列表,显示容器 ID、镜像名称、创建时间、状态及端口映射等信息。

  1. 查看所有容器docker ps -a命令可查看包括已停止的所有容器

  2. - 查看日志docker logs nginx-server

  3. - 检查容器,docker inspect nginx-server

  4. - 容器事件docker events nginx-server

  5. - 公共端口docker port nginx-server,80/tcp -> 0.0.0.0:8080,容器的端口 80 映射到宿主机的 8080 端口。

  6. - 运行进程docker top nginx-server

  7. - 容器资源使用docker stats nginx-server

  8. - 列出对容器的更改docker diff nginx-server

(三)停止容器

使用docker stop命令停止正在运行的容器,后跟容器名称或 ID,如:

docker stop my_container

(四)启动容器

对于已停止的容器,使用docker start命令重新启动,例如:

docker start my_container

或者直接docker restart重启一个容器

docker restart <container>

(五)删除容器

谨慎使用docker rm命令删除容器,因为这会导致容器内数据丢失(未进行数据持久化时)。例如:

docker rm my_container

容器正在运行时需先停止,或使用`docker rm -f`强制删除。

(六)进入容器

使用docker exec命令进入容器内部操作,例如:

docker exec -it my_container /bin/bash

(七)连接容器

  • 使用docker attach命令

可连接到正在运行的容器,但存在多窗口同步等局限性,例如:

docker attach my_container
  • 推荐使用docker exec命令 ,相比之下,docker exec命令更灵活,例如:

docker exec -it my_container /bin/bash

(八)容器的互联

  • 基于网络的容器互联

  1. 创建自定义网络:

docker network create my_network

2. 在创建容器时指定网络:

docker run -it --network=my_network my_container

容器在同一网络中可通过名称相互访问。

  • 基于数据卷的容器互联

使用--volumes-from参数实现容器间的数据共享。例如,先创建一个挂载数据卷的容器:

docker run -v my_volume:/data1 my_container1

再创建另一个容器共享此数据卷:

docker run -it --volumes-from my_container1 my_container2

这样my_container2可访问my_container1挂载的数据卷。

(九)容器的导入导出

  • -导出容器

使用docker export命令将容器导出为tar包,例如:

docker export my_container > my_container.tar
  • 导入容器

使用docker import命令将tar包导入为新镜像,例如

cat my_container.tar | docker import - my_new_image:tag

(十)重命名容器

docker rename my-nginx nginx-server

(十一)更新容器

docker update --cpu-shares 512 -m 300M nginx-server

二、镜像管理

(一)拉取镜像

  • 拉取指定版本和架构的镜像

从 Docker 仓库拉取指定版本和架构的镜像,需在镜像名称后添加版本标签和架构信息。例如,拉取`nginx`的`1.21.6`版本且适用于`amd64`架构的镜像:

docker pull nginx:1.21.6-amd64
  • 拉取最新版本镜像

不指定版本标签时,默认拉取最新版本镜像,如:

docker pull nginx

(二)查看本地镜像

使用docker images命令查看本地已下载的镜像列表,显示镜像名称、标签、ID、创建时间及大小等信息。

(三)创建镜像

  • 基于容器创建镜像

对容器进行修改后,使用docker commit命令保存为新镜像。例如:

docker commit -m "描述信息" -a "作者信息" my_container my_new_image:tag

其中-m添加提交描述信息,-a指定作者信息,my_container为容器名称或 ID,my_new_image:tag为新镜像名称和标签。

  • 使用 Dockerfile 创建镜像

Dockerfile是定义镜像构建的文本文件。例如:

FROM ubuntu

RUN apt-get update && apt-get install -y some_package

CMD ["echo", "Hello, Docker!"]

使docker build命令构建镜像:

docker build -t my_image:tag.

其中-t指定镜像名称和标签,.表示Dockerfile所在当前目录。

(四)镜像的导出导入

  • 导出镜像

使用docker save命令将镜像导出为tar包,例如:

docker save -o my_image.tar my_image:tag
  • 导入镜像

使用docker load命令将tar包导入为新镜像,可使用以下两种方式:docker load --input my_image.tardocker load < my_image.tar

(五)删除镜像

使用docker rmi命令删除本地镜像,例如:docker rmi my_image:tag

三、网络管理

一些基础命令

docker network ls  列出网络

docker network rm <network_name>  删除网络

docker inspect MyContainer | grep Network 获取容器连接的网络

docker network inspect <network_name>  或许网络有关信息

docker network connect <network_name> <container_name> 将正在运行的容器连接到网络

docker run -it -d --network=<network_name> <container_name> 启动时将容器连接到网络

docker network disconnect <network_name> <container_name> 断开容器与网络的连接

(一)端口映射

在创建容器时,使用`-p`参数进行端口映射,使容器内部服务可被外部访问。例如,将容器内`80`端口映射到主机`8080`端口:

docker run -p 8080:80 my_container

(二)容器网络互联

  • 创建自定义网络

使用docker network create命令创建网络,如:

docker network create my_network

docker network create -d overlay MyOverlayNetwork

docker network create -d bridge MyBridgeNetwork

自定义网络子网和网关

   docker network create -d overlay \ --subnet=192.168.0.0/16 \ --subnet=192.170.0.0/16 \ --gateway=192.168.0.100 \ --gateway=192.170.0.100 \ --ip-range=192.168.1.0/24 \ --aux-address="my-router=192.168.1.5" \ --aux-address="my-switch=192.168.1.6" \ --aux-address="my-printer=192.170.1.5" \ --aux-address="my-nas=192.170.1.6" \ MyOverlayNetwork

  • 容器连接到自定义网络

创建容器时指定网络,例如:

docker run -it --network=my_network my_container

参数,例如:

docker防重点覆盖,这一特性对一些特殊的容器部署场景很有用,比如需要容器与主机网络环境完全一致的情况。例如:

docker run --network=host my_container

四、仓库操作

(一)登录仓库

从私有仓库拉取或推送镜像前,需使用`docker login`命令登录仓库,例如:

docker login registry.example.com

按提示输入用户名和密码即可。

(二)推送镜像到仓库

使用docker push命令将本地镜像推送到仓库,例如:

docker push my_image:tag registry.example.com/my_image:tag

(三)拉取镜像从仓库

使用docker pull命令从仓库拉取镜像,例如:

docker pull registry.example.com/my_image:tag

(四)安装并运行本地 registry 仓库

  • 安装并运行本地 registry 仓库

使用docker run命令安装并运行本地registry仓库,例如:

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

  1. 配置本地 registry 仓库

为正常使用本地`registry`仓库,需对`docker`进行配置。例如,修改`daemon.json`文件,添加本地`registry`仓库地址:

{

  "insecure-registries": ["localhost:5000"]

}

然后重新加载docker配置:

systemctl daemon-reload
systemctl restart docker

五、数据管理

(一)数据卷

数据卷用于容器和主机间的数据共享。

  • 创建数据卷

使用docker volume create命令创建数据卷,例如:

docker volume create my_volume

  • 挂载数据卷到容器

创建容器时使用-v参数挂载数据卷,例如:

docker run -v my_volume:/data my_container

这样容器内/data目录与数据卷my_volume挂载,实现数据共享。

(二)挂载主机目录到容器

  • 挂载主机目录做数据卷

直接挂载主机目录到容器作为数据卷,例如:

docker run -v /host/directory:/container/directory my_container

主机/host/directory目录挂载到容器/container/directory目录。

  • 挂载主机文件做数据卷

挂载主机文件到容器作为数据卷,例如:

docker run -v /host/file:/container/file my_container

主机`/host/file`文件挂载到容器`/container/file`文件。

(三)容器间共享卷

容器间通过`--volumes-from`参数共享数据卷。例如,先创建一个挂载数据卷的容器:

docker run -v my_volume:/data1 my_container1

再创建另一个容器共享此数据卷:

docker run -it --volumes-from my_container1 my_container2

my_container2可访问my_container1挂载的数据卷。

(四)docker cp

docker cp命令用于容器和主机之间复制文件。例如,将主机上文件复制到容器内:

docker cp /host/file my_container:/container/file

或将容器内文件复制到主机上:

docker cp my_container:/container/file /host/file

(五)容器数据备份与恢复

  • 数据备份

可以结合docker cp命令和数据卷挂载,定期备份容器内重要数据。例如,备份容器my_container/data目录到主机/backup目录:

docker cp -a my_container:/data /backup

这里-a参数用于保留文件属性。

  • 数据恢复

若需要恢复数据,可以将备份文件复制回容器相应位置。例如,将主机`/backup/data`目录下的文件恢复到容器my_container/data目录:

docker cp -a /backup/data my_container:/data

通过掌握这些 Docker 常用命令,程序员可以更高效地进行容器化应用的开发、部署和管理。在实际应用中,根据具体需求灵活运用这些命令,有助于提升工作效率和应用的可靠性。同时,了解容器数据备份与恢复的方法,能更好地应对数据丢失风险,保障应用的稳定性。