关于Docker的常用命令

发布于 2021-09-25  379 次阅读


Docker常用命令

帮助命令

docker version    #显示docker的版本信息
docker info       #显示docker的详细信息,包括运行的容器,系统版本等
docker 命令 --help #显示docker命令的帮助文档

帮助文档的地址:

镜像命令

docker images 查看所有的本地主机的镜像

root@kali:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f6d0b4767a6c        7 weeks ago         133MB
root@kali:~# 

#解释
REPOSITORY   #仓库镜像的名称
TAG          #仓库镜像的版本
IMAGE ID     #仓库镜像的ID值
CREATED      #仓库镜像的创建时间
SIZE         #镜像的大小

#docker images命令可选项
Options:
  -a, --all             #显示所有的镜像,包括隐藏的镜像
  -q, --quiet           #只显示镜像的ID值

#常用命令
docker images -aq   #显示所有镜像的ID值

docker search 搜索镜像远端仓库中的镜像

#搜索mysql镜像
#第一种方式,直接在命令行进行搜索
root@kali:~# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10589               [OK]                
mariadb                           MariaDB Server is a high performing open sou…   3963   

#可选项
Options:
  -f, --filter filter   #基于过滤提供结果
      --limit int       #限制查找的最大值,默认为25
 #根据stars的个数过滤     
root@kali:~# docker search mysql --filter=stars=3000    
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   10589               [OK]                
mariadb             MariaDB Server is a high performing open sou…   3963                [OK]             

#第二种方式
通过web 进行搜索docker 仓库
网址:https://hub.docker.com/

docker pull 下载镜像

#下载mysql镜像文件,不加版本的话默认为最高版本
root@kali:~# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql

#下载版本为mysql5.7的镜像
root@kali:~# docker pull mysql:5.7   指定版本要在docker仓库中存在

#可选项
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags               #下载仓库中的所有镜像

  -q, --quiet                   Suppress verbose output

docker rmi 删除镜像

#删除单个镜像   通过镜像ID值进行删除
root@kali:~/桌面# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 a70d36bc331a        7 weeks ago         449MB
nginx               latest              f6d0b4767a6c        8 
`删除ID值为a70d36bc331a的mysql镜像`  #此命令不能够删除正在运行中的镜像
root@kali:~/桌面# docker rmi a70d36bc331a
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5

#批量删除所有的镜像
docker rmi $(docker images -aq)
root@kali:~/桌面# docker rmi $(docker images -aq)
Untagged: nginx:latest
Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Deleted: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74

#强制删除镜像  通过参数 -f  强制删除镜像文件,不管是否还在运行中
root@kali:~/桌面# docker images      
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 a70d36bc331a        7 weeks ago         449MB
root@kali:~/桌面# docker rmi a70d36bc331a    #删除失败
Error response from daemon: conflict: unable to delete a70d36bc331a (must be forced) - image is being used by stopped container d987d0d60e39
root@kali:~/桌面# docker rmi -f a70d36bc331a  #通过-f参数删除成功
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5

容器命令

ps:有了镜像才能够创建容器

新建容器并启动

docker run 
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

#参数说明
--name="name"  #给容器起个别名
-d             #后台运行
-it            #使用交互式运行,能够进行容器内部
-p             #指定容器的端口
-P(大写)             #随机指定一个端口
#-p 参数的四种指定方式

-p 容器内端口    #指定开启服务在容器内部的端口
-p 主机端口:容器内端口 #映射主机端口到容器内端口,访问主机的端口相当于访问容器内相对应的端口
容器端口   #和 加-p参数相同
-p  主机ip:主机端口:容器端口  #可以指定ip地址进行映射

#交互式启动容器
root@kali:~/桌面# docker run -it 300e315adb2f  /bin/bash
[root@833590e29d22 /]#      此时已经进入到容器内部

#后台启动容器,并指定容器的名称
root@kali:~/桌面# docker run -d --name=centos1 centos
b59be429d062e5b7df44359e5b0b440fee6f1eb6a3c2e865bb0b8deefb12a0ca
root@kali:~/桌面# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
b59be429d062        centos              "/bin/bash"         18 seconds ago      Exited (0) 16 seconds ago                       `centos1`

#列出所有运行中的容器
docker ps 
Usage:  docker ps [OPTIONS]

常用参数 
  -a
  -q
  -n=?

List containers

Options:
  -a, --all            #列出所有的容器,包括没有启动的
  -f, --filter filter   Filter output based on conditions provided
      --format string   #格式化输出
  -n, --last int        #显示n个最近创建的容器,默认为1
  -l, --latest          #显示最后一个创建的容器
      --no-trunc        Don't truncate output
  -q, --quiet          #只显示容器的ID值(默认显示运行中容器)
  -s, --size            Display total file sizes
#显示所有的容器
root@kali:~/桌面# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b59be429d062        centos              "/bin/bash"         3 minutes ago       Exited (0) 3 m
#显示所有容器的ID值
root@kali:~/桌面# docker ps -aq
b59be429d062

启动容器

当容器创建后,有的容器处于未被启动的状态,所以需要使用docker start 命令启动容器
docker start  
Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]
Options:
  -a, --attach                  Attach STDOUT/STDERR and forward signals
      --checkpoint string       Restore from this checkpoint
      --checkpoint-dir string   Use a custom checkpoint storage directory
      --detach-keys string      Override the key sequence for detaching a container
  -i, --interactive             Attach container's STDIN
#用例
root@kali:~/桌面# docker start e5d2a8c59b11
e5d2a8c59b11

退出容器

exit  #直接停止容器并退出
ctrl+q+p #容器不停止退出

停止容器

docker stop 容器ID #通过该命令使正在运行中的容器停止

docker kill 容器ID #强制删除容器

重启容器

docker restart 容器ID

删除容器

docker rm 
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

Options:
  -f, --force     Force the removal of a running container (uses SIGKILL)
  -l, --link      Remove the specified link
  -v, --volumes   Remove anonymous volumes associated with the container
常用:
docker rm 容器ID

#根据ID值删除的单个容器,在删除容器前,如果容器是运行状态,需要先停止容器
root@kali:~/桌面# docker rm  e5d2a8c59b11
e5d2a8c59b11

#删除所有的容器
docker rm $(docker ps -aq)
#强制删除容器   -f  参数
 1.强制删除一个容器    docker rm -f 容器ID
 2.强制删除所有的容器
 docker rm -f $(docker ps -aq)

其他命令

后台启动容器

docke run -d centos

后台启动容器时,会发现系统没有启动起来,因为docker发现系统没有做任何事情,就默认关闭,所以需要有一个前台进程启动

查看日志

docker logs
Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative
                       (e.g. 42m for 42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or
                       relative (e.g. 42m for 42 minutes)
常用命令
docker -f -t --tail n  容器ID
输出容器的n条带有时间的日志
root@kali:~/桌面# docker logs -t -f --tail 10 047897c93173
2021-03-12T06:50:20.449684400Z [root@047897c93173 /]# 

查看容器中的进程信息

docker top  容器ID

root@kali:~/桌面# docker top 047897c93173
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16393               16374               0                   14:50               pts/0               00:00:00            /bin/bash

查看元数据

docker inspect
Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

Options:
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type
常用命令:
`docker inspect 容器ID`
root@kali:~/桌面# docker inspect 047897c93173
[
    {
        "Id": "047897c93173aae3c8015ca9dc825f655701abd019c4f8249ad8fb3305af0bca",
        "Created": "2021-03-12T06:50:16.00809096Z",
        "Path": "/bin/bash",

进入当前正在运行的容器

#进入到容器中的两种方式1
docker exec -it 容器ID /bin/bash

root@kali:~/桌面# docker exec -it 047897c93173 /bin/bash
[root@047897c93173 /]# 

#方式2
docker attach 容器ID

root@kali:~/桌面# docker attach 047897c93173
[root@047897c93173 /]# ls

#两种方式的区别
docker exec   #进入容器后开启一个新的终端
docker attach #进入容器后正在执行的终端,不会启动新的进程

容器拷贝

将容器内的数据与容器外的数据进行拷贝

root@kali:~/桌面# docker cp --help

Usage:  docker cp 容器ID:容器路径 主机路径   #常用
        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH

容器数据卷

什么是容器数据卷

问题:当docker容器删除时,容器内的数据也会消失,那么对于mysql这种需要保存数据的容器来说,就很不友好,所以需要一种容器数据持久化的技术,这就是卷技术!其实就是目录挂载,将容器内部的目录挂载到本地linux系统中。

总结:容器的持久化和同步操作,容器之间也是可以数据共享的!

使用数据卷

方式一:直接使用命令挂载    -v 

docker run -it -v 主机目录:容器内目录

#挂载容器内部的home目录到本地的/home/test目录
docker run -it -v /home/test:/home centos /bin/bash
#在kali中使用docker inspect 容器ID  查看是否挂载成功
docker inspect 280dfe9cd845

image-20210311163953182

image-20210311164352509
此时已经成功绑定了本机与容器内容的文件目录,两者之间的数据会进行同步

2.停止容器后,在本机修改home/test目录下的文件,当再次启动容器时,文件修改也会同步到容器内

好处:对于数据的修改以后只需要在本地修改即可,不需要进去容器内部了

实战:安装MYSQL数据库

#1 查找mysql镜像
docker search mysql
#2 下载版本为5.7的mysql镜像
docker pull mysql:5.7
#3 启动镜像   mysql数据库需要配置数据库的密码才能够登陆  使用-e MYSQL_ROOT_PASSWORD=密码 进行设置,并挂载容器中的data目录以及conf目录
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01 容器id

命令:
-d 后台运行
-p 映射端口
-v 挂载数据卷
-e  容器配置参数
--name 容器别名

image-20210311170639487

image-20210311175516125

注意:删除容器并不会使本地的数据丢失,这就实现了容器数据本地持久化

具名挂载以及匿名挂载

docker volume  查看容器数据卷相关命令

Usage:  docker volume COMMAND

Commands:
  create      创建一个卷
  inspect     查看卷的具体信息
  ls         列出所有的数据卷
  prune       移除所有本地不使用的数据卷
  rm          删除数据卷

  #匿名挂载
在挂载数据卷时只指定了容器内的地址,就是匿名挂载
  -v   容器内路径
 docker run -d -v /etc/nginx  --name nginx1 nginx

 #仅指定了容器内部的地址,那么怎么查看卷的位置呢,就要使用docker volume list 命令。这种没有具体的名称的就是匿名挂载
 local               1b3c7649f029061611b5aa13e26c74b3d0b85c210ed37ca8ff4d32c9c3d0f9aa

#具名挂载
-v 名称:容器路径   
使用以上命令为数据卷制定一个数据卷名称
docker run -d -v haha:/etc/nginx --name=nginx1 nginx
#haha就是数据卷名,使用docker volume list 命查看,这种有具体的用户名的就是具名挂载

image-20210311181726751

挂载的三种形式总结

 -v 容器路径    #匿名挂载
 -v 卷名:容器路径 #具名挂载
 -v 主机路径:容器路径 #指定路径挂载

 #还可以使用一下形式对容器内部的挂载进行文件权限设置,以指定路径为例,说明:权限是对于容器内部而言的!
 -v 主机路径:容器路径:ro  #指定容器内部只能进行读取

 ro  #指定容器内部只能进行读取
 rw   #容器可读可写

初始DockerFile

DockerFile就是构建docker镜像的构建文件,就是命令脚本,dockerfile的每一步都是一层。

新建一个docker镜像

docker build

docker build --help
Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable
                                unlimited swap
      --network string          Set the networking mode for the RUN instructions during
                                build (default "default")
      --no-cache                Do not use cache when building the image
  -o, --output stringArray      Output destination (format: type=local,dest=path)
      --platform string         Set platform if server is multi-platform capable
      --progress string         Set type of progress output (auto, plain, tty). Use
                                plain to show container output (default "auto")
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful build
                                (default true)
      --secret stringArray      Secret file to expose to the build (only if BuildKit
                                enabled): id=mysecret,src=/local/secret
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
      --squash                  Squash newly built layers into a single new layer
      --ssh stringArray         SSH agent socket or keys to expose to the build (only
                                if BuildKit enabled) (format:
                                default|<id>[=<socket>|<key>[,<key>]])
      --stream                  Stream attaches to server to negotiate build context
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

常用命令:
-t   镜像名称
-f   dockerfile的路径

使用:
docker build -f dockerfile  -t zhang/centos:1.0 .  #注意后面有个点
root@kali:~/桌面/dockertouch# docker build -f dockerfile  -t zhang/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["Volume01","Volume02"]
 ---> Running in 311bc5cbd625
Removing intermediate container 311bc5cbd625
 ---> fb0668384f2f
Step 3/4 : CMD echo "---end---"
 ---> Running in 96e0f9f7ec1d
Removing intermediate container 96e0f9f7ec1d
 ---> 1e782377e963
Step 4/4 : CMD /bin/bash
 ---> Running in ae757d48572d
Removing intermediate container ae757d48572d
 ---> 1128a7570504
Successfully built 1128a7570504
Successfully tagged zhang/centos:1.0
root@kali:~/桌面/dockertouch# 

#一个简单的dockerfile文件
FROM centos

VOLUME ["Volume01","Volume02"]

CMD echo "---end---"
CMD /bin/bash

在dockerfile中我们在第二步构建了两个数据卷,当容器启动时,docker会自动匿名挂载两个数据卷在本地,通过图片也发现已经成功挂载,这是挂载数据卷的第二种方法

image-20210312152811408

数据卷容器

两个或多个容器之间实现数据共享 --volume-from 参数实现数据共享

实验设计

1.两个容器之间数据互联

2.三个容器之间数据互联

3.删除容器

实验一:两个容器之间数据互联

#开启第一个容器
docker run -it --name docker01 1128a7570504 /bin/bash
#开启第二个容器  并设置卷共享来自docker01
docker run -it --name docker02 --volumes-from docker01  1128a7570504 /bin/bash
#进入docker01 中创建一个新的文件,查看docker02是否自动同步
docker attach e6a9ca916e67
touch dockero1
[root@e6a9ca916e67 Volume01]# ls
dockero1
#进入docker02,查看docker02中是否有对应的文件
发现docker01文件已经成功同步过去

image-20210312161055249

实验二:三个容器互连数据

#重新开启一个容器,并挂载docker01的数据卷
docker run -it --name docker03 --volumes-from=docker01  1128a7570504 /bin/bash
#查看docker03中是否同步了docker01文件

三个容器都存活

image-20210312161350866

发现docker03中也同步了docker01文件

image-20210312161543485

证明了数据卷之间的共享的可能性

那么删除docker01,docker02以及docker03的文件也会消失吗?

答案是不会的,看实验三

实验三:删除docker01,验证文件的存在

image-20210312162040119

删除容器docker01,docker02中的数据仍然存在,但是当所有相关的容器都删除时,数据也想对应的删除了

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止!

DockerFile

构建步骤:

1.编写一个dockerfile文件

2.docker build构建成为一个镜像

3.docker run 运行镜像

4.docker push 发布镜像

基础知识

1.每个保留关键字(指令)都必须是大写字母

2.执行由上到下顺序执行

3.#代表注释

4.每一个指定都会创建提交一个新的镜像层。

dockerfile 指令

FROM   #基础镜像 一切都从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN     #镜像构建时需要运行的命令
ADD     #步骤,比如说需要添加tomcat,那么就要把tomcat压缩包给添加到系统中
WORKDIR #镜像的工作目录
VOLUME  #设置容器卷,挂载到那个位置
EXPOSE  #暴露端口配置
CMD     #指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile时,会运行onbuilld,触发指令
copy     #类似add,将文件拷贝到镜像中
ENV     # 构建时设置环境变量

image-20210312164516574

实战centos

创建一个自己的centos

FROM centos    #基于centos镜像进行构建

VOLUME ["Volume01","Volume02"]   #设置数据卷
MAINTAINER huahai@hillstone.com  #设置作者
ENV MYPATH /usr/local   #设置环境变量
WORKDIR $MYPATH       #设置工作目录

RUN yum -y install vim   #安装软件
RUN yum -y install net-tools

EXPOSE 80           #暴露端口

CMD echo $MYPATH     #执行一些命令
CMD echo "---end---"
CMD /bin/bash

#通过docker  build构造镜像
docker build -f dockerfile -t mycentos:0.1 .

image-20210312174811147

docker history

使用該命令查看构建dockerfile时使用的命令

docker history 镜像ID

CMD和ENTERPOINT的区别

CMD使用

#编写dockerfile输出ls -a 命令
FROM centos
CMD ["ls","-a"]

#编译并进入到容器中
docker build -f mydocker -t mydocker:0.1 .

root@kali:~/桌面/dockertouch# docker run -it b81704c83ed6 
.   .dockerenv  dev  home  lib64       media  opt   root  sbin  sys  usr
..  bin         etc  lib   lost+found  mnt    proc  run   srv   tmp  var

上面容器启动时cmd命令直接输出了列表,但是如果我们想追加-l命令显示更详细的列表时,使用docker run -it b81704c83ed6  -l 添加-l命令是行不通的,下面看测试
root@kali:~/桌面/dockertouch# docker run -it 4f08d53eb1c5 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0001] error waiting for container: context canceled 
发现报错了,`cmd不支持追加参数的形式,必须在命令中输入完整的命令`,如下:
root@kali:~/桌面/dockertouch# docker run -it 4f08d53eb1c5 ls -al
total 56
drwxr-xr-x   1 root root 4096 Mar 12 09:53 .
drwxr-xr-x   1 root root 4096 Mar 12 09:53 ..

ENTERPOINT使用

#编写一下脚本进行测试
FROM centos
ENTRYPOINT ["ls","-a"]

#docker build创建镜像
docker build -f mydocker -t myfile:1.0 .
#执行镜像,发现自动列出目录
root@kali:~/桌面/dockertouch# docker run -it bc1f228ae70e 
.   .dockerenv  dev  home  lib64       media  opt   root  sbin  sys  usr
..  bin         etc  lib   lost+found  mnt    proc  run   srv   tmp  var
#添加-l参数
root@kali:~/桌面/dockertouch# docker run -it bc1f228ae70e  -l
total 56
drwxr-xr-x   1 root root 4096 Mar 12 10:03 .
drwxr-xr-x   1 root root 4096 Mar 12 10:03 ..
-rwxr-xr-x   1 root root    0 Mar 12 10:03 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 12 10:03 dev
drwxr-xr-x   1 root root 4096 Mar 12 10:03 etc

可以直接添加-l参数,  说明ENTRYPOINT 可以在启动容器时直接拼接命令