Docker常用命令汇总
- 一、Docker启动命令
- 二、镜像
- 2.1、列出本地镜像
- 2.2、查询镜像
- 2.3、拉取镜像
- 2.4、查询镜像/容器/数据卷所占空间
- 2.5、删除镜像
- 2.6、删除虚悬镜像
- 三、容器
- 3.1、启动容器
- 3.2、查看容器
- 3.3、退出容器
- 3.4、启动 / 重启 / 停止 容器
- ☆ 3.5、删除容器
- ☆ 3.6、进入正在运行的容器
- ☆ 3.7、查看容器日志
- 3.8、查看容器内部信息
- 3.9、备份容器
- 四、容器数据卷 volumes
- 4.1、启动容器并创建数据卷
- 4.2、继承父类 数据卷 挂载规则
- 五、DockerFile
- 5.1、指令
- 六、Docker网络
- 6.1、网络常用命令
- 6.1.1、查看docker网络模式命令
- 6.1.2、docker network --help
- 6.2、docker network能干什么
- 6.3、docker 网络模式
- 6.3.1、使用host模式启用容器
- 6.3.2、使用container模式启用容器
- 6.3.3、使用自定义网络模式
- 七、Docker-compose容器编排
- 7.1、下载安装
- 7.2、compose常用命令
- 7.3、compose大致流程
- 7.4、docker-compose.yml文件解析
一、Docker启动命令
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemct enable docker
# 查看docker概要信息
docker info
二、镜像
2.1、列出本地镜像
# 列出本地已有镜像
docker images
# 列出所有镜像
docker images -a
# 列出镜像ID
docker images -q
2.2、查询镜像
# 查询mysql镜像
docker search mysql
# 查询mysql镜像只列出一个
docker search mysql --limit 1
例子:
$ docker search mysql --limit 1
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13948 [OK]
- STARS:点赞数
- OFFICIAL:官方认证
2.3、拉取镜像
# 拉取最新版本的mysql镜像
docker pull mysql
# 拉取5.7版本的mysql镜像
docker pull mysql:5.7
2.4、查询镜像/容器/数据卷所占空间
docker system df
2.5、删除镜像
# 删除镜像名称为redis的镜像
docker rmi redis
# 删除镜像ID为 2f1sd3g32sd 的镜像
docker rmi 2f1sd3g32sd
# 强制删除所有镜像
docker rmi -f $(docker images -qa)
2.6、删除虚悬镜像
仓库名、标签都是
<none>
的镜像,俗称虚悬镜像 dangling image
# 查看所有虚悬镜像
docker image ls -f dangling=true
# 删除所有虚悬镜像
docker image prune
三、容器
参数 | 描述 | 示例 |
| 指定容器名称 | –name mysql5.7 |
| 后台运行容器并返回容器ID,也即启动守护式容器(后台运行) | — |
| 以交互模式运行容器,通常与-t同时使用 | — |
| 为容器重新分配一个伪输入终端,通常与-i同时使用 | — |
| 指定端口映射 | -p 3306:3306 |
| 随机端口映射 | — |
3.1、启动容器
# 交互式运行最新版本的ubuntu容器,并命名为ubuntuTest
docker run -it --name ubuntuTest ubuntu
# 交互式运行 redis:6.0.8 容器
docker run -it redis:6.0.8
# 后台守护式运行 redis:6.0.8 容器
docker run -d redis:6.0.8
# 启动并设置容器开机自启,并将宿主机与容器的时间进行挂载,直接使用宿主机的时区
docker run -d --restart=always -v /etc/localtime:/etc/localtime redis:6.0.8
容器创建后也可以通过update
命令实现容器的开机自启动
如果创建时未指定--restart=always
,可通过 update 命令设置:
# docker update --restart=always [容器ID 或 容器名]
docker update --restart=always mysql5.7
--restart
具体参数值详细信息如下:
-
no
默认值,表示容器退出时,docker不自动重启容器 -
on-failure
只有在非0状态退出时才重新启动容器; -
always
无论退出状态是如何,都重启容器;
3.2、查看容器
-a: 列出当前所有正在运行的容器+历史上运行过的
-l: 显示最近创建的容器
-n: 显示最近n个创建的容器
-q: 静默模式,只显示容器编号
# 查看正在运行容器
docker ps
# 查看正在运行 + 历史运行过的容器
docker ps -a
# 查看正在运行的容器编号
docker ps -q
3.3、退出容器
# 退出并停止容器
exit
# 退出不停止容器
ctrl + p + q
3.4、启动 / 重启 / 停止 容器
docker start [容器ID 或 容器名]
docker restart [容器ID 或 容器名]
docker stop [容器ID 或 容器名]
强制停止容器:docker kill [容器ID 或 容器名]
# 停止所有正在运行的容器
docker stop $(docker ps -q)
☆ 3.5、删除容器
docker rm [容器ID 或 容器名]
# 强制删除名称为ubuntu的容器(慎用!!!!!!)
docker rm -f ubuntu
# 强制删除正在运行的 + 历史创建的所有容器(慎用!!!!!!)
docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm
☆ 3.6、进入正在运行的容器
docker exec -it [容器ID 或 容器名] bash
# 交互式进入容器(exit退出不会停止 推荐使用!!!!)
docker exec -it ubuntuTest bash
# 交互式进入容器(exit退出会停止容器)
docker attach -it ubuntuTest bash
☆ 3.7、查看容器日志
# docker logs --tail=行数 容器名称
docker logs --tail=100 mysql5.7
# docker logs --since 10m 容器名称(--since 10m 是查看此容器10分钟之内的日志情况。)
docker logs --since 10m mysql5.7
3.8、查看容器内部信息
# 查看容器内部运行进程
docker top [容器ID 或 容器名]
# 查看容器内部细节
docker inspect [容器ID 或 容器名]
3.9、备份容器
导出容器:docker export [容器ID] > 文件名.tar
导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
# 导出ubuntu容器
docker export asfadsfhas1g5 > ubuntu.tar
# 导入容器
cat ubuntu.tar | docker import - orange/ubuntu:14.06
四、容器数据卷 volumes
--privileged=true
扩大容器的权限解决挂载目录没有权限的问题
4.1、启动容器并创建数据卷
docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录 [容器ID 或 容器名]
# 启动镜像名为ubuntu的镜像,命名为myUbuntu 并将宿主机的/tmp/ubuntuData目录映射到该容器的/tmp/dockerData目录下 进行数据的共享
docker run -it --privileged=true -v /tmp/ubuntuData:/tmp/dockerData --name=myUbuntu ubuntu
# 设置读写权限
docker run -it --privileged=true -v /tmp/ubuntuData:/tmp/dockerData:ro --name=myUbuntu ubuntu
数据卷读写权限默认为:rw(读写);ro(只读,readonly)
4.2、继承父类 数据卷 挂载规则
docker run -it --privileged=true --volumes-from [父容器] --name=myUbuntu2 ubuntu
docker run -it --privileged=true --volumes-from myUbuntu --name=myUbuntu2 ubuntu
五、DockerFile
大致流程:
1、编写DockerFile文件
->2、执行docker build产生一个Docker镜像
->3、运行镜像
5.1、指令
指令的一般格式为 INSTRUCTION arguments
,指令包括 FROM
、MAINTAINER
、RUN
等。
5.1.1、FROM
格式为 FROM <image>
或FROM <image>:<tag>
。
第一条指令必须为 FROM
指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM
指令(每个镜像一次)。
5.1.2、MAINTAINER
格式为 MAINTAINER <name>
,指定维护者信息。
5.1.3、 RUN
格式为 RUN <command>
或 RUN ["executable", "param1", "param2"]
。
前者将在 shell 终端中运行命令,即 /bin/sh -c
;后者则使用 exec
执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]
。
每条 RUN
指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \
来换行。
5.1.4、EXPOSE
格式为 EXPOSE <port> [<port>...]
。
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
5.1.5、WORKDIR
格式为 WORKDIR /path/to/workdir
。
为后续的 RUN
、CMD
、ENTRYPOINT
指令配置工作目录。
5.1.6、USER 【可忽略】
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
,一般都不指定;
5.1.7、ENV
格式为 ENV <key> <value>
。 指定一个环境变量,会被后续 RUN
指令使用,并在容器运行时保持。
例如:
# 时区设置
ENV TZ Asia/Shanghai
5.1.8、ADD
将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
格式为 ADD <src> <dest>
。
该命令将复制指定的 <src>
到容器中的 <dest>
。 其中 <src>
可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
5.1.9、COPY 【可忽略】
格式为 COPY <src> <dest>
。
复制本地主机的 <src>
(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
。
当使用本地目录为源目录时,推荐使用 COPY
。
5.1.10、VOLUME
格式为 VOLUME ["/data"]
。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
# 将本地文件夹挂在到当前容器
VOLUME /tmp
5.1.11、CMD
指定容器启动后要做的事情,每个 Dockerfile 只能有一条 CMD
命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD
指定的命令。
支持三种格式
-
CMD ["executable","param1","param2"]
使用exec
执行,推荐方式; -
CMD command param1 param2
在/bin/sh
中执行,提供给需要交互的应用; -
CMD ["param1","param2"]
提供给ENTRYPOINT
的默认参数;
5.1.12、ENTRYPOINT
与 RUN
命令相似,但是他不会被 docker run
提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT
,当指定多个时,只有最后一个起效。
当指定了 ENTRYPOINT
参数时, CMD
的含义就发生了变化,不再是直接运行其命令,而是将 CMD
的内容作为参数传递给 ENTRYPOINT
指令,他们两个组合会变成 ENTRYPOINT "CMD"
两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
-
ENTRYPOINT command param1 param2
(shell中执行)。
六、Docker网络
Docker启动后会产生一个名为 docker0
的虚拟网桥,这个网桥可以理解成是一个交换机
,用于容器间的网络通讯
$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:76ff:feef:7f5a prefixlen 64 scopeid 0x20<link>
ether 02:42:76:ef:7f:5a txqueuelen 0 (Ethernet)
RX packets 113 bytes 35860 (35.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 121 bytes 13004 (12.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
6.1、网络常用命令
6.1.1、查看docker网络模式命令
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
ddb5b13b536d bridge bridge local
b2cdb89b153c host host local
f7b58e236559 none null local
其中前两个比较常用:bridge 和 host
- bridge 网桥模式【默认】:
6.1.2、docker network --help
$ docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network //创建一个网络
disconnect Disconnect a container from a network // 中断
inspect Display detailed information on one or more networks // 查看网络数据源信息
ls List networks // 列出所有网络
prune Remove all unused networks // 删除所有未使用的网络
rm Remove one or more networks // 删除一个或多个网络
6.2、docker network能干什么
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
6.3、docker 网络模式
查看IP地址:ip addr
网络模式 | 简介 |
| 为每一个容器分配、设置P等,并将容器连接到一个 |
| 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 |
| 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等。 |
| 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
6.3.1、使用host模式启用容器
# -p 8083:8080 参数可以不加,因为使用宿主机的IP和端口 加这个配置就没有意义了
docker run -d --network host --name tomcat83 tomcat
6.3.2、使用container模式启用容器
# 创建第一个alpine容器
docker run -it --name alpine1 alpine /bin/sh
# 创建第二个容器,并共用上一个容器的IP和端口
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
当第一个容器停掉之后,第二个容器就没有IP和端口了
6.3.3、使用自定义网络模式
因为docker容器内部的ip是有可能发生变化的
因此使用自定义网络可以解决:当容器Ip变动的时候可以通过服务名直接进行网络通信 而不受ip变化的影响
# 1、新建自定义网络(默认为bridge网桥模式)
docker network create orange_network
# 2、新建两个容器,并加入上一步自定义的网络
docker run -d -p 8081:8080 --network orange_network --name tomcat81 tomcat
docker run -d -p 8082:8080 --network orange_network --name tomcat82 tomcat
# 3、分别进入容器
docker exec -it tomcat81 bash
docker exec -it tomcat82 bash
# 4、互相通过服务名ping测试
ping tomcat81
ping tomcat82
当第一个容器停掉之后,第二个容器就没有IP和端口了
七、Docker-compose容器编排
Compose
是Docker
公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml
,写好多个容器之间的调用关系
。然后,只要一个命令,就能同时启动/关闭这些容器
7.1、下载安装
官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
官方下载:https://docs.docker.com/compose/install/
【如果是新装的docker版本,其中自带了 docker-compose 无需安装】
# 查看是否有自带 docker-compose,没有则进行后续安装
docker compose version
-----------------------------------------------------
# 安装扩展源 及 python-pip模块
sudo yum -y install epel-release
sudo yum install python-pip
# 1、官方下载,github可能下载不太稳定,可以使用下面的方式下载
curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
# 高速安装 Docker Compose(`uname -s` 及 `uname -m` 为参数拼接)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.17.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 2、添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 3、创建软连接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 4、测试安装是否成功
$ docker compose version
Docker Compose version v2.16.0
# 5、卸载
sudo rm /usr/local/bin/docker-compose
7.2、compose常用命令
# 查看帮助
docker compose -h
# 启动所有docker-compose服务
docker compose up
# 启动所有docker-compose服务并后台运行
docker compose up -d
# 停止并删除容器、网络、卷、镜像。
docker compose dkwn
# 进入容器实例内部docker--compose exec docker-compose.yml文件中写的服务id/bin/bash
docker compose exec yml里面的服务id
# 展示当前docker--compose编排过的运行的所有容器
docker compose ps
# 展示当前docker-compose编排过的容器进程
docker compose top
# 查看容器输出日志
docker compose logs yml里面的服务id
# 检查配置
dokcer compose config
# 检查配置,有问题才有输出
dokcer--compose config -q
# 重启服务
docker compose restart
# 启动服务
docker-compose start
# 停止服务
docker compose stop
7.3、compose大致流程
- 1、保证部署的java镜像已经生成
- 需要保证配置中调用服务的方式以docker服务名的方式调用;比如访问 mysql的Ip使用 mysql服务名代替
- 2、编写
docker-compose.yml
- 3、在有
docker-compose.yml
文件的目录下执行docker compose **
命令
7.4、docker-compose.yml文件解析
基于若依的docker-compose.yml
文件解析;
若依Gitee网址:https://gitee.com/y_project/RuoYi-Cloud/blob/master/docker/docker-compose.yml
解析参考:Docker Compose 配置文件 docker-compose.yml 详解 :
# compose使用3以后的版本
version : '3'
# 代表有几个服务容器
services:
# 自定义的服务名,也就是docker内部可以互相访问的服务名,可以代替IP
ruoyi-nacos:
# 要执行的镜像名称
image: nacos/nacos-server
# 指定运行时的容器名称,不指定docker会在镜像名称基础上拼接一些随机值
container_name: ruoyi-nacos
# 在构建时应用的配置项。一般直接指定Dockerfile所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。
build:
context: ./nacos
# 设置环境变量。可以使用数组或字典两种格式。
environment:
- MODE=standalone
# 指定所挂载的主机路径或数据卷名称。
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
# 指定使用的网络。多个服务都需指定同一个网络,与最下面的networks相呼应
networks:
- ruoyi-network
# 端口映射
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
# 指定服务之间的依赖关系,解决服务启动先后顺序问题。表示依赖于ruoyi-mysql服务
depends_on:
- ruoyi-mysql
ruoyi-mysql:
container_name: ruoyi-mysql
image: mysql:5.7
build:
context: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_DATABASE: 'ry-cloud'
MYSQL_ROOT_PASSWORD: password
ruoyi-redis:
container_name: ruoyi-redis
image: redis
build:
context: ./redis
ports:
- "6379:6379"
volumes:
- ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
- ./redis/data:/data
command: redis-server /home/ruoyi/redis/redis.conf
ruoyi-nginx:
container_name: ruoyi-nginx
image: nginx
build:
context: ./nginx
ports:
- "80:80"
volumes:
- ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- ruoyi-gateway
links:
- ruoyi-gateway
ruoyi-gateway:
container_name: ruoyi-gateway
build:
context: ./ruoyi/gateway
dockerfile: dockerfile
ports:
- "8080:8080"
depends_on:
- ruoyi-redis
links:
- ruoyi-redis
# 这一行相当于创建一个网络 名为ruoyi-network
networks:
ruoyi-network: