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。