美文网首页
Docker命令及实战

Docker命令及实战

作者: zhengaoly | 来源:发表于2022-01-18 18:27 被阅读0次

常用Docker命令

docker容器信息

##查看docker容器版本
docker version
##查看docker容器信息
docker info
##查看docker容器帮助
docker --help

镜像操作

##列出本地images
docker images
##含中间映像层
docker images -a
##只显示镜像ID
docker images -q
##含中间映像层
docker images -qa   
##显示镜像摘要信息(DIGEST列)
docker images --digests
##显示镜像完整信息
docker images --no-trunc
##显示指定镜像的历史创建;参数:-H 镜像大小和日期,默认为true;--no-trunc  显示完整的提交记录;-q  仅列出提交记录ID
docker history -H redis

镜像搜索

##搜索仓库MySQL镜像
docker search mysql
## --filter=stars=600:只显示 starts>=600 的镜像
docker search --filter=stars=600 mysql
## --no-trunc 显示镜像完整 DESCRIPTION 描述
docker search --no-trunc mysql
## --automated :只列出 AUTOMATED=OK 的镜像
docker search  --automated mysql

镜像下载

##下载Redis官方最新镜像,相当于:docker pull redis:latest
docker pull redis
##下载仓库所有Redis镜像
docker pull -a redis
##下载私人仓库镜像
docker pull bitnami/redis

删除镜像

##单个镜像删除,相当于:docker rmi redis:latest
docker rmi redis
##强制删除(针对基于镜像有运行的容器进程)
docker rmi -f redis
##多个镜像删除,不同镜像间以空格间隔
docker rmi -f redis tomcat nginx
##删除本地全部镜像
docker rmi -f $(docker images -q)

容器操作

提示:对于容器的操作可使用CONTAINER ID 或 NAMES。

长id和短id都可以,短id就是长id的前三个(一般前三个字母就够区分了)

容器启动

##新建并启动容器,参数:-i  以交互模式运行容器;-t  为容器重新分配一个伪输入终端;--name  为容器指定一个名称
docker run -i -t --name mycentos
##后台启动容器,参数:-d  以守护方式启动容器
docker run -d mycentos
注意:此时使用"docker ps -a"会发现容器已经退出。这是docker的机制:要使Docker容器后台运行,就必须有一个前台进程。解决方案:将你要运行的程序以前台进程的形式运行。

##启动一个或多个已经被停止的容器
docker start redis
##重启容器
docker restart redis

docker run -it --rm ubuntu:14.04 bash
## -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们 这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终 端。
## --rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需 求,退出的容器并不会立即删除,除非手动 docker rm, 我们这里只是随便 执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免 浪费空间。
## ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。
## bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的 是 bash 。

容器进程

##top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
##列出redis容器中运行进程
docker top redis
##查看所有运行容器的进程信息
for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

容器日志

##查看redis容器日志,默认参数
docker logs rabbitmq
##查看redis容器日志,参数:-f  跟踪日志输出;-t   显示时间戳;--tail  仅列出最新N条容器日志;
docker logs -f -t --tail=20 redis
##查看容器redis从2019年05月21日后的最新10条日志。
docker logs --since="2019-05-21" --tail=10 redis

容器进入退出

##使用run方式在创建时进入
docker run -it centos /bin/bash
##关闭容器并退出
exit
##仅退出容器,不关闭
快捷键:Ctrl + P + Q
##直接进入centos 容器启动命令的终端,不会启动新进程,多个attach连接共享容器屏幕,参数:--sig-proxy=false  确保CTRL-D或CTRL-C不会关闭容器
docker attach --sig-proxy=false centos 
##在 centos 容器中打开新的交互模式终端,可以启动新进程,参数:-i  即使没有附加也保持STDIN 打开;-t  分配一个伪终端
docker exec -i -t  centos /bin/bash
##以交互模式在容器中执行命令,结果返回到当前终端屏幕
docker exec -i -t centos ls -l /tmp
##以分离模式在容器中执行命令,程序后台运行,结果不会反馈到当前终端
docker exec -d centos  touch cache.txt 

容器启动以后,最常用的进入容器的命令

docker exec -it  centos /bin/bash

查看容器

##查看正在运行的容器
docker ps
##查看正在运行的容器的ID
docker ps -q
##查看正在运行+历史运行过的容器
docker ps -a
##显示运行容器总文件大小
docker ps -s

##显示最近创建容器
docker ps -l
##显示最近创建的3个容器
docker ps -n 3
##不截断输出
docker ps --no-trunc 

##获取镜像redis的元信息
docker inspect redis
##获取正在运行的容器redis的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis


容器停止删除

##停止一个运行中的容器
docker stop redis
##杀掉一个运行中的容器
docker kill redis
##删除一个已停止的容器
docker rm redis
##删除一个运行中的容器
docker rm -f redis
##删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
## -l 移除容器间的网络连接,连接名为 db
docker rm -l db 
## -v 删除容器,并删除容器挂载的数据卷
docker rm -v redis

容器与宿主数据拷贝

##将rabbitmq容器中的文件copy至本地路径
docker cp rabbitmq:/[container_path] [local_path]
##将主机文件copy至rabbitmq容器
docker cp [local_path] rabbitmq:/[container_path]/
##将主机文件copy至rabbitmq容器,目录重命名为[container_path](注意与非重命名copy的区别)
docker cp [local_path] rabbitmq:/[container_path]

端口和磁盘文件夹映射

docker run -d -p 127.0.0.1:3306:3306 -v
/home/walter/softwares/tutum-docker-mysql/data:/var/lib/mysql tutum/mysql

-p 宿主端口:容器端口
-v 宿主目录:容器目录

端口映射

  1. 启动容器时,端口映射

-p 小写p表示docker会选择一个具体的宿主机端口映射到容器内部开放的网络端口上。
-P 大写P表示docker会随机选择一个宿主机端口映射到容器内部开放的网络端口上。

[root@docker-test ~]# docker run -ti -d --name my-nginx -p 8088:80 docker.io/nginx
2218c7d88ccc917fd0aa0ec24e6d81667eb588f491d3730deb09289dcf6b8125
[root@docker-test ~]# docker run -ti -d --name my-nginx2 -P docker.io/nginx
589237ceec9d5d1de045a5395c0d4b519acf54e8c09afb07af49de1b06d71059
[root@docker-test ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                   NAMES
589237ceec9d        docker.io/nginx     "nginx -g 'daemon ..."   6 seconds ago        Up 5 seconds        0.0.0.0:32770->80/tcp   my-nginx2
2218c7d88ccc        docker.io/nginx     "nginx -g 'daemon ..."   About a minute ago   Up About a minute   0.0.0.0:8088->80/tcp    my-nginx
 
由上面可知:
容器my-nginx启动时使用了-p,选择宿主机具体的8088端口映射到容器内部的80端口上了,访问http://localhost/8088即可
容器my-nginx2启动时使用了-P,选择宿主机的一个随机端口映射到容器内部的80端口上了,这里随机端口是32770,访问http://localhost/32770即可
  1. 启动创建时,绑定外部的ip和端口

宿主机ip是192.168.10.214)

[root@docker-test ~]# docker run -ti -d --name my-nginx3 -p 127.0.0.1:8888:80 docker.io/nginx 
debca5ec7dbb770ca307b06309b0e24b81b6bf689cb11474ec1ba187f4d7802c
[root@docker-test ~]# docker run -ti -d --name my-nginx4 -p 192.168.10.214:9999:80 docker.io/nginx              
ba72a93196f7e55020105b90a51d2203f9cc4d09882e7848ff72f9c43d81852a
[root@docker-test ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
ba72a93196f7        docker.io/nginx     "nginx -g 'daemon ..."   2 seconds ago       Up 1 second         192.168.10.214:9999->80/tcp   my-nginx4
debca5ec7dbb        docker.io/nginx     "nginx -g 'daemon ..."   3 minutes ago       Up 3 minutes        127.0.0.1:8888->80/tcp        my-nginx3
 
由上面可知:
容器my-nginx3绑定的宿主机外部ip是127.0.0.1,端口是8888,则访问http://127.0.0.1:8888或http://localhost:8888都可以,访问http://192.168.10.214:8888就会拒绝!
容器my-nginx4绑定的宿主机外部ip是192.168.10.214,端口是9999,则访问http://192.168.10.214:9999就可以,访问http://127.0.0.1:9999或http://localhost:9999就会拒绝!
  1. 查看容器绑定和映射的端口及Ip地址
[root@docker-test ~]# docker port my-nginx5
80/tcp -> 0.0.0.0:8099
[root@docker-test ~]# docker inspect my-nginx5|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

磁盘映射

Docker的数据持久化主要有两种方式:

  • bind mount
  • volume

Docker的数据持久化即使数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。

  1. bind mount

bind mount自docker早期便开始为人们使用了,用于将host机器的目录mount到container中。但是bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

将host机器上当前目录下的host-data目录mount到container中的/container-data目录:

docker run -it -v /home/host-dava:/mysql/container-data msyql /bin/bash

有几点需要注意:

  • host机器的目录路径必须为全路径(准确的说需要以/~/开始的路径),不然docker会将其当做volume而不是volume处理
  • 如果host机器上的目录不存在,docker会自动创建该目录
  • 如果container中的目录不存在,docker会自动创建该目录
  • 如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉

注意:bind mount指定的目录不受volume管理

  1. 使用volume

volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes。

将my-volume挂载到container中的/mydata目录:

docker run -it -v my-volume:/mysql/mydata mysql sh

然后可以查看到给my-volume的volume:

docker volume inspect my-volume
[
    {
        "CreatedAt": "2018-03-28T14:52:49Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
        "Name": "my-volume",
        "Options": {},
        "Scope": "local"
    }
]

可以看到,volume在host机器的目录为/var/lib/docker/volumes/my-volume/_data。此时,如果my-volume不存在,那么docker会自动创建my-volume,然后再挂载。

也可以不指定host上的volume:

docker run -it -v /mysql/mydata mysql sh

docker将自动创建一个匿名的volume,并将其挂载到container中的/mydata目录。匿名volume在host机器上的目录路径类似于:/var/lib/docker/volumes/300c2264cd0acfe862507eedf156eb61c197720f69e7e9a053c87c2182b2e7d8/_data

除了让docker帮我们自动创建volume,我们也可以自行创建:

docker volume create my-volume-2

然后将这个已有的my-volume-2挂载到container中:

docker run -it -v my-volume-2:/msyql/mydata msyql sh

需要注意的是,与bind mount不同的是,如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将container中的目录覆盖。请参考这里

Dockerfile中的VOLUME

在Dockerfile中,我们也可以使用VOLUME指令来申明container中的某个目录需要映射到某个volume:

#Dockerfile
VOLUME /foo

这表示,在docker运行时,docker会创建一个匿名的volume,并将此volume绑定到container的/foo目录中,如果container的/foo目录下已经有内容,则会将内容拷贝的volume中。也即,Dockerfile中的VOLUME /foodocker run -v /foo alpine的效果一样。

Dockerfile中的VOLUME使每次运行一个新的container时,都会为其自动创建一个匿名的volume,如果需要在不同container之间共享数据,那么我们依然需要通过docker run -it -v my-volume:/foo的方式将/foo中数据存放于指定的my-volume中。

因此,VOLUME /foo在某些时候会产生歧义,如果不了解的话将导致问题。

题外:

windows下dockerApp,可以通过可视化界面管理volume,如下:

image-20220118181930779

新建以后通过命令查看volume信息如下:

image-20220118182047065

新建完成以后,在创建容器时就可以使用了

实践: docker 启动mysql

拉取MySQL镜像

#默认为latest标签mysql:latest
docker pull mysql

启动mysql

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=hisense -v d:/docker-data/mysql-test1/conf.d:/etc/mysql/conf.d -v d:/docker-data/mysql-test1/data:/var/lib/mysql -p 3306:3306 -d mysql:latest 

启动mysql-test容器,映射配置文件目录和数据目录到本次,映射本地端口3306到容器端口3306

-d deamon守护模式

同时映射多个目录,用多个-v

==本次实验采用Windows10安装docker-app的方式,因此本地目录为d:/盘下的某个目录,正常应该为Linux下的目录,如/home/data/等==

此处指定了外部映射目录(通过bind mount方式),那么docker就不会通过volume管理这个目录,docker volume ls也不会有这个目录

如果不指定,则docker根据MySQL的dockfile的volume指令,自动生成一个匿名目录在/var/lib/docker/volumes下.

查看容器

docker ps -a
image-20220118145504510

进入容器

docker exec -it mysql-test bash
image-20220118145813678

用命令行登录mysql

mysql -uroot -p
输入密码:
image-20220118150401361

相关文章

  • Docker命令及实战

    常用Docker命令 docker容器信息 镜像操作 镜像搜索 镜像下载 删除镜像 容器操作 提示:对于容器的操作...

  • 容器Docker学习系列三~命令学习

    今天继续学习我们的Docker命令,在简单的了解命令后我们会开始实战操作执行Docker容器,应用起来我们的命令。...

  • docker命令总结(持续更新)

    目录 docker的作用 docker常用参数及命令 添加docker 删除docker 让docker在后台运行...

  • docker入门

    Docker基础命令学习及redis集群搭建 本堂课内容 一、Docker 入门 Docker是什么? Docke...

  • Docker命令个人记录

    安装:装Docker 必须的依赖库及、添加Dokcer官方的yum源及安装 Docker 命令: 安装:docke...

  • 常用docker命令

    常用docker命令,及一些坑 常用命令 查看容器的root用户密码 docker logs <容器名orID> ...

  • Docker run 命令参数及使用

    Docker run 命令参数及使用 Docker run :创建一个新的容器并运行一个命令 语法 OPTIONS...

  • 腾讯云+docker搭建jenkins实战

    腾讯云+docker搭建jenkins实战 本文会介绍在腾讯云用docker搭建jenkins的过程及技巧,文中如...

  • Docker常用命令小记

    除了基本的docker pull、docker image、docker ps,还有一些命令及参数也很重要,在此记...

  • 记录一次Docker的学习

    Docker学习 Docker概述 Docker安装 Docker命令镜像命令容器命令操作命令... Docker...

网友评论

      本文标题:Docker命令及实战

      本文链接:https://www.haomeiwen.com/subject/kbakhrtx.html