1. 帮助命令
docker version #显示docker的版本信息
docker info #显示更加详细的系统信息,比如镜像和容器的数量,插件信息等等
docker 命令 --help #帮助命令
docker的帮助文档https://docs.docker.com/reference/
2. 镜像命令
1. docker images
-
作用:用于查看本地的镜像有哪些
# 查看镜像,即查看本机的镜像有哪些 docker images root@ubuntu:/home/mylinux# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 11 months ago 13.3kB # 各个参数代表的意思 REPOSITORY #镜像的仓库源 TAG #镜像的标签 IMAGE ID #镜像的id CREATED #镜像的创建时间 SIZE #镜像的大小 # 我们通过help命令查看 更加详细的image命令 docker images --help # 可选项 Options: -a, --all #列出所有的镜像 -q, --quiet #只显示镜像的id (用于删除的时候,后面会演示)
2. docker search 镜像名
-
作用:用于搜索docker hub上的镜像有哪些版本,为了接下来的下载。
-
docker hub是docker官网的镜像仓库,你需要的镜像可以从这里下载。
-
由于是官网指定的,因此,你使用docker search 搜索出来的信息,其实可以直接从docker hub上查询,是一样的。
# 查询镜像名,搜索镜像名 docker search tomcat #可选项 通过搜索来过滤 --filter=stars=3000 #搜索出来的镜像就是stars大于3000的
-
我们还可以去docker hub上去查看tomcat的镜像,官网:https://hub.docker.com/
-
我们直接搜索tomcat ,则出现下面的图片。
-
之后点击tags,选择你要下载的版本。后面可以直接复制下载的命令。
3. docker pull 镜像名字:tag
-
作用:拉取你想要的镜像,即下载镜像。
-
tag的作用是 区别不同的版本,比如tomcat9 有版本1,版本2,跟latest(最新的意思)
不指定版本,则默认下载最新版本的。# 下载镜像 docker pull 镜像名字:tag # 不加tag 下载 root@ubuntu:/home/mylinux# docker pull tomcat Using default tag: latest #不加tag 默认下载最新版 latest: Pulling from library/tomcat 756975cb9c7e: Pull complete #分层下载,dockerimage的核心 联合文件系统(之后再说) d77915b4e630: Pull complete 5f37a0a41b6b: Pull complete 96b2c1e36db5: Pull complete 27a2d52b526e: Pull complete a867dba77389: Pull complete 0939c055fb79: Pull complete 0b0694ce0ae2: Pull complete 81a5f8099e05: Pull complete c3d7917d545e: Pull complete Digest: sha256:a319b10d8729817c7ce0bcc2343a6f97711c7870395019340d96b6aafd6ccbea #签名 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest #然后就可以使用docker images 来查看 自己下载好的镜像 # 加Tag 下载 root@ubuntu:/home/mylinux# docker pull tomcat:9-jdk8-adoptopenjdk-openj9 9-jdk8-adoptopenjdk-openj9: Pulling from library/tomcat da7391352a9b: Pull complete 14428a6d4bcd: Pull complete 2c2d948710f2: Pull complete 7c07f69a5e5c: Pull complete 5f5a50382e0f: Pull complete 83b87ea46150: Pull complete cd1bfe7629bf: Pull complete 2dcb672f941a: Pull complete 18b91b51d128: Pull complete Digest: sha256:c69315e589cf03cdd8a5177f3a09418c4451401994e97be7285aba41339ad7bf Status: Downloaded newer image for tomcat:9-jdk8-adoptopenjdk-openj9 docker.io/library/tomcat:9-jdk8-adoptopenjdk-openj9
3. docker rmi id
-
当我们下载错了镜像,或者不想要某个镜像了,则可以使用docker rmi [对应的id] 进行删除
docker rmi id #删除指定的镜像 docker rmi -f id,id,id #删除多个镜像 # 由于 docker images -aq 中 -a是显示所有镜像信息,-q是指显示镜像id信息 # 一结合就是,显示所有镜像的id 信息,之后就可以批量删除了 docker rmi ${docker images -aq} #删除全部的镜像
-
例子
root@ubuntu:/home/mylinux# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest feba8d001e3f 3 days ago 649MB root@ubuntu:/home/mylinux# docker rmi feba8d001e3f Untagged: tomcat:latest Untagged: tomcat@sha256:57dae7dfb9b62a413cde65334c8a18893795cac70afc3be589c8336d8244655d Deleted: sha256:feba8d001e3f56558228ed129ce9b381936393c093129593d270140e5717d7d0 Deleted: sha256:b50c5dac8a23b5e12785367e9a424fb107228980327cf0805c17514d14978b36 Deleted: sha256:ce9fb501c029639580dbad9716ae9a8bcc71b19089829a587ee4f8f1ceebfa65 Deleted: sha256:e5b7a89ed43e4f99b48f55a885abe442945d2e754a935cbaea3c1c74ffe6750d Deleted: sha256:36e7986244088b22acd453ae20debb710015a64712badf92ea34147fa151fc97 Deleted: sha256:b374669c52b187fdb673ded5587d718dd435ec5516a486a6550d57187fe948cb Deleted: sha256:d452b70fd092c49d82206e68beee70e8adc8515a4ddd9519caeebceac08e296b Deleted: sha256:27b72082eb6718a3e506ca1b77ea96b2d403c52b9b2918fe3aea70bb9180e413 Deleted: sha256:d821f0b05255e659e8513e1bb532c7bbbdce46d54860cffa706ca1e3e81f874f Deleted: sha256:d44584abca138ee35729df0e8d292e971777bf196f084cae5fc33bb4c458b4dc Deleted: sha256:f0e10b20de190c7cf4ea7ef410e7229d64facdc5d94514a13aa9b58d36fca647
3.容器命令(重点)
0. 前言
-
有了镜像才能创建容器,下载一个centos镜像,跟tomcat镜像来测试学习。
-
先把容器的相关命令全部都学习完后,我们再用这两个镜像学习,先让他们两个下载先。
# 先下载个 centos的镜像, 没有指定tag,默认下载最新的 root@ubuntu:/home/mylinux# docker pull centos Using default tag: latest latest: Pulling from library/centos 7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest root@ubuntu:/home/mylinux# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest feba8d001e3f 3 days ago 649MB centos latest 300e315adb2f 13 days ago 209MB
1. 新建容器并启动
# 新建容器并启动
docker run [可选项] image
# 可选项
--name 给容器起一个名字,tomcat01 tomcat02
-d 以后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 2000:8080
-P 随机指定端口
2. 列出所有的运行的命令
# 列出当前正在运行的容器
docker ps
# 列出所有运行过的容器
docker ps -a
# 显示出最近创建的容器,n=2,则表示显示出最近创建的2个容器
docker ps -n=数字
# 只显示正在运行容器的id号
docker ps -q
# 列出所有容器的id,-a是指 所有运行过的容器,-q 是指 显示id
# 一结合就是:列出所有容器的id
docker ps -aq
3. 删除容器
# 删除容器
# 不能删除正在运行的容器,如果要强行 删除 rm -f
docker rm 容器id
# 批量删除容器
docker rm $(docker ps -aq)
# 批量删除容器(包括运行的容器)
docker rm -f $(docker ps -aq)
4. 实战(用docker 安装tomcat)
-
前提,已经拉取好 centos 与tomcat的镜像了。
-
运行tomcat。
# docker run --name=MyTomcat tomcat # docker run 固定命令 # --name 起了个别名 叫MyTomcat # tomcat 代表你要运行的镜像,正常来说是 image:tag,如果不写tag 则默认运行latest # 或者你的镜像中,只有一个tomcat镜像,则可以不写 root@ubuntu:/home/mylinux# docker run --name=MyTomcat tomcat
-
从下面的图片可以看出,tomcat的运行日志直接输出到终端上,而且直接占用了我这个终端,此效果不是很好,因此,我们需要让他在后台执行,此时需要参数 -d。
-
由于上面的运行方式不是我想要的,因此ctrl+c 中止它,并使用docker run -d --name=MyTomcat2 tomcat 再次运行。
-
从上面的图片可以看出,有个ports 8080哦,那我是不是可以直接再浏览器输入 localhost:8080,看见熟悉的欢迎界面了,答案是否定的,因为这个是容器,容器你可以想象为是一个小型的虚拟机,它肯定有它的网络,这个8080端口号是容器里面的端口后,又不是你宿主机的端口号,怎么可能可以访问。但是它的网络,外界无法访问,学习到docker网络的时候会明白,因此,我们需要映射端口号,比如让本机linux的8080端口号对应 tomcat容器的8080端口号,这样子当外界访问本机的8080,相当于访问tomcat容器的8080端口号。下面用图来解释:
-
根据上面分析,我们就再次修改,我们的启动命令。
# -p 本机端口号:容器端口号 docker run -p=8080:8080 -d --name=MyTomcat3 tomcat # 我们会发现第三次启动的tomcat 的ports 中,出现了0.0.0.0:8080-->8080,即映射成功 root@ubuntu:/home/mylinux# docker run -p=8080:8080 -d --name=MyTomcat3 tomcat 28f49470f5ff9e62c1b99cb639377650d48df2b24d65c0a71e31c337019be5e5 root@ubuntu:/home/mylinux# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28f49470f5ff tomcat "catalina.sh run" 6 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp MyTomcat3 a1bbf5cf5fc4 tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 8080/tcp MyTomcat2
-
之后我们在浏览器中运行http://localhost:8080/ 发现还是有错误,怎么会这样子,因此,我们需要去容器查看信息。
# 进入容器内部 # docker exec -it 固定写法,-it 使用交互模式 # id 是 容器运行的id # container-name 你给容器起的别名 # bash linux命令行模式 docker exec -it id/container-name bash # 结果为: root@ubuntu:/home/mylinux# docker exec -it MyTomcat3 bash # 看前面,跟上面不一样,这一串数字,其实是你容器的前面的id号码。 root@28f49470f5ff:/usr/local/tomcat# # 之后我们可以再里面进行查看 # 后面我们发现 在tomcat中,webapps里面居然没有东西,怪不得错误, # 我们还发现 平时webapps里面的东西,居然都在webapps.dist里面, # 因此,我们把webapps.dist的内容copy到webapps下 cd webapps.dist cp -r ./ ../webapps # 之后就可以看见熟悉的欢迎页面了。
-
当你进入容器终端之后,你还想出来本机的终端,请使用exit即可。
-
我们练习一下其他命令(结果自己查看自己的,就不截图了)
# 查看容器情况 docker ps root@ubuntu:/home/mylinux# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28f49470f5ff tomcat "catalina.sh run" 13 minutes ago Up 13 minutes 0.0.0.0:8080->8080/tcp MyTomcat3 a1bbf5cf5fc4 tomcat "catalina.sh run" 27 minutes ago Up 27 minutes 8080/tcp MyTomcat2 # 启动停止容器 docker start id docker restart id docker stop id docker kill id # 输出容器 docker rm a1bbf5cf5fc4 # 停止第二个tomcat root@ubuntu:/home/mylinux# docker stop a1bbf5cf5fc4 doa1bbf5cf5fc4 # 输出第二个tomcat root@ubuntu:/home/mylinux# docker rm a1bbf5cf5fc4 a1bbf5cf5fc4 # 查看剩下tomcat root@ubuntu:/home/mylinux# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28f49470f5ff tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 0.0.0.0:8080->8080/tcp MyTomcat3
-
总结:
- 最终执行tomcat 容器的命令 docker run -p 8080:8080 -d --name=xxx tomcat
- 进入正在运行的容器:docker exec -it id/contain-name bash
4. 其他命令
1. 启动容器命令的补充
# 1. 刚刚我们启动tomcat的时候,使用的命令是
docker run -p 8080:8080 -d -name=xxx tomcat
# 似乎没有问题,那么我们使用类似上面命令启动一个centos
# 当然 端口号不需要则不写,我也不写名字,docker会帮我生成一个随机名字
docker run -d centos
# 似乎很正常的命令,-d 后台执行,当你敲下命令 回车,查看 docker ps
root@ubuntu:/home/mylinux# docker run -d centos
2be5ce5ee4a257cc62f4403b995bb680440fe9355e474b5fbd5c2c1e860059c6
# 居然只有tomcat的容器运行,没有centos,之后再次使用docker ps -a查看
root@ubuntu:/home/mylinux# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28f49470f5ff tomcat "catalina.sh run" 28 minutes ago Up 28 minutes 0.0.0.0:8080->8080/tcp MyTomcat3
# 我们惊奇发现有centos了,那么就是它被停止了?我没有停止它啊
# 对这个就是要补充的内容。
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# 容器启动后,发现前台没有提供服务,就会立刻停止,就是没有程序了
# tomcat 启动后最终会有个线程监听8080端口是否有信息,因此不会被停止
# 所以针对这种容器,我们需要加上 -it的参数,表示 交互模式
root@ubuntu:/home/mylinux# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2be5ce5ee4a2 centos "/bin/bash" 13 seconds ago Exited (0) 12 seconds ago inspiring_vaughan
28f49470f5ff tomcat "catalina.sh run" 29 minutes ago Up 28 minutes 0.0.0.0:8080->8080/tcp MyTomcat3
# 输入命令,当然你可以先把刚刚的centos容器删除了,防止干扰你的视野
# docker rm -f centos-id/centos-container-name
# docker run -it -d centos
root@ubuntu:/home/mylinux# docker rm -f inspiring_vaughan
inspiring_vaughan
root@ubuntu:/home/mylinux# docker run -it -d centos
a5b4a0d0394007642abb400c57bdfa80d54607678f1285f26940f671c90fcb66
# 已经运行了
root@ubuntu:/home/mylinux# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5b4a0d03940 centos "/bin/bash" 2 seconds ago Up 1 second keen_feistel
28f49470f5ff tomcat "catalina.sh run" 34 minutes ago Up 34 minutes 0.0.0.0:8080->8080/tcp MyTomcat3
2. 日志查看
# 命令格式
docker logs -f id
# 可选项
# -tail 10 显示n条信息
docker logs -f -tail n id
# 例子 MyTomcat3
root@ubuntu:/home/mylinux# docker logs -f --tail 10 28f49470f5ff
21-Dec-2020 10:36:24.253 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/examples]
21-Dec-2020 10:36:24.942 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/examples] has finished in [690] ms
21-Dec-2020 10:36:24.946 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/host-manager]
21-Dec-2020 10:36:25.027 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/host-manager] has finished in [81] ms
21-Dec-2020 10:36:25.028 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/manager]
21-Dec-2020 10:36:25.092 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [64] ms
21-Dec-2020 10:36:25.094 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/docs]
21-Dec-2020 10:36:25.159 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/docs] has finished in [65] ms
21-Dec-2020 10:36:25.160 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/ROOT]
21-Dec-2020 10:36:25.213 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [53] ms
3. 查看容器内部中进程信息
# docker top id
root@ubuntu:/home/mylinux# docker top 28f49470f5ff UID PID PPID C STIME TTY TIME CMD
root 15548 15521 0 18:27 ? 00:00:19 /usr/local/openjdk-11/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
4. 查看容器的元数据
-
元数据:就是一些配置信息,乱七八糟的,后面有需要可以去看。
# 查看镜像的元数据 # 信息量很大,就不截图了 docker inspect id
5. 从容器内部拷贝文件到主机上
# 从容器内拷贝文件到主机上
docker cp id:内路径 目的主机路径
# 例子
docker cp abf9d9160caf:/test.java /home
这个拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现,自动同步
-
例子:在刚刚的tomcat容器中,我们有个webapp目录,我们将它copy到本机的home目录下中。
-
进入webapps中查看。
root@ubuntu:/home/webapps# ls docs examples host-manager manager ROOT