zoukankan      html  css  js  c++  java
  • 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安装了一个MySQLOracle,那么我们的数据都是存储在容器中的,如果将容器删除数据也将被删除(镜像是只读的,不会同步最新的数据)。为了解决这个问题,我们可以使用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
    
  • 相关阅读:
    必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。解决方法
    使用NPOI导出导入导出Excel
    使用jquery ajaxForm提交表单
    VS2013创建Windows服务
    mysql查询锁表及解锁
    selenium学习笔记(1)
    进程基本知识
    多任务原理
    数据转化之JSON
    安装Treserocr遇到的问题
  • 原文地址:https://www.cnblogs.com/zhangruifeng/p/14801057.html
Copyright © 2011-2022 走看看