docker服务器是c/s(client、server)结构。docker的服务端守护进程运行在主机上,服务端守护进程管理着很多的容器,我们通过客户端Socker连接访问服务端,通过docker的客户端命令操作服务器。常用命令如下:
1. 帮助命令:
查看docker服务器的版本。
查看docker服务器的更多信息,比如:Container有多少、Image有多少、镜像的地址Registry Mirrors等。
查看docker的命令。
2. 镜像命令:
查看本机上的镜像。如下,本机只有一个镜像hello-world。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB
- REPOSITORY :表示镜像的仓库源。
- TAG:表示镜像的版本。
- IMAGE ID:表示镜像的id。
- SIZE:表示镜像的大小。
docker images 后面有一些可选的参数。
- -q 表示只显示镜像的id。
[root@localhost ~]# docker images -q
fce289e99eb9
-a 列出本地所有的镜像(含中间映像层)
--digests 显示摘要信息。显示的信息多了一列DIGEST。
--no-trunc 不截断显示信息。默认IMAGE ID只显示前12位。
[root@localhost ~]# docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
hello-world latest sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535 fce289e99eb9 2 months ago 1.84kB
[root@localhost ~]# docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e 2 months ago 1.84kB
表示去hub.docker.com查询镜像。和直接打开这个网站,在搜索框输入镜像名搜索一样。如下:搜索Tomcat镜像。
[root@localhost ~]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2314 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 64 [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]
这里有个STARS表示这个镜像的点赞人数,和github的一样。
docker search 后面有一些可选的参数。
- -s 表示列出STARS不小于某个值的镜像。如下:列出STARS大于60的tomcat镜像。
[root@localhost ~]# docker search -s 60 tomcat
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2314 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 64 [OK]
表示把某个镜像从远程拉到本地。例子如下:下载tomcat镜像。
不指定版本的情况下docker pull tomcat 等价于 docker pull tomcat:latest。下载的最新版。
表示删除本地的某个镜像。不指定版本的情况下docker rmi tomcat 等价于 docker rmi tomcat :latest。删除最新版。
docker rmi 还有一些用法:
- -f 强制删除。例如:docker rmi -f tomcat 。
- 删除多个。docker rmi 镜像名1:TAG 镜像名2:TAG。
- 删除本机的全部镜像。docker rmi $(docker images -qa) ,相当于用docker images -qa查询出镜像的id作为参数传递给删除命令。
3. 容器命令:
docker run [options] 镜像名或镜像ID [COMMAND] [ARG...]
表示运行镜像。例如:docker run hello-world这个命令先从本地找hello-world镜像,如果没有就去hub.docker.com(或者阿里云)找hello-world:latest镜像并下载到本地。然后以hello-world镜像为模板生产一个容器实例运行。如果在远程没有找到镜像就返回失败。
- 可选项 [options]:表示docker的一些可选命令参数。
- 可选项[COMMAND] :表示给镜像传递的命令。
- 可选项 [ARG...]:表示给镜像传递的参数。
docker run 的常用[options] :
--name 新容器的名字:为容器指定一个名字。
-d:后台运行容器,并返回容器ID。
-i:以交互模式运行容器,通常与-t同时使用。
-t :为容器重新分配一个伪输入终端,通常与-i同时使用。
-P:随机端口映射。
-p:指定端口映射。有4种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
交互模式运行容器,例子如下:
[root@localhost ~]# docker run -it centos
[root@6faf4716349a /]#
上面运行一个centos容器,并且开启一个终端与运行的centos容器交互。后面看到root@6faf4716349a 就是root用户登录到容器6faf4716349a上了。6faf4716349a是容器的ID。
后台运行容器。错误的方式:
docker run -d centos
如果用上面的命令运行容器,使用docker ps -a 查看会发现容器已经停止了。这是因为docker要容器在后台一直运行,必须有一个前台进程。如果运行容器的时候的命令[COMMAND] [ARG...]不是那些一直挂起的命令(如top、tail),容器就会自动退出。所以最好的方式是将需要运行的程序以前台进程的形式运行。如下:
docker run -d centos ping www.docker.com
上面表示以守护进程方式运行centos,但是在容器中运行命令ping www.docker.com。使得前台一直挂起。
docker ps [options]
docker ps查看正在运行的容器,已经停止的容器不列出。
常用的options说明:
- -a:列出所有运行过的容器,包括已经停止的容器。docker ps -a
- -q:只显示容器编号。
- -l:显示最近创建的容器。docker ps -l 显示最近创建的容器
- -n:显示最近创建的n个容器。docker ps -n 3 显示最近3次创建的容器
--no-trunc:不截断输出。
列出所有运行过的容器,包括已经停止的容器。例子如下:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6faf4716349a centos "/bin/bash" 3 minutes ago Up 3 minutes condescending_bose
[root@localhost ~]#
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6faf4716349a centos "/bin/bash" 4 minutes ago Up 4 minutes condescending_bose
8432fe5aa5b1 fce289e99eb9 "/hello" 2 days ago Exited (0) 2 days ago kind_yalow
STATUS列可以看到,docker ps -a 列出了停止运行的容器。
NAMES列是容器的名字。如果运行容器的时候用--name设置名字,这里就显示设置的名字。如下:
[root@localhost ~]# docker run --name='centos2' centos
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f20b38eacfea centos "/bin/bash" 9 seconds ago Exited (0) 3 seconds ago centos2
docker stop 容器名或容器ID
停止容器。例如:docker stop centos
exit 容器停止退出。
ctrl+P+Q 容器不停止退出。
在和容器交互时,输入exit命令。表示停止容器并退出。输入Ctrl+P+Q表示退出,但是不停止容器。
docker start 容器名或容器ID
docker restart 容器名或容器ID
docker kill 容器名或容器ID
docker rm 容器ID
如果想批量删除。用下面的2个命令:
docker rm -f $(docker ps -a -q)
docker ps -a -q |xargs docker rm
这里xargs是linux的命令,把上一个命令的结果传递给下一个命令。就是把docker ps -a -q 的输出内容传递给docker rm命令。
docker logs -f -t --tail 容器ID
- -t :是在日志中加入时间戳。
- -f :相当于linux的tail -f,监控日志。
- --tail:查看日志的最后几行。例如查看日志的最后3行:docker logs --tail 3 容器ID
例子如下:
[root@localhost ~]# docker logs -ft --tail 3 d175764e99f2
2019-03-11T08:08:27.955057288Z 64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=390 ttl=233 time=215 ms
2019-03-11T08:08:28.944550516Z 64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=391 ttl=233 time=202 ms
2019-03-11T08:08:29.964682899Z 64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=392 ttl=233 time=220 ms
2019-03-11T08:08:30.961770389Z 64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=393 ttl=233 time=216 ms
docker inspect 容器ID
容器是一层套一层的,比如tomcat要依赖于java。使用这个命令可以看到容器内部的细节。和启动容器时执行的命令。
退出容器之后,想再与容器交互,可使用下面的2中方式:
docker exec -it 容器ID 要在容器执行的shell命令
docker attach 容器ID
这2种方式的区别是:
- exec 是在容器中打开新的终端,并且可以启动新的进程。(推荐这种方式)
- attach 是直接进入容器的启动终端。不会启动新的进程。如果是用-d启动的容器,使用attach 进入后,用Ctrl+P+Q也没办法退出。只能Ctrl+C关闭终端,但是因为终端关闭容器停止了。所以不推荐这种方式。
也就是attach直接进入容器的启动终端,在容器内部再执行想要操作的shell命令。而exec 打开新的终端,可以直接传递想要操作的shell命令,并且马上返回结果。
例如要在容器内执行ls -l命令,exec 例子如下:
[root@localhost ~]# docker exec -it d175764e99f2 ls -l
total 12
-rw-r--r--. 1 root root 12076 Dec 5 01:37 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Dec 5 01:36 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Mar 11 08:01 dev
attach例子如下:因为我的启动终端一直"ping www.docker.com"在控制台打印信息,所以进入之后还是一直打印ping信息。这里因为我用-d启动的容器,用Ctrl+P+Q也没办法退出。只能Ctrl+C关闭终端,但是因为终端关闭,容器停止了。
[root@localhost ~]# docker attach d175764e99f2
64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=2294 ttl=233 time=222 ms
64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=2295 ttl=233 time=208 ms
64 bytes from server-13-35-99-22.lax3.r.cloudfront.net (13.35.99.22): icmp_seq=2296 ttl=233 time=249 ms
docker top 容器ID
例子如下:
[root@localhost ~]# docker top 42b67ae89cf4
UID PID PPID C STIME TTY TIME CMD
root 9619 9603 0 17:41 pts/0 00:00:00 /bin/bash
docker cp 容器ID:容器内路径 宿主机路径
例子如下:把42b67ae89cf4容器的/tmp/yum.log文件复制到宿主机的/root下面。
[root@localhost ~]# docker cp 42b67ae89cf4:/tmp/yum.log /root
[root@localhost ~]# ll
总用量 12
-rw-------. 1 root root 1730 3月 27 2018 anaconda-ks.cfg
-rw-r--r--. 1 root root 1778 3月 27 2018 initial-setup-ks.cfg
-rw-r--r--. 1 root root 267 5月 23 2018 webui
-rw-------. 1 root root 0 12月 5 09:36 yum.log