.png)
Docker 常用命令指南
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、镜像名称、创建时间、状态及端口映射等信息。
查看所有容器,
docker ps -a
命令可查看包括已停止的所有容器- 查看日志,
docker logs nginx-server
- 检查容器,
docker inspect nginx-server
- 容器事件,
docker events nginx-server
- 公共端口,
docker port nginx-server
,80/tcp -> 0.0.0.0:8080,容器的端口 80 映射到宿主机的 8080 端口。- 运行进程,
docker top nginx-server
- 容器资源使用,
docker stats nginx-server
- 列出对容器的更改,
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
(八)容器的互联
基于网络的容器互联
创建自定义网络:
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.tar
或docker 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
配置本地 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 常用命令,程序员可以更高效地进行容器化应用的开发、部署和管理。在实际应用中,根据具体需求灵活运用这些命令,有助于提升工作效率和应用的可靠性。同时,了解容器数据备份与恢复的方法,能更好地应对数据丢失风险,保障应用的稳定性。