docker常用命令

51 篇文章 0 订阅
5 篇文章 0 订阅

docker 常用命令

docker ps -a   #查看所有容器

docker stop <container_id/container_name>     #停止容器

docker rm container_id   #删除容器

docker rename <old_container_name> <new_container_name>    #容器重命名

docker stats -a   #查看容器性能状态

宿主机与容器之间的拷贝
docker cp test/ sybase160:/mnt
docker cp sybase160:/mnt test/

docker images  #查看镜像

使用Dockerfile创建镜像

docker build -t sybase:16.0 . 

docker build 相关参数:
-t:指定镜像的名称及标签(TAG),通常 name:tag 或者 name 格式,可以在一次构建中为一个镜像设置多个标签。
-f:指定要使用的Dockerfile路径
--rm:设置镜像成功后删除中间容器

删除所有docker none镜像
docker rmi `docker images | grep  '<none>' | awk '{print $3}'`

查询/搜索镜像
docker search [options] <NAME>

docker search options 说明
--no-trunc : 显示完整的镜像描述
-s : 列出用户评价不小于指定值的镜像,通过该参数控制列出受欢迎程度的镜像
–automated : 只列出 automated build类型的镜像

属性说明
STARS:用户评价,反应一个镜像的受欢迎程度,STARS越多说明越受欢迎
OFFICIAL:是否官方
AUTOMATED:自动构建,说明该镜像是由Docker Hub自动构建流程创建的

docker search sybase
docker search -s 10 sybase


查询github上的镜像
docker search sybase
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/ifnazar/sybase_15_7               SYBASE 15.7                                     21                   
docker.io   docker.io/datagrip/sybase                   Sybase 15.7 & 16.0                              18                   [OK]
docker.io   docker.io/cbsan/sybase                      Server Sybase 16                                2                    [OK]
docker.io   docker.io/chernov/sybase                    Sybase 15.7                                     2                    [OK]
docker.io   docker.io/integra/sybase-provider           Integra SAP Sybase Provider                     1                    
docker.io   docker.io/joroslim/sybase_15_7              SYBASE 15.7 came from ifnazar/sybase_15_7/      1                    
docker.io   docker.io/unetman/sybase                    Sybase ASE 16.2                                 1                    
docker.io   docker.io/ademirleal/sybaseteste                                                            0                    
......

查询github上收评价STARS不小于10的sybase镜像
docker search -s 10 sybase
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX       NAME                            DESCRIPTION          STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/ifnazar/sybase_15_7   SYBASE 15.7          21                   
docker.io   docker.io/datagrip/sybase       Sybase 15.7 & 16.0   18                   [OK]

这里有点疑问没有搞明白,第一天我执行 docker search sybase 的结果多显示了一列 INDEX(位于第一列),而且 NAME 显示的值的格式为:INDEX/NAME。
不知道是什么原因,第二天执行 docker search sybase 显示就正常了。

第二天执行的结果就显示正常了(没有包含 INDEX 属性,NAME 显示的内容也没有包含 INDEX):
# docker search sybase
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ifnazar/sybase_15_7               SYBASE 15.7                                     21                                      
datagrip/sybase                   Sybase 15.7 & 16.0                              18                                      [OK]
chernov/sybase                    Sybase 15.7                                     2                                       [OK]
cbsan/sybase                      Server Sybase 16                                2                                       [OK]
joroslim/sybase_15_7              SYBASE 15.7 came from ifnazar/sybase_15_7/      1                                       
......

# docker search -s 10 sybase
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                  DESCRIPTION          STARS               OFFICIAL            AUTOMATED
ifnazar/sybase_15_7   SYBASE 15.7          21                                      
datagrip/sybase       Sybase 15.7 & 16.0   18                                      [OK]


下载(拉取)镜像
语法:docker pull 镜像名称[:TAG]
docker pull datagrip/sybase

查看所有镜像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
datagrip/sybase     latest              29cd514762d6        11 months ago       5.92GB
 

删除镜像
docker rmi 镜像ID
docker rmi -f 镜像ID
docker rmi -f 镜像名:TAG
docker rmi -f 镜像名1:TAG 镜像名2:TAG
例如:
docker rmi 29cd514762d6
docker rmi -f datagrip/sybase:latest
docker rmi -f $(docker images -qa)    #删除所有镜像
docker rmi $(docker images -q -f dangling=true)   #删除所有未打标签的镜像

设置镜像标签(TAG)
docker tag 镜像ID 镜像名:TAG
docker tag 860c279d2fec runoob/centos:dev

使用/运行镜像
docker run 镜像名称
docker run datagrip/sybase
创建并启动容器并设置 映射端口、映射共享目录、容器名:
docker run -d -p 8000:5000 --name datagrip-sybase -it datagrip/sybase /bin/sh
docker run -d -p 8000:5000 --name datagrip-sybase -it datagrip/sybase /bin/bash
docker run -d -p 8000:5000 --name datagrip-sybase -it datagrip/sybase
docker run -d -p 8000:5000 --name datagrip-sybase -v /opt/docker_data:/data:rw -it datagrip/sybase

执行 docker run 时注意:
如果需要授予容器额外的权限的话需要加相关参数:

docker run -d -it -p 25258:5258 --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN --name nginx-me nginx:1.0 /usr/sbin/init 

docker run 表示的是创建容器;
-i 是提供一个交互模式运行容器通常和 -t 搭配使用;
-t 为容器分配一个伪终端;
-d 后台运行容器返回容器ID;
--privileged 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。比如要在容器里用systemctl做服务管理,必须要root权限;
--name 就是定义一个名字像我定义的名字就是 nginx-me;
nginx:1.0 即:repository:tag,也就是docker images 所列出来的镜像;
重点最后这一句 /usr/sbin/init 就是给容器一个超级管理员的权限,登入终端是有init负责的;


By default, Docker containers are “unprivileged” and cannot, for example, run a Docker daemon inside a Docker container. 
This is because by default a container is not allowed to access any devices, but a “privileged” container is given access to all devices (see the documentation on cgroups devices).
--cap-add: Add Linux capabilities,
--cap-drop: Drop Linux capabilities,
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.

When the operator executes docker run --privileged, Docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.
In addition to --privileged, the operator can have fine grain control over the capabilities using --cap-add and --cap-drop.
 


进入容器
docker exec -it <docker name>             # docker ps -a 可查看 docker name
docker exec -it <container_id> /bin/sh   #进入容器命令行shell
docker exec -it datagrip-sybase /bin/sh


启动/停止容器
docker start sybase
docker stop sybase
 

exit  //退出容器命令行界面

将现有容器封装为镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]   //根据已有的容器来修改提交,产生一个新的镜像,之后可以 docker images 查看

docker commit -a "userA" -m "commit_message_test" efadb1d66475 demo:1.0 image_id

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
demo               1.0              efadb1d66475        25 minutes ago      188.3 MB
demo               1.1              faec98d5b438        10 minutes ago      188.3 MB
 

docker commit sybase160 sybase160/v1

docker save –o /data/demo.tar demo:1.0  //镜像的存出

docker rmi <image_id>  

docker load —input demo.tar  //镜像的载入

docker load < demo.tar

docker push NAME[:TAG]  //镜像的上传,上传自己本地镜像到仓库,默认上传到DockerHub官方仓库(需要登陆)

在上传之前可以先为自己的镜像添加带自己名字(作者信息)的标签

docker tag old-image[:old-tag] new-image[:new-tag]  //tag命名不能包含冒号了,这里冒号是分隔符

docker tag demo:1.1 demo:1.2

docker push demo:1.1


镜像导出
docker save –o /opt/demo.tar demo:1.0 //导出镜像

镜像导入
docker load --input demo.tar

docker load -i demo.tar

docker load < demo.tar

===================

如果容器配置修改后,将现有的容器保存为镜像,导出到其他机器使用:

docker commit 7d0a124d9bba  #先保存容器修改
docker commit -a "userA" -m "config_init" 7d0a124d9bba eclipse-mosquitto-me:1.0  # REPOSITORY:TAG is eclipse-mosquitto-me:1.0  #保存容器修改到新的镜像中
docker images #可看到新的镜像
docker save -o eclipse-mosquitto-me.tar eclipse-mosquitto-me:1.0  #导出新的镜像,语法:docker save -o outputfile.tar REPOSITORY:TAG

docker stop 7d0a124d9bba
docker rm 7d0a124d9bba
docker images
docker rmi 457fe4154880
docker load -i /opt/eclipse-mosquitto-me.tar
docker images
docker run -d -p 1883:1883 --name mosquitto-me-01 -it eclipse-mosquitto-me:1.0 /bin/sh

==========================

编辑Dockerfile设置docker内的服务自动启动:

以gbase8a docker为例,基于 shihd/gbase8a:1.0 修改后生成新的镜像和容器 & 编辑 Dockerfile 设置服务自动启动

当前容器和镜像信息:
[root@gbase8a build]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED       SIZE
shihd/gbase8a   1.0       cc1471f767e5   3 years ago   542MB

[root@gbase8a build]# docker ps -a
CONTAINER ID   IMAGE               COMMAND         CREATED        STATUS             PORTS                                       NAMES
763e65eff391   shihd/gbase8a:1.0   "sh start.sh"   24 hours ago   Up About an hour   0.0.0.0:5258->5258/tcp, :::5258->5258/tcp   gbase8a
[root@gbase8a build]# 


1)进入容器修改配置
docker exec -it xxx /bin/bash
vi xxx
exit

2)保存容器修改(持久化)生成新的image:
格式:
docker commit [ -a "user" ] [ -m "description" ] docker_id [ REPOSITORY:TAG ]
举例:
docker commit -a "me" -m "gbase8a-cfg-modify" 763e65eff391 shihd/gbase8a:1.1

docker commit 之后会生成新的image id,如果 [REPOSITORY:TAG] 指定不变,则老的image id会变成<none>、可rmi删除,如果 [REPOSITORY:TAG] 指定有变,则老的image id也存在,会被新的image id依赖、不可rmi删除。

如果要设置docker内部自己的应用服务能够随docker启动时自启动,一种方法是设置为系统服务,另外一种方法就是编写应用的start.sh启动脚本和Dockerfile,使用 docker build 方式打包生成镜像、将启动脚本打包到镜像中去:

mkdir build
cd build

vi Dockerfile

写入如下内容:
FROM shihd/gbase8a:1.1
WORKDIR /home/gbase
ENTRYPOINT sh start.sh
LABEL user="me"
USER gbase

关于 Dockerfile 的详细参数说明,可参考本文后面的“Dockerfile 详细参数介绍”章节的介绍。


vi start.sh

#!/bin/bash
source ~/.bashrc
gbase.server start
sleep 3
gbase -uroot -e "SET PASSWORD FOR root = PASSWORD('root')"
echo `lsof -i:5258`
tail -f /home/gbase/GBase/log/gbase8a/system.log

build方式构建镜像:
格式:
docker build -t repository:tag dir
举例:
docker build -t shihd/gbase8a:1.1 . 

这里build打包的时候,会把整个目录的内容打包进去;build时指定的 REPOSITORY:TAG 必须存在,本地执行docker images列表中必须存在。

无论是commit方式还是build方式,执行后都会生成新的对应TAG的images id。

3)查看新生成的镜像:
docker images

4)使用镜像启动新容器(如果不需要挂磁盘,则可以去掉 -v 参数)
docker run -d -p 5258:5258 -v /data:/home/data:rw --name gbase8a-me -i -t shihd/gbase8a:1.1 /bin/bash
docker ps -a
查看到新容器已运行

5)导出新镜像到本地文件,作为备份,导出格式:docker save -o saved-file-name.tar [ repository : new_tag ]
cd ..
docker save -o shihd-gbase8a-1.1-me.tar shihd/gbase8a:1.1

如果镜像拷贝和加载时使用命令加载指定镜像:
docker load -i shihd-gbase8a-1.1-me.tar
 

Dockerfile 详细参数介绍

  • FROM:指定基础(base)镜像,本地有镜像则直接使用,否则直接在线拉取(pull)。
  • MAINTAINER:指定镜像作者信息,即镜像的Author属性。按照官方文档描述,建议使用 LABEL user="xxx" 代替 MAINTAINER xxx。
  • LABEL:LABEL 为镜像增加元数据,一个 LABEL 是键值对,多个键值对之间使用空格分开,命令换行时是使用反斜杠\,也可以定义多个 LABEL。按照官方文档描述,建议使用 LABEL user="xxx" 代替 MAINTAINER xxx。
  • USER:指定运行容器时的用户名或 UID,后续的 RUN 等指令也会使用指定的用户身份。支持两种配置格式:USER <user>[:<group>] 和 USER <UID>[:<GID>]。例如:USER gbase。
    注意:
    1)当容器中运行的服务不需要管理员权限时,可以先建立一个特定的用户和用户组,为它分配必要的权限,使用 USER 切换到这个用户。
    2)使用 USER 指定用户后,Dockerfile 中后续的命令 RUN、CMD、ENTRYPOINT 都将使用该用户。
    3)如果在 Windows 上,如果用户不是内置帐户,则必须先创建该用户,可以通过 Dockerfile 的 RUN net user 命令来完成:RUN net user /add frank。
    4)如果不指定 USER,默认容器启动 USER = root。如果 docker run 指定了-u 参数(例如: docker run -u gbase ......),则会覆盖 Dockerfile 中指定的 USER。
  • COPY:将文件或目录从 build context 复制到镜像,其支持Shell和Exec两种格式:COPY src dest 和 COPY["src","dest"]。注意:src只能是文件或目录。COPY为构建阶段执行的指令。
  • ADD:与COPY类似,复制文件到镜像,不同的是 ADD 的 src 是归档文件(tar、zip、tgz等),这些归档文件会被自动解压到dest(镜像目标路径),无需手动解压。
  • ENV:设置环境变量,该变量可被后面的指令使用。
  • EXPOSE:指定容器中的进程会监听的某个端口,指定后 Docker 可以将该端口暴露出来。
  • VOLUME:将文件或目录声明为 volume ,指定后 Docker 可以将该目录或文件映射出来。
  • WORKDIR:为后面的 RUN、CMD、ENTRYPOINT、ADD、COPY 指令设置镜像中的当前工作目录。
  • RUN:在容器中运行指令的命令,其支持Shell和Exec两种格式。RUN 执行命令并创建新的镜像层,常用于安装软件包,每条 RUN 指令都会生成新的镜像。在安装一些基础工具或应用的时候,如果有多套命令最好放在一个 RUN 指令下执行(多条命令用 && 符号连接),例如:RUN yum install -y xx && yum install -y xxxx。
  • CMD:启动容器时容器来运行指定的命令,其支持Shell和Exec两种格式。该命令会在容器启动且 docker run 后面没有指定其他命令时执行。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,如果 docker run 后面指定有参数,该参数将会替换(覆盖) CMD 的参数。
  • ENTRYPOINT:启动容器时容器来运行指定的命令,其支持Shell和Exec两种格式。Dockerfile 中可以有多个 ENTRYPOINT 指令,也是只有最后一个生效,但与 CMD 不同的是,CMD 或 docker run 之后的参数会被当作参数传给 ENTRYPOINT。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny05296

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值