docker 基础入门知识和一些常用命令解析
一 docker 常用命令
1.1 镜像命令
镜像相当于 java 中的类,一个 Java 类能生成多个实例,同样的一样镜像也能生成多个容器。
1.1.1 查询镜像
docker images #列出本地主机上的
yishui@yishui:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 8 weeks ago 1.84kB
- REPOSITORY : 镜像的仓库源
- TAG : 镜像的标签
- IMAGE ID : 镜像的 id
- CREATED : 镜像的创建时间
- SIZE : 镜像的大小
同一个仓库源可以由多个 TAG,代表这个仓库源的不同版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果不能指定一个镜像的版本标签,可以只使用 如 ubuntu ,docker 将默认使用 ubuntu:latest 镜像。
参数说明
-a 列出本地所有的镜像(含中间映像层)
-q 只显示镜像地
–digests 显示镜像的摘要信息
–no-trunc 显示完整的镜像信息
1.1.2 搜索镜像
dokcer search 某个镜像的名字
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
yishui@yishui:~$ docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tomcat is an open source implementati… 2300 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 62 [OK] dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 52 [OK] davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 with… 34 [OK] bitnami/tomcat Bitnami Tomcat Docker Image 27 [OK] cloudesire/tomcat Tomcat server, 6/7/8 14 [OK] tutum/tomcat Base docker image to run a Tomcat applicatio… 11 aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 11 [OK] meirwa/spring-boot-tomcat-mysql-app a sample spring-boot app using tomcat and My… 11 [OK] jeanblanchard/tomcat Minimal Docker image with Apache Tomcat 8 arm32v7/tomcat Apache Tomcat is an open source implementati… 6 rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 3 [OK] maluuba/tomcat7-java8 Tomcat7 with java8. 3 amd64/tomcat Apache Tomcat is an open source implementati… 2 fabric8/tomcat-8 Fabric8 Tomcat 8 Image 2 [OK] arm64v8/tomcat Apache Tomcat is an open source implementati… 2 99taxis/tomcat7 Tomcat7 1 [OK] camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK] 1and1internet/debian-9-java-8-tomcat-8.5 Our tomcat 8.5 image 0 [OK] s390x/tomcat Apache Tomcat is an open source implementati… 0 picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 0 [OK] oobsri/tomcat8 Testing CI Jobs with different names. 0 cfje/tomcat-resource Tomcat Concourse Resource 0 jelastic/tomcat An image of the Tomcat Java application serv… 0 swisstopo/service-print-tomcat backend tomcat for service-print "the true, … 0
-
NAME:镜像仓库源的名称
-
DESCRIPTION:镜像的描述
-
OFFICIAL:是否 docker 官方发布
参数说明
-s 点赞数大于 如:docker search -s 30 tomcat
–no-trunc 说明不要被省略
–automated 只罗列出 automated build 类型的镜像
1.1.3 拉取镜像
docker pull 某个镜像的名字
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
yishui@yishui:~$ docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 741437d97401: Pull complete 34d8874714d7: Pull complete 0a108aa26679: Pull complete eea0f08c7492: Pull complete ca74b3d90c15: Pull complete f11a643c4a85: Pull complete 05eafed73b65: Pull complete f24105f282aa: Pull complete e27e73cbbd3f: Pull complete 801f808615c2: Pull complete 294f3735a5f6: Pull complete Digest: sha256:2af4741120ac4b2e1993412e34b73565d1b859d8a44b1b5f0e1963d97cc921a1 Status: Downloaded newer image for tomcat:latest
下载完成后,我们就可以使用这个镜像了。
1.1.4 删除镜像
docker rmi 某个镜像的 id
删除某个镜像
yishui@yishui:~$ docker rmi hello-world Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 620f92dc1a72 is using its referenced image fce289e99eb9
注意
正在运行的容器不能删除,需要强制删除,命令如下:
yishui@yishui:~$ docker rmi -f hello-world Untagged: hello-world:latest Untagged: hello-world@sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535 Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
删除多个镜像 docker rmi -f 镜像名 1:TAG 镜像名 2:TAG
删除全部镜像 docker rmi -f ${docker images -qa}
1.2 容器命令 ===
docker 利用容器独立运行一个或一组应用。容器是镜像创建的运行实例。
他可以被启动、开始、停止、删除。每个容器都是相互隔离,保证安全的平台。
容器的定义和镜像几乎是一模一样,唯一的区别在于容器的最上一层是可读可写的
1.2.1 新建并启动容器
docker run [options] images [command][args]
参数说明
–name=“容器的新名字” #为容器指定一个名字
–net=host # docker 跳过配置容器的独立网络栈
-d #后台运行容器,并返回容器 ID,即启动守护式容器
-i #以交互模式运行容器 ,通常与-t 同时使用
-t #为容器重新分配一个伪输入终端,通常与-一起使用
-P #随机端口映射
-p #有以下四种形式
ip:主机端口:容器端口 ; ip::容器端口 ;   主机端口:容器端口 ;   容器端口
yishui@yishui:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 168588387c68 2 weeks ago 463MB
centos latest 1e1148e4cc2c 2 months ago 202MB
yishui@yishui:~$ docker run -it 1e1148e4cc2c
[root@e26764ed06b4 /]# docker ps
bash: docker: command not found
[root@e26764ed06b4 /]# docker -ps
bash: docker: command not found
[root@e26764ed06b4 /]#
[root@e26764ed06b4 /]#
[root@e26764ed06b4 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@e26764ed06b4 /]#
[root@e26764ed06b4 /]#
如上所示 root@e26764ed06b4 表明当前已经运行了 docker 容器,并进入了 docker 容器之中,直接进入了 docker 的终端。
注意:
守护式容器不能通过 docker ps 命令查询到
1.2.2 查看正在运行镜像
yishui@yishui:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e26764ed06b4 1e1148e4cc2c "/bin/bash" 9 minutes ago Up 9 minutes happy_edison 286f29cabb2c centos "/bin/bash" 10 minutes ago Up 10 minutes festive_mcnulty
参数说明
-a #列出当前所有正在运行的容器和历史上运行过的容器
-l #显示最近创建的容器
-n #显示最近 n 创建的容器
-q #静默模式,只显示容器的编号
–no-trunc #显示完整的信息
1.2.3 退出容器
exit: 容器停止并退出
ctrl+P+Q: 容器不停止并退出
1.2.4 启动容器
docker start 容器 id 或者容器名字
1.2.5 重启容器 === >docker restart 容器id或者容器名字
1.2.6 关闭容器 === >docker stop 容器id或者容器名字
1.2.7 强制停止容器 === >docker kill 容器id或者容器名字
1.2.8 删除已停止的容器
docker rm 容器 id
一次删除多个容器 :
docker rm -f $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm
1.2.9 守护式容器
使用镜像 centos:latest 以后台模式启动一个容器
docker run -d centos
然后以 docker ps -a 命令查看,会发现容器已经退出
这是因为 Dcoker 容器后台运行,就必须有一个前台进程
容器运行的命令如果不是那些一直挂起的命令,(比如运行 top ,tail)就会自动退出
这是 docker 的机制问题,比如你的 web 容器,如 nginx,在正常情况下,我们配置启动服务只需要启动相应的 service 即可,如
service start nginx
但是这样做会导致 nginx 以后台进程模式运行,从而导致 docker 前台没有运行的应用,因此容器后台启动后,会觉得自己没事可做了而自杀,所以最佳的解决方案是,将要运行的程序以前台进程的形式启动。
如
docker run -d centos /bin/sh -c “while true;do echo hello world;sleep 2;done”
上述命令为在后台持续打印输出,此时改 docker 容器不会退出。
1.2.10 查看容器日志
docker logs -f -t --tail 容器 Id
参数说明
-t : 加入时间
-f : 跟随最新的日志打印
–tail :数字显示多少条
1.2.11 查看容器内运行的进程
docker top 容器 Id
查看容器内部细节
docker inspect 容器 Id
1.2.12 进入正在运行的容器并以命令行交互
直接进入容器启动命令的终端,不会启动新的进程
docker exec -it 容器 Id bashShell
在容器中打开新的终端,并且可以启动新的进程
重新进入 docker attach 容器 Id
以 root 用户进入容器
docker exec -it --user root 容器 Id /bin/bash
直接返回命令的结果
yishui@yishui:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72ff727faba0 centos "/bin/sh -c 'while t…" 3 hours ago Up 3 hours festive_hypatia yishui@yishui:~$ docker exec -t 72ff727faba0 ls -l /tmp total 4 -rwx------ 1 root root 836 Dec 5 01:37 ks-script-h2MyUP -rw------- 1 root root 0 Dec 5 01:36 yum.log yishui@yishui:~$
上述命令可以直接返回命令的结果
进入终端
yishui@yishui:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72ff727faba0 centos "/bin/sh -c 'while t…" 3 hours ago Up 3 hours festive_hypatia yishui@yishui:~$ docker exec -t 72ff727faba0 /bin/bash [root@72ff727faba0 /]#
上述命令可以直接进入 docker 容器的终端。
1.2.13 从容器内拷贝文件到主机上
docker cp 容器 Id:容器内的路径 目的路径
二 docker 的基本概念
docker 镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器曾之下的斗角镜像层。
2.1 生 docker 成镜像
docker commit 提交容器的副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器 Id 要创建的目标镜像名:[标签名]
启动一个 tomcat 容器
yishui@yishui:~$ docker images tomcat REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 168588387c68 3 weeks ago 463MB yishui@yishui:~$ yishui@yishui:~$ docker run -it -p 8888:8080 tomcat Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /docker-java-home/jre
上述命令标识启动一个 tomcat 容器实例,该实例以宿主机上 8888 端口映射 docker 里面的 8080 端口。
启动成功后,可以通过http://localhost:8888/看到熟悉的tomcat管理界面了。
接下来,进入 docker 容器里面删除 tomcat 里面的 doc 文件
退出容器,执行以下命令
yishui@yishui:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 03e78242bfea tomcat "catalina.sh run" 29 minutes ago Up 29 minutes 0.0.0.0:8888->8080/tcp elastic_varahamihira yishui@yishui:~$ docker commit -a="yishuifengxiao" -m="生成第一个docker demo镜像" 03e78242bfea yishui/tomcat-demo:1.0 sha256:1323b27a2652b2eb28963dc7e31632d4574ee49225b74f9cb5bd5dad925c788d yishui@yishui:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE yishui/tomcat-demo 1.0 1323b27a2652 15 seconds ago 463MB <none> <none> 7cfe70fc34b0 About a minute ago 463MB tomcat latest 168588387c68 3 weeks ago 463MB centos latest 1e1148e4cc2c 2 months ago 202MB yishui@yishui:~$
在上述命中,参数意义如下
- -a : 指明作者
- -m : 描述
- yishui/tomcat-demo:1.0 : yishui 为命名空间,1.0 表示版本号
执行完上述命令后,我们可以看到已经生成了一个名为 yishui/tomcat-demo 的镜像
yishui@yishui:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE yishui/tomcat-demo 1.0 1323b27a2652 20 minutes ago 463MB <none> <none> 7cfe70fc34b0 21 minutes ago 463MB tomcat latest 168588387c68 3 weeks ago 463MB centos latest 1e1148e4cc2c 2 months ago 202MB yishui@yishui:~$ yishui@yishui:~$ yishui@yishui:~$ yishui@yishui:~$ yishui@yishui:~$ docker run -it -p 8888:8080 yishui/tomcat-demo:1.0 Using CATALINA_BASE: /usr/local/tomcat
启动自定义镜像,可以看到生成的自定义镜像能正常启动。
注意:由于这里版本号不是 latest,一次启动时必须带上 TAG
提示 这里用-d命令启动守护容器,docker 容器也不会自动退出。