Docker 常用命令
Docker 常用命令
0、对docker容器和镜像的一点理解
- Docker的镜像是只读的
- Docker的镜像是由多个块组成的,主要的作用是用于复用。
- 可以理解为docker的镜像是若干个积木组成的,例如centos积木、Ubuntu积木、JDK积木、python积木、tomcat积木。。。根据这些积木拼接就完成了某个镜像。当然了centos积木可能又是若干个积木组成的。其他的积木也一样
- 有了这些积木,我们就可以减少每个镜像占用的硬盘空间
- CentOS积木+JDK积木+Tomcat积木=Java运行镜像
- CentOS积木+Python积木=Python镜像
- 这里我们就复用了CentOS,以此为例docker的分块技术真的很强有没有!
- CentOS积木的底层可能还被分了好几个,比如:CentOS6和CentOS7镜像也可以公用相同的内容。
- 积木分的越细,复用性就越高
- Docker的底层用到了UFS(联合文件系统)
- Docker启动多个容器并不会占用很多硬盘空间。它只会占用除了镜像内容外额外修改的部分。即容器就是将镜像做为积木,再拼一块新的积木。容器只会多占用这块额外的积木。这里的处理类似于Git、SVN。
- 容器可以制作成新的镜像,这个镜像只是将上述的积木拼接好后设置为只读状态,就像git中的一个release而已。
- docker把代码托管的思想用到了运维上
- 可以将容器commit为新的镜像,保存后会产生一个新的tag
- 我们可以轻松的获取镜像各个时期的tag,并且可以在占用硬盘很小的情况下运行、修改
- 以前以为docker hub需要很大的硬盘来存储如此海量的镜像,但其实docker hub只需要存储很多积木可以了
1、镜像命令
1.1、docker images (镜像操作)
# 查看docker中的所有镜像
docker images
# 输出
REPOSITORY TAG IMAGE ID CREATED SIZE
# 解释
REPOSITORY: 仓库源
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 创建时间
SIZE: 镜像大小
# 拓展参数
-a 显示所有镜像(默认即为-a) AS: docker images -a
-f 结果过滤 AS: docker images -f params
-q 只显示镜像id AS: docker images -q
1.2、docker search (查询镜像)
# 搜索docker hub中的镜像
docker search <imageName>:[tag]
# 参数介绍
imageName: 镜像名称 不可省略
version: 版本,可省略 默认为lates
# 拓展参数
-f 过滤查询结果(即filter,过滤结果)
1.3、docker pull(拉取镜像)
# 从docker hub中下载镜像
docker pull <imageName>:[tag]
# 参数介绍
imageName: 镜像名称 不可省略
version: 版本,可省略 默认为lates
# 例
docker pull mysql:5.7.25
# pull某个镜像时,docker会下载多个文件
# docker将镜像分为若干个包,可以达到复用的效果
1.4、docker rmi (删除镜像)
# 删除镜像 可以同时删除多个镜像id
docker rmi <imageID> [imageID] [imageID] [imageID]
# 删除所有镜像
docker rmi -f ${docker images -aq}
2、容器命令
容器是镜像的实例,一个镜像可以启动多个实例。所以有镜像才能运行容器。
2.1、docker run(运行容器)
# 根据指定镜像 启动一个容器
docker run [可选参数] <imageName>:[tag]
# 指定容器的名字 案例:启动容器并修改名称
--name="name" AS: docker run -=name myTomcat tomcat:8.5.6
# 后台方式运行 案例:后台启动容器 效果类似于nohup
-d AS: docker -d tomcat:8.5.6
# 端口映射 案例:将容器的8080端口映射到宿主机的80端口 主机端口:容器端口
-p AS: docker run -p 8080:80 tomcat:8.5.6
# 随机映射端口(大写P) 案例:将容器的8080端口随机映射到宿主机的某个端口
-P AS: docker run -P 8080 tomcat:8.5.6
# 将docker容器中的某个目录与宿主机的目录绑定 宿主机目录:容器目录 类似于-p用法 这里我们放在8中详细说一下
-V AS: docker run -v /opt/docker:/opt/ tomcat:8.5.6
# docker重启后、服务异常退出后 自动启动
--restart=always AS:AS: docker run --restart=always tomcat:8.5.6
# 启动并进入容器 通过此方式进入容器后 可以exit退出,但是退出后容器会自动停止(可以使用CTRL+P+Q仅退出)
# -it实际是 -i + -t ,-it意为当容器内命令执行完毕时,分配一个终端
-it AS: docker run -it tomcat:8.5.6
# 指定环境变量,容器中可以使用此环境变量 -e key=v
-e AS: docker run -e MYSQL_ROOT_PASSWORD=mypassword -d mysql:tag
# 用完即删除
--rm AS: 加上此次数后,停止容器即会删除
# 赋予容器所有权限
--privileged=true
参数可以添加多个,不区分顺序
详细可参考:https://blog.csdn.net/weixin_39998006/article/details/99680522
2.2、docker ps (查看容器)
# 查看正在运行的docker容器
docker ps
# 查看曾经运行过的docke容器
docker ps -a
# 查看最新创建的N个容器
docker ps -n=N
# 只显示容器的编号
docker ps -q
# 参数可以同时加多个 例如
docker ps -aq
2.3、docker rm (删除容器)
# 删除一个或多个容器
docker rm <容器id> [容器id] [容器id] [容器id] [容器id]
# 删除所有容器
docker rm -f ${docker ps -aq}
# 批量删除已经退出的容器
docker rm -v $(docker ps -aq -f status=exited)
2.4、docker start / stop(停止/启动容器)
# 停止容器
docker stop 容器ID/容器name
# 快速停止
docker kill 容器ID/容器name
# 启动停止的容器
docker start 容器ID/容器name
# 重启容器
docker restart 容器ID/容器name
2.5、docker exec (进入容器)
# 进入一个启动中的容器 (未启动的容器不能启动)
docker exec -it 容器id/容器名 bash
# exit可退出容器 推出后不会影响容器的运行
2.6、docker attach(进入容器)
# 进入容器的第二种方式
docker attach 容器id/容器名
# 与docker exec的区别是,docker attach是继续执行容器内正在活跃的线程。例如进入一个SpringBoot的容器,就是打印项目日志。但是ctrl + c后会自动关闭。。
3、docker logs(查看容器日志)
# 查看容器日志
docker logs [参数列表] 容器ID/容器name
# 参数说明
# 跟踪日志
-f AS: docker logs -f 容器ID/容器name
# 显示时间戳
-t AS: docker logs -t 容器ID/容器name
# 显示最后N行
--tail AS: docker logs -f --tail=50 容器ID/容器name
# 参数可以是一个或多个 此命令可以查看自己部署的springboot应用等日志
docker logs -ft --tail=50 容器ID/容器name
# PS:一个小问题:
# 查看日志时发现日志的颜色会影响控制台的颜色,如果打印日志的时候页面纯黑,建议切换一下主题,可能时日志和背景颜色相同的原因。
4、docker top(查看容器中的进程信息)
# 查看容器内的进程信息docker top 容器ID/容器name
5、docker inspect (查看容器的详细信息)
# 查看容器内部的信息
docker inspect 容器ID/容器name
6、docker cp(宿主机与容器之间文件拷贝)
# 拷贝一个文件到宿主机
docker cp 容器ID:容器内的路径 宿主机路径
# 案例: 将docker中/opt/conf.conf拷贝到宿主机的opt目录
docker cp 0ce72369a147:/opt/conf.conf /opt
# 此命令无论容器是否启动都可执行
# 此方法同样适用于从宿主机拷贝到容器,只需要调换顺序即可
docker cp /opt/test.java 0ce72369a147:/opt
7、docker commit命令(将容器打包为新的镜像)
# 提交容器成为一个新的镜像
docker commit -m="描述" -a="作者" 容器ID 目标镜像名:[tag]
# docker其实就是容器->镜像的一个过程,是将容器内的数据固化,提交为镜像后就无法修改,如果需要修改只能重新拼接新的积木(以此镜像为基础产生新的容器再修改)
8、docker容器卷
前面我们学习了将docker的容器制作为镜像
如果我们使用docker安装了一个MySQL\Oracle,那么我们的数据都是存储在容器中的,如果将容器删除数据也将被删除(镜像是只读的,不会同步最新的数据)。为了解决这个问题,我们可以使用docker的容器卷技术(数据共享技术)
容器卷技术可以将docker容器中的数据同步到本地。
目录映射本质是连接,不会占用两份空间。
8.1、-v (指定目录挂载)
将docker目录映射到宿主机
# 挂载目录 宿主机目录:容器目录 如果宿主机中没有此目录 会自动创建docker run -v /opt/docker:/opt/ tomcat:8.5.6# 此时 容器内的数据修改后,宿主机的文件会同时修改# 修改宿主机后,虚拟机的文件也会同步改变
8.2、匿名挂载/具名挂载
容器卷可以不指定宿主机的目录,docker会自动帮我们生成一个目录
# 匿名挂载目录
docker run -v /opt/ tomcat:8.5.6
# 具名挂载 挂载并指定volume名 此时再次docker volume ls即可查看到名称
docker run -v 卷名:/opt/ tomcat8.5.6
8.3、volume ls 、inspect volume(查看卷信息/详情)
# 查看所有挂载卷的名称
docker volume ls
# 查看卷的详细信息
docker inspect volume 卷名
8.4、具名挂载和指定目录挂载的区别
具名挂载不以/
开头
指定目录挂载以/
开头
匿名挂载只有容器中的目录名称
8.5、rw、ro(挂载目录并指定读写权限)
# 挂载时可以在目录后加入读写权限 ro rw等。
docker run -v 卷名:/opt/:rw tomcat8.5.6
docker run -v 卷名:/opt/:ro tomcat8.5.6
# ro 只能从外部改变,不能在容器内部操作
# rw 默认 可读可写
8.6、volume rm 、volume prune(删除容器卷)
容器删除后,挂载目录会被删除吗?答案是 不会
# 删除容器卷
docker volume rm 卷ID
# 删除所有未使用容器卷
docker volume prune
8.7、--volumes-from(容器和容器之间共享挂载卷)
# 启动容器1 挂载一个目录docker run --name=volume-test1 -d -v /docker/volume-test:/opt 110a4661ceaa# 启动容器2 指定容器卷为容器1docker run --name=volume-test2 -d --volumes-from volume-test1 110a4661ceaa# 启动容器3 指定容器卷为容器1docker run --name=volume-test3 -d --volumes-from volume-test1 110a4661ceaa# 启动容器4 指定容器卷为容器3docker run --name=volume-test4 -d --volumes-from volume-test3 110a4661ceaa
---volumes-from作用是继承某个容器的挂载信息,继承后即使原容器删除,也不影响它的挂载。因为挂载的本质都是link。
9、docker tag(给镜像打标签)
docker tag 用于给镜像打标签,语法如下:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
① 比如我现在有一个 centos 镜像:
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
② 我对 centos 进行开发,开发了第一个版本,我就可以对这个版本打标签,打完标签后会生成新的镜像:
[root@localhost ~]$ docker tag centos centos:v1
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
centos v1 1e1148e4cc2c 2 weeks ago 202MB
③ 我继续对 centos 进行开发,开发了第二个版本,继续打标签:
[root@localhost ~]$ docker tag centos centos:v2
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
centos v1 1e1148e4cc2c 2 weeks ago 202MB
centos v2 1e1148e4cc2c 2 weeks ago 202MB
④ 以此类推,每开发一个版本打一个标签,如果以后我想回滚版本,就可以使用指定标签的镜像来创建容器:
[root@localhost ~]$ docker run -itd centos:v1
参考:https://www.cnblogs.com/pzk7788/p/10180919.html
10、docker save(将镜像打包为tar)
# 语法docker save [OPTIONS] IMAGE [IMAGE...]# OPTIONS 说明:-o :输出到的文件。# 实例 docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
11、docker load(加载tar包到docker)
# 语法
docker load [OPTIONS]
# OPTIONS 说明:
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
# 案例
docker load < busybox.tar.gz
docker load --input fedora.tar
docker export import可以实现容器的导入和导出,但是由于是容器不是镜像数据量比较大,一般很少用
12、推送镜像到Docker Hub
推送镜像到docker hub的方法非常简单,只有以下三步
1、注册docker hub账号
https://registry.hub.docker.com/
2、docker login
# 登录docker hub
docker login -u username
password
3、docker push
# 推送镜像到docker hub 需要保证此镜像名在docker hub不存在
docker push imageName:tag
推送到阿里云镜像加速也是同样的道理,只需要按照阿里的操作文档进行即可。
13、docker 网络
-
docker 会为每个容器虚拟一块网卡,所以每个容器都拥有自己的ip地址,docker也会为宿主机分配一个虚拟网卡,这块网卡和docker容器是在同一个网段。并且宿主机还将承担“路由器”的作用。
-
docker中的所有容器默认是可以通过虚拟网卡的ip进行通讯的
13.1、--link (配置容器通讯)
-
如果服务之间要通讯,IP就必须硬编码,IP发生变化后还需要进行修改
-
我们也可以通过容器名称来进行容器间的通讯,这里就需要使用--link了
-
配置link的原理就是配置了宿主机配置hosts,来达到类似于dns的效果
# 语法
docker run -d --name 容器1 --link 容器2 镜像ID/镜像名:tag
# 示例
docker run -d --name mysql1 --link mysql2 mysql:lates
# 说明
# 加上--link后,容器1就可以通过,容器2的容器名之通讯了
# 但是容器2无法通过容器1的名称与它通讯,如果要实现必须让容器2 --link 容器1
# 打开hosts 观察后发现
172.18.0.3 name id
13.2、docker network (查看网络信息)
# 查看网络配置
docker network ls
docker inspect 网络ID
13.3、--net bridge
# docker容器在启动时有一个隐式参数
--network bridge
# 这段代码的作用是将容器默认桥接到docker0,即宿主机的虚拟网卡
13.4、docker自定义网络
# 语法
docker network create --driver bridge --subnet 子网掩码/位数 --gateway 网关IP 网络名
# 自定义一个网络并设置网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
13.5、--net (启动容器时,将其分配到某个网络中)
# 语法
docker run --name 容器名 --net 网络名 镜像ID/镜像名:tag
# 示例
docker run -d - P --name mysql5725 --net mynet mysql
# 自定义网络中可以直接通过容器名来访问其他容器
使用自定义网络的优点:保证不同集群环境的网络隔离
13.6、connect将容器加入到某个网络中(打通两个网络)
# 语法
docker network connect 网络名 容器名
# 示例
docker network connect mynet mysql
# 查看net信息
docker network ls
docker network inspect mynet
# 其实这个命令的本质是将此容器加入到mynet中,使得这个容器具有两个网络的IP地址
14、--help (查看帮助)
当忘记某个命令的操作时,只需要加上-- help即可。
docker network --help
docker ps --help
docker inspect --help
docker rm --help
...
15、update(更新容器属性)
# 已有的容器更新为自动重启
docker update --restart=always 容器ID(或者容器名)
16、容器内无法联网解决方案
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
systemctl restart docker