docker入门基础知识

docker基础入门知识和一些常用命令解析

Posted by yishuifengxiao on 2019-02-28

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::容器端口   ;  &nbsp 主机端口:容器端口   ;  &nbsp 容器端口

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 的基本概念

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 容器也不会自动退出。