Docker常用命令

Docker命令清单

docker提供了查看其所有支持的命令清单,只需运行

docker		或		docker help

从提示中可以看出,Docker命令是很多的,可以管理Docker,有操作镜像容器等等。对于常用的可能就是操作镜像容器了。所以这里主要列举下对于镜像、容器常用的一些命令操作,同时也会列举下一些其他常用的命令。对于某个命令想知道其详细的参数选项时,可依照此模式进行查看。

docker COMMAND --help

如,查看run的详细信息

docker run --help

1. 镜像常用命令

1.1 搜索镜像

利用search命令。

docker search jdk
1.2 拉取镜像

利用pull命令。

用法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull jboss/base-jdk:8
1.3 查看已下载镜像列表

利用images命令

查看指定镜像

docker images jboss/base-jdk:8

查看所有镜像

docker images

[root@localhost project]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jason.liu/springboot    latest              13b66f581a62        42 minutes ago      270MB
jason.liu/jre8          latest              10168f7fe757        About an hour ago   251MB
frolvlad/alpine-glibc   latest              dbb18830337d        5 weeks ago         12.2MB
hello-world             latest              fce289e99eb9        5 months ago        1.84kB
1.4 镜像拷贝

同时重命名,利用tag命令

# 比如,想创建拷贝一个镜像`hello-wrold`,同时命名为`lqdev.cn/hello-world:1`
docker tag hello-world lqdev.cn/hello-world:1
1.5 基于Dockerfile创建一个新的镜像

利用build命令(注意最后面的.)

# 使用当前目录下的Dockerfile,同时镜像命名(`-t`,指tag)为:lqdev.cn/first:1
docker build -t lqdev.cn/first:1 .
1.6 删除镜像

利用rmi命令(这里需要注意,当镜像有容器在使用时,是无法删除的,需要先删除容器再来删除镜像。)

docker rmi jboss/base-jdk:8
或者根据images_id删除
docker rmi b123d943e165
2.容器常用命令
2.1 运行容器

利用run命令。

docker run hello-world

运行命令是最常用的命令了,这里其常用选项进行列举说明下

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;

比如,我们后台运行redis实例,同时指定其宿主端口为16379

docker run -p 16379:6379 -d redis:3.2
2.2 容器列表

使用ps命令,可以列举出当前运行的容器,需要所有容器时,加入-a选项即可。

docker ps -a

[root@localhost project]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                         PORTS                    NAMES
128e0a848c5d        jason.liu/springboot   "java -Djava.securit…"   About an hour ago   Up About an hour               0.0.0.0:8090->8080/tcp   spring-boot
5d653bed7473        jason.liu/jre8         "java -version"          About an hour ago   Exited (0) About an hour ago                            myjre8
2.3 停止容器

利用stop命令。

# docker stop 容器id
docker stop 3ba5b7475423
2.4 启动已停止容器

利用start命令。

# docker start 容器id
  docker start 3ba5b7475423
2.5 重启容器

利用restart命令。

# docker restart 容器id
docker restart 3ba5b7475423
2.6 强制停止容器

利用kill命令。

# docker kill 容器id
docker kill 3ba5b7475423
2.7 删除容器

利用rm命令(只能删除已经停止的容器,若需要删除正在运行的容器,可加入-f参数选项)

# docker rm 容器ID
docker rm 3ba5b7475423
2.8 进入容器

在一些场景下,比如想查看redis的客户端redis-cli时,这个时候就需要进入容器了。进入容器有很多中,这里就exec进行讲解下,其他的比如attach不熟悉,大家可自行搜索下。

# docker exec -it 容器ID 参数
 docker exec -it 3ba5b7475423 redis-cli  
 参数说明:
-d:分离模式: 在后台运行	
-i:即使没有附加也保持STDIN 打开
-t:分配一个伪终端
2.9 容器中创建一个镜像

在制作一些私有镜像时,常常是依赖于一个基础镜像后,然后进入容器中进行相关系统环境的配置,或者相应的优化。但若容器一删除,之前的修改都会没有了。故在这些场景下,可直接从修改后的容器中创建一个自己的私有镜像,这样里面的一些环境和相关优化项还是保留的。这个主要会在构建私有镜像章节时具体展开。

# docker commit [options] 容器id name:tag
 docker commit 3ba5b7475423 lqdev.cn/redis:1
 参数说明:
-a:提交的镜像作者
-c:使用Dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit时,将容器暂停
3.其他常用命令
3.1 查看日志

利用logs命令。

# docker logs [OPTIONS] 容器ID
  docker logs -f 3ba5b7475423
  参数说明:
 -f : 跟踪日志输出
--since :显示某个开始时间的所有日志
 -t : 显示时间戳
--tail :仅列出最新N条容器日志
3.2 宿主和容器之间相互拷贝文件

利用cp命令。

# docker cp 容器名:要拷贝的文件在容器里面的路径  要拷贝到宿主机的相应路径
# docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp 3ba5b7475423:/opt/a.json /opt
docker cp /opt/a.json 3ba5b7475423:/opt



Dockerfile介绍

Dockerfile是一个文本文件,里面包含了若干条指令,每条指令描述了构建镜像的细节。简单来说,它就是由一系列指令和参数构成的脚本文件,从而构建出一个新的镜像文件。

1.Dockerfile格式

简单来说,Dockerfile格式一般如下:

# 注释
指令 [参数]

这里以一个修改Nginx镜像首页为示例(此镜像使用说明详见:https://hub.docker.com/_/nginx/),简单说明:

 # 注意:非注释第一行 必须以FROM 开头。
 # FROM 指定基础镜像,即以此镜像作为基础
 FROM nginx
 # 设置元数据,利用 docker inspect [镜像名称|镜像ID],即可查看。
 LABEL author="作者:oKong"
 LABEL version="版本:v0.1"
 LABEL desc="说明:修改nginx首页提示"
 # 操作执行,这里直接修改了nginx的html的首页内容,/usr/share/nginx/html
# 原本想输出中文,乱码了,设置了 ENV LANG C.UTF-8 或者 ENV LANG zh_CN.UTF-8 都不行 放弃了,有知道大神望告知!
 RUN echo 'hello,oKong' > /usr/share/nginx/html/index.html
 # 启动命令 不写时 会直接使用基础镜像的启动命令
 CMD ["nginx", "-g", "daemon off;"]

然后利用build命令进行构建。

docker build -t lqdev.cn/mynginx:v1 .

控制台会显示具体每一个执行说明

[root@izbp16chpwsnff41nrjtfhz docker]# docker build -t lqdev.cn/mynginx:v1 .
Sending build context to Docker daemon   2.56kB
Step 1/6 : FROM nginx
 ---> c82521676580
Step 2/6 : LABEL author="作者:oKong"
 ---> Running in 81eb0dc40699
Removing intermediate container 81eb0dc40699
 ---> 4d2799492a09
Step 3/6 : LABEL version="版本:v0.1"
 ---> Running in e4e0d6097bae
Removing intermediate container e4e0d6097bae
 ---> d47eb89ae7b4
Step 4/6 : LABEL desc="说明:修改nginx首页提示"
 ---> Running in 36b1bffc8345
Removing intermediate container 36b1bffc8345
 ---> 3e9b63e69b0a
Step 5/6 : RUN echo 'hello,oKong' > /usr/share/nginx/html/index.html
 ---> Running in 1f04dafc3bf6
Removing intermediate container 1f04dafc3bf6
 ---> c9a649422c1d
Step 6/6 : CMD ["nginx", "-g", "daemon off;"]
 ---> Running in f6f41f072643
Removing intermediate container f6f41f072643
 ---> 11e7ca53febd
Successfully built 11e7ca53febd
Successfully tagged lqdev.cn/mynginx:v1

查看镜像列表,就能看见刚刚构建的镜像了。

[root@izbp16chpwsnff41nrjtfhz docker]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED              SIZE
lqdev.cn/mynginx       v1                  11e7ca53febd        About a minute ago   109MB
nginx                  latest              c82521676580        7 days ago           109MB
lqdev.cn/hello-world   1                   2cb0d9787c4d        3 weeks ago          1.85kB
hello-world            latest              2cb0d9787c4d        3 weeks ago          1.85kB

然后,我们运行下:

docker run -p 80:80 -d lqdev.cn/mynginx:v1

之后访问宿主服务地址:http://宿主IP, 即可看见修改后的首页了。

同时,利用inspect命令,查看镜像元数据,就可以看见刚刚指定的值了。

docker inspect 11e7ca53febd

所以可以看出Dockerfile主要分为四个部分基础镜像信息元数据信息镜像操作指令启动执行指令。下一部分就主要讲解下关于Dockerfile的命令说明。

2.Dockerfile命令说明

2.1 FROM 指定基础镜像

放在第一行,其格式为:

#语法:
FROM <image> 
FROM <image>:<tag>
FROM <image>:<digest>

若想构建一个最小的镜像,不想基于其他任何镜像时。可直接

FROM scratch
2.2 LABEL 镜像元数据

可以设置镜像的任何元数据,格式为:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

例如:

LABEL author="作者:oKong"
LABEL version="版本:v0.1"
LABEL desc="说明:修改nginx首页提示"

然后利用docker inspect命令进行查看。

"Labels": {
	   "author": "作者:oKong",
	    "desc": "说明:修改nginx首页提示",
	    "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>",
	    "version": "版本:v0.1"
},
2.3 ENV 设置环境变量

主要就是设置环境变量,之后的命令都可以用此变量进行赋值,格式如下:

ENV <key> <value>
ENV <key>=<value> ...
2.4 VOLUME 定义匿名卷

VOLUME用于创建挂载点,即向基于所构建镜像创始的容器添加卷:

VOLUME ["/data"]

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

  • 卷可以容器间共享和重用
  • 容器并不一定要和其它容器共享卷
  • 修改卷后会立即生效
  • 对卷的修改不会对镜像产生影响
  • 卷会一直存在,直到没有任何容器在使用它
    VOLUME 让我们可以将源代码、数据或其它内容添加到镜像中,而又不并提交到镜像中,并使我们可以多个容器间共享这些内容。
2.5 COPY 复制文件

主要就是构建镜像时,进行拷贝文件到镜像的指定路径下,格式为:

COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
2.6 ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如<源路径>可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到<目标路径>去。

2.7 EXPOSE 设置监听端口

为镜像设置监听端口,容器运行时会监听改端口,格式为:

EXPOSE <port> [<port>/<protocol>...]

如,nginx镜像,监听了80端口

EXPOSE 80

同时,也能指定协议名,如:

EXPOSE 80/udp
2.8 ARG 设置构建参数

该命令用于设置构建参数,该参数在容器运行时是获取不到的,只有在构建时才能获取。这也是其和ENV的区别。

ARG <name>[=<default value>]

使用举例:

arg author=okong
# 构建时,也可以替换了
# docker build --build-arg <varname>=<value>
docker build --build-arg author=${author}
2.9 RUN 执行命令

在镜像的构建过程中执行特定的命令,并生成一个中间镜像。格式:

RUN <command>
或者
RUN ["executable", "param1", "param2"]

这也是很常用的一个功能了。
第一种后边直接跟shell命令

  • 在linux操作系统上默认 /bin/sh -c
  • 在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用。

可将executable理解成为可执行文件,后面就是两个参数。

两种写法比对:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

RUN书写时的换行符是\

2.10 CMD 启动时命令

功能为容器启动时要运行的命令,
语法有三种写法

1. CMD ["executable","param1","param2"]
2. CMD ["param1","param2"]
3. CMD command param1 param2

第三种比较好理解了,就时shell这种执行方式和写法,第一种和第二种其实都是可执行文件加上参数的形式:
举例说明两种写法:

CMD [ "sh", "-c", "echo $HOME" 
CMD [ "echo", "$HOME" ]

补充细节:这里边包括参数的一定要用双引号,就是双引号",不能是单引号。千万不能写成单引号。原因是参数传递后,docker解析的是一个JSON array

2.11 ENTRYPOINT 启动默认命令

ENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序。ENTRYPOINT 有以下两种形式:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINTCMD 非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINTDockerfile 中只允许有一个ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT 指令。
docker run运行容器时指定的参数都会被传递给ENTRYPOINT,且会覆盖 CMD 命令指定的参数。如,执行docker run <image> -d时,-d参数将被传递给入口点。
也可以通过docker run --entrypoint重写 ENTRYPOINT 入口点。如:可以像下面这样指定一个容器执行程序:

ENTRYPOINT ["/usr/bin/nginx"]

这里以上面Dockerfile格式章节,作为例子:

# 注意:第一行 必须以FROM 开头。
 # FROM 指定基础镜像,即以此镜像作为基础
 FROM nginx
 # 设置元数据,利用 docker inspect [镜像名称|镜像ID],即可查看。
 LABEL author="作者:oKong"
 LABEL version="版本:v0.1"
 LABEL desc="说明:修改nginx首页提示"
 
 # 操作执行,这里直接修改了nginx的html的首页内容,/usr/share/nginx/html
# 原本想输出中文,乱码了,设置了 ENV LANG C.UTF-8 或者 ENV LANG zh_CN.UTF-8 都不行 放弃了,有知道大神望告知!
 RUN echo 'hello,oKong' > /usr/share/nginx/html/index.html
 
 # 启动命令 不写时 会直接使用基础镜像的启动命令
 # CMD ["nginx", "-g", "daemon off;"]
 # 这里利用 ENTRYPOINT 改写
 ENTRYPOINT ["nginx"]

使用docker build构建镜像,并将镜像指定为lqdev.cn/mynginx:v2

docker build -t lqdev.cn/mynginx:v2 .

构建完成后,使用lqdev.cn/mynginx:v2启动一个容器:

docker run -p 80:80 -d lqdev.cn/mynginx:v2 -g "daemon off;"

在运行容器时,我们使用了-g "daemon off;",这个参数将会被传递给 ENTRYPOINT,最终在容器中执行的命令为 nginx -g "daemon off;"。此时,可利用docker ps -a查看下,最后效果是一样的。

2.12 WORKDIR 指定工作目录

用于在容器内设置一个工作目录:

WORKDIR /opt/docker/workdir

通过WORKDIR设置工作目录后,Dockerfile 中其后的命令RUNCMDENTRYPOINTADDCOPY等命令都会在该目录下执行。

2.13 USER 指定当前用户

用于指定运行镜像所使用的用户:

USER okong

使用USER指定用户后,Dockerfile 中其后的命令RUNCMDENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

2.14 其他命令

有像ONBUILDSTOPSIGNALSHELL及其MAINTAINER(已弃用)等命令,不是十分常用或者已经弃用的,这里不阐述了。主要是没看懂具体啥意思,⊙﹏⊙‖∣。大家可通过其官网进行查看下:https://docs.docker.com/engine/reference/builder/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值