Docker基础命令

一、Docker命令

docker 命令 --help,可以帮助你查看命令参数,当然在有网的前提下,建议百度搜索一下更快

docker version                  #显示版本信息
docker info                     #显示docker的系统信息, 包括镜像和容器信息
docker 命令 --help              #万能命令 

二、镜像命令

2.1 查看镜像

#查看镜像 docker images
[root@izuf67znusfv5r0k1fzac9z ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB

#解释:
REPOSITORY    镜像的仓库源
TAG           镜像的标签
IMAGE         镜像的id
CREATED       镜像的创建时间
SIZE         镜像的大小              

#可选项:
-a, --all       	 	列出所有的镜像 
-q,	--quiet 		 只显示镜像的ID

2.2 搜索镜像

#搜索镜像 docker search
[root@izuf67znusfv5r0k1fzac9z ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9750                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3560                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   714                                     [OK]

#可选项
-f, --filter 筛选


#通过stars数筛选镜像
[root@izuf67znusfv5r0k1fzac9z ~]# docker search mysql -f=stars=3000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9750                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3560                [OK] 

2.3 下载镜像

#下载镜像 docker pull 镜像名[:tag]
[root@izuf67znusfv5r0k1fzac9z ~]# docker pull mysql
Using default tag: latest     #不指定tag 默认下载最新版
latest: Pulling from library/mysql    #分层下载, docker images的核心, 联合文件系统
8559a31e96f4: Pull complete 
d51ce1c2e575: Pull complete 
c2344adc4858: Pull complete 
fcf3ceff18fc: Pull complete 
16da0c38dc5b: Pull complete 
b905d1797e97: Pull complete 
4b50d1c6b05c: Pull complete 
571e8a282156: Pull complete 
e7cc823c6090: Pull complete 
61161ba7d2fc: Pull complete 
74f29f825aaf: Pull complete 
d29992fd199f: Pull complete 
Digest: sha256:fe0a5b418ecf9b450d0e59062312b488d4d4ea98fc81427e3704f85154ee859c  #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest   #真实地址

#等价于
docker pull mysql
docker pull docker.io/library/mysql:latest

#指定下载版本
[root@izuf67znusfv5r0k1fzac9z ~]# docker pull mysql:5.7

2.4 删除镜像

docker rmi -f 镜像ID                   #删除指定的镜像
docker rmi -f 镜像ID 镜像ID ……         #删除多个镜像
docker rmi -f $(docker images -aq)    #删除全部镜像

三、容器命令

docker pull centos下载centos 镜像,有了镜像才能创建容器。

3.1 新建容器并启动

docker run [可选参数] image #通过镜像创建容器,加上参数可以直接启动

#参数说明

--name="name" 表示容器名字 tomcat01 tomcat02,用来区分容器
-d 表示后台运行方式
-it 表示使用交互方式运行,进入容器查看内容
-p 表示指定容器端口8080,或者3333:8080,就是将主机的3333端口映射到容器的8080端口,这种方式比较常用
--privileged=true 使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。

-p还有很多其它用法,比如:
-p 127.0.0.1:3333:8080 表示使用特定ip去映射
-p 127.0.0.1::8080 表示任意端口映射
-p 127.0.0.1:3333:8080/udp 表示指定UDP协议
-P 注意这个P是大写,表示任意49000~49900端口去映射镜像暴露出来的端口

#启动,并进去容器(注意:当进去到容器的centos时,user已经成了root@ac1a40f4cf6b )
[root@izuf67znusfv5r0k1fzac9z ~]# docker run -it centos /bin/bash
[root@ac1a40f4cf6b /]# 
[root@ac1a40f4cf6b /]# ls   #查看容器中的centos文件,基础版本,很多命令都没有
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#退出容器
[root@ac1a40f4cf6b /]# exit
exit

3.2 查询容器

docker ps [可选参数] #列出正在运行的容器

参数说明
-a #列出正在运行的容器+历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的ID

[root@izuf67znusfv5r0k1fzac9z ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS 
e832d1de3cc3        centos              "/bin/bash"         54 seconds ago      Up 53 seconds               

[root@izuf67znusfv5r0k1fzac9z ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       
e832d1de3cc3        centos              "/bin/bash"         58 seconds ago      Up 58 seconds              
ac1a40f4cf6b        centos              "/bin/bash"         6 minutes ago       Exited (130) 2 minutes ago  
11680679faf7        bf756fb1ae65        "/hello"            2 days ago          Exited (0) 2 days ago      

3.3 停止、启动容器

docker stop停止容器

#先利用docker ps -a查看所有容器ID
docker ps -a
#再使用docker stop 容器ID,停止对应的容器
docker stop 容器ID

docker start启动容器

docker restart重启容器

docker kill强制停止正在运行的容器

原理一样停止一样

Ctrl + P + Q退出当前容器,保持后台运行

3.4 删除容器

docker rm 容器ID                #删除指定容器,不能删除正在运行的容器,加上rm -f 可以强制删除
docker rm 容器ID 容器ID         #删除多个容器
docker rm -f $(docker ps -aq)  #删除所有容器
docker -a -q|xargs docker rm   #通过Linux命令删除所有的容器

四、其他常用命令

4.1 后台启动容器

#命令docker run -d 镜像名
[root@izuf67znusfv5r0k1fzac9z ~]# docker run -d centos

#问题
docker ps 之后发现centos 停止了,所以一般使用交互模式启动,及加上-it,所以完整命令应该是
[root@izuf67znusfv5r0k1fzac9z ~]# docker run -d -it centos

#常见的坑:
docker 容器使用后台运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止
nginx  容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了

4.2 查看日志

docker logs -f -t --tail 容器ID 可以在宿主机中查看容器日志

#一般刚启动的容器没有日志,可以写一段shell脚本,-c表示bin/sh里添加内容
docker run -d centos /bin/sh -c "while true;do echo wangzhen;sleep 1;done"

#显示日志
-tf            #显示所有日志
--tail number  #显示对应行数的日志

[root@izuf67znusfv5r0k1fzac9z ~]# docker logs -f -t --tail 10 2eb8e89b4875
[root@izuf67znusfv5r0k1fzac9z ~]# docker logs -tf --tail 10 2eb8e89b4875

4.3 查看容器进程

docker top 容器ID 可以在宿主机中查看容器进程

[root@izuf67znusfv5r0k1fzac9z ~]# docker top 2eb8e89b4875
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                9900                9873                0                   22:28               ?                   00:00:00            /bin/sh -c while true;do echo wangzhen;sleep 1;done
root                10471               9900                0                   22:35 

4.4 查看容器详细信息

docker inspect 2eb8e89b4875查看容器的详细信息,几乎你能想到的信息都在这里

#如容器基础信息
 		"Id": "2eb8e89b487528b9698b55da97f8835b478470c72a950ba399c98a55bd79fab2",
        "Created": "2020-07-21T14:28:22.097965152Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo wangzhen;sleep 1;done"
        ],        

#网络信息
		"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "38f93e8890127ed2bebfb3ef62922900fb9b859897d84f0c5c5a7dc63a5f97d8",
                    "EndpointID": "c34954d5ef1f73536f670602c97da5a4f8bc8ae964569966b2b6a4cbecfba119",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:03",
                    "DriverOpts": null
                }
            }

4.5 进入运行中的容器

  • 方式一
    docker exec -it 容器ID bashshell

    #我们通常容器都是使用后台方式运行的,比如需要进入容器,修改配置
    [root@izuf67znusfv5r0k1fzac9z ~]# docker exec -it aee315ba83da /bin/bash
    [root@aee315ba83da /]#  
    
  • 方式二

    docker attach 容器ID

    [root@izuf67znusfv5r0k1fzac9z ~]# docker attach aee315ba83da
    正在执行的进程。。。
    

区别:

docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach #进入容器正在执行的终端,退出之前在输出,再次进入依旧是这个页面,不会启动新的进程

4.6 拷贝文件

docker cp 容器ID:容器内路径 主机目的路径容器到宿主机

[root@izuf67znusfv5r0k1fzac9z java]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                 
aee315ba83da        centos              "/bin/bash"              23 hours ago        Exited (0) 12 seconds 

#拷贝文件
[root@izuf67znusfv5r0k1fzac9z java]# docker cp aee315ba83da:/home/test.java /home/java
[root@izuf67znusfv5r0k1fzac9z java]# ls
test.java

#当前这个命令是手动的,未来,将使用 -V 卷的技术,可以实现自动同步

docker cp 本地路径 容器id:容器的路径 宿主机到容器

#拷贝文件
[root@izuf67znusfv5r0k1fzac9z java]# docker cp /home/java aee315ba83da:/home/test.java
[root@izuf67znusfv5r0k1fzac9z java]# ls
test.java

五、总结

上面所用到了都是常用命令,其他命令还有很多,后面也会慢慢学到,先用一张图概括一下