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进行通讯的

  • 如果服务之间要通讯,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
posted @ 2020-08-22 13:57  张瑞丰  阅读(161)  评论(0编辑  收藏  举报