Skip to content

docker常用命令

1.1 基本命令

. 开启/停止/重启container(start/stop/restart)

容器可以通过run新建一个来运行,也可以重新start已经停止的container,但start不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。 容器stop(或Ctrl+D)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入attach进去的界面是一样的,与第一次run启动或commit提交的时刻相同。

类似:-p 本地端口:容器端口 将本地的端口映射到容器的端口当中

docker run -d --name="rabbitmq" -p 5672:5672 -p 15672:15672 rabbitmq:management

CONTAINER_ID=$(docker start <containner_id>)
docker stop $CONTAINER_ID
docker restart $CONTAINER_ID
#修改镜像名字,即复制一份镜像并且重命名。前面的是源镜像信息,后面是新的镜像信息
docker tag centos:7 mycentos:1

.删除

docker rm [containerID] 删除容器

docker rmi [imageID] 删除镜像

.查看容器的信息container(ps)

docker ps:可以查看容器的CONTAINER ID、NAME、IMAGE NAME、端口开启及绑定、容器启动后执行的COMMNAD。最常用的功能是通过ps来找到CONTAINER_ID, 以便对特定容器进行操作。官方给我选项有(通过docker ps --help查看):

--all , -a      Show all containers (default shows just running)
--filter , -f       Filter output based on conditions provided
--format        Pretty-print containers using a Go template
--last , -n -1  Show n last created containers (includes all states)
--latest , -l       Show the latest created container (includes all states)
--no-trunc      Don’t truncate output
--quiet , -q        Only display numeric IDs
--size , -s     Display total file sizes
  1. docker ps 默认显示当前正在运行中的container

  2. docker ps -a 查看包括已经停止的所有容器

  3. docker ps -l 显示最新启动的一个容器(包括已停止的)

  4. docker ps --filter id=8ebf38818f8c--filter name=test 过滤容器id为8ebf38818f8c并且名称为test的关系。相同条件之间的关系是或,不同条件之间的关系是与

  5. docker ps --filter name=^/test$ 通过正则表达式查找容器名称

  6. docker stop $(docker ps --filter name=^/r-.+$ -aq) && docker rm $(docker ps --filter name=^/r-.+$ -aq) 停止并且删除r-开头的容器

.列出机器上的镜像(images)

其中我们可以根据REPOSITORY来判断这个镜像是来自哪个服务器,如果没有 / 则表示官方镜像,类似于username/repos_name表示Github的个人公共库,类似于regsistory.example.com:5000/repos_name则表示的是私服。 IMAGE ID列其实是缩写,要显示完整则带上--no-trunc选项

查看启动日志

查看运行的日志

docker logs -f  containerid
#筛选docker日志
docker logs containerid 2>&1|grep 筛选的内容

有的时候运行失败了,通过上面的方法查看不到日志,通过一下方法查看日志路径,然后显示

docker inspect --format '{{.LogPath}}' containerid
#path为上面命令显示的路径
cat path

容器网络

#创建容器内部通信网络
docker network create redis-net
#查看当前存在的容器网络
docker network  ls
#删除容器网络
docker network rm redis-net

文件复制与挂载

  • 从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径

    docker cp /root/123.txt mycentos:/home/
  • 从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径

    docker cp mycentos:/home/456.txt /root
  • 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 镜像ID

    docker run -itd -v /root/lcy/:/home centos:7

查看容器信息

docker inspect 容器id/容器名称

1.2 Docker环境信息

--info命令

用于检测Docker是否正确安装,一般结合docker version命令使用。

--version命令

1.3 容器运维操作

--attach命令

docker attach命令对应开发者很有用,可以连接到正在运行的容器,观察容器的运行状况,或与容器的主进程进行交互。

--inspect命令

用于查看镜像和容器的详细信息,默认会列出全部信息,可以通过--format参数来指定输出的模板格式,以便输出特定信息。

docker search TERM
# docker search seanlo
NAME                DESCRIPTION           STARS     OFFICIAL   AUTOMATED
seanloook/centos6   sean's docker repos         0

搜索的范围是官方镜像和所有个人公共镜像。NAME列的 / 后面是仓库的名字。

2.1 从docker registry server 中下拉image或repository(pull)

Usage: docker pull [OPTIONS] NAME[:TAG]
# docker pull centos

上面的命令需要注意,在docker v1.2版本以前,会下载官方镜像的centos仓库里的所有镜像,而从v.13开始官方文档里的说明变了:will pull the centos:latest image, its intermediate layers and any aliases of the same id, 也就是只会下载tag为latest的镜像(以及同一images id的其他tag)。 也可以明确指定具体的镜像:

# docker pull centos:centos6

当然也可以从某个人的公共仓库(包括自己是私人仓库)拉取,形如docker pull username/repository<:tag_name> :

# docker pull seanlook/centos:centos6

如果你没有网络,或者从其他私服获取镜像,形如docker pull registry.domain.com:5000/repos:<tag_name>

# docker pull dl.dockerpool.com:5000/mongo:latest

6.1 推送一个image或repository到registry(push)

与上面的pull对应,可以推送到Docker Hub的Public、Private以及私服,但不能推送到Top Level Repository。

# docker push seanlook/mongo
# docker push registry.tp-link.net:5000/mongo:2014-10-27

registry.tp-link.net也可以写成IP,172.29.88.222。 在repository不存在的情况下,命令行下push上去的会为我们创建为私有库,然而通过浏览器创建的默认为公共库。

8.1 修改容器内的配置文件

因为docker容器里面是比较纯净的环境,里面可能没有vi等命令,需要自习安装

  1. 进入docker容器内部:

    docker exec -it 容器名称 base
  2. 更新命令

    apt-get update
  3. 下载vi命令

    apt-get install vim
  4. 修改指定的映射文件,如mysql的文件

    vi /etc/mysql/my.cnf

8.2 自定义镜像

自定义容器的镜像有两种方式,一种是复制现有镜像,一种是手写dockerfile生成镜像

、commit

生成镜像:

#-a表示作者 -m表示描述  复制现有的容器id,  最后是生成的镜像名
docker commit -a "lcy" -m "自定义镜像" 容器id mydocker

、dockerfile

dockerfile基础指令:

  • FROM:基于哪个镜像

  • MAINTAINER:作者和邮箱信息

  • COPY:复制命令,将文件复制到容器当中,如果是需要复制的文件与dockerfile在同一路径,要使用相对路径

  • ADD:也是复制文件,但是如果是.tar或者.zip文件,放入容器里会自动解压

  • WORKDIR:默认工作目录,进入容器的默认路径。如果不存在会自动创建

  • ENV:配置环境变量的命令

  • EXPOSE:暴露容器的端口

  • RUN:执行后边的命令,在构建镜像的时候执行,作用于镜像层面

  • ENTRYPOINT:执行后边的命令,在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条

  • CMD:执行后边的命令,在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条,容器启动后执行默认的命令或者参数,允许被修改

  • 命令格式:

    • shell命令格式:RUN yum install -y net-tools

    • exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]

将dockerfile与123.txt放到相同路径下,执行一下命令构建镜像,先vi dockerfile将文件复制进去

#.表示当前路径,会自动找出dockerfile文件。也可以自己指定文件
docker build -t mycentos:v2 .
# this is a dockerfile
#获取基础镜像centOS7
FROM centos:7
#记录作者和邮箱
MAINTAINER lcy 123456@qq.com
#打印记录
RUN echo "正在构建镜像!!!"
#选择工作目录,即进入镜像的默认路径
WORKDIR /home/user
#复制当前文件夹下的123.txt到容器的/home/user下
COPY 123.txt /home/user
#安装网络工具
RUN yum install -y net-tools

通过下面命令可以看到镜像的分层结构,后面的是镜像名称/镜像id

docker history -t centos:v2

9.1 清理容器

# 查看docker各类型文件占用情况
docker system df
#删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
#删除所有dangling镜像(即无tag的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
#删除所有dangling数据卷(即无用的Volume):
docker volume rm $(docker volume ls -qf dangling=true)
#清理none镜像
docker rmi -f $(docker images | grep "<none>" | awk "{print $3}")
#清理
docker image prune -a  -f