1.docker基本命令
- 查看版本:
docker version
- 查看详细信息:
docker info
- 获取帮助:
docker --help
2.镜像命令
2.1 查看镜像
docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 42f82e150ec2 20 months ago 448MB
说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
`docker images --help``
$ docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
REPOSITORY[:TAG]说明:
同一个仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像
Options说明:
- -a:列出本地所有镜像(含中间映像层)
- -q:只显示镜像ID
- --digests:显示镜像的摘要信息
- --no-trunc:显示完整的镜像信息-
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 42f82e150ec2 20 months ago 448MB
$ docker images -q
0886915a6dee
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
mysql 5.7.37 sha256:66480693e 42f82e150ec2 20 months ago 448MB
$ docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.37 sha256:42f82e150ec 20 months ago 448MB
2.2 镜像搜索
docker search
都是从https://hub.docker.com/进行搜索,如果配置了镜像加速器,拉取时候才从镜像加速网址下拉取 docker search tomcat
和官网上对应
docker search --help
$ docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
Options说明
- --no-trunc:显示完整的镜像描述
- -f:过滤信息
- --limit:查询返回的最大数量,默认25
docker search --no-trunc tomcat
过滤stars > 50的
老版本:docker search -s 50 tomcat
(新版本已弃用)
新版本:docker search -f stars=50 tomcat
(注意不包含50)
格式写错例如:docker search -f st 30 tomcat 会报错误信息:
invalid argument "st" for "-f, --filter" flag: bad format of filter (expected name=value)
2.3 下载镜像
docker pull NAME[:TAG|
不指定tag默认latest,镜像是分层的
$ docker pull tomcat
$ docker pull redis:6.2.4
2.4 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
$ docker rmi hello-world
加上-f
表示强制删除
- 删除单个镜像:
docker rmi -f 镜像ID或镜像名
- 删除多个镜像:
docker rmi -f 镜像1_ID/镜像名1[:TAG] 镜像2_ID/镜像名2[:TAG]
- 删除所有镜像:
docker rmi -f $(docker images -qa)
3.容器命令
3.1 run流程
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明
--name="容器新名字“:为容器指定一个名称(中间=可有可无)
-d:后台运行容器,并返回容器ID,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用 (如果运行centos,进入伪centos终端)
-P:(大写)随机端口映射
-
-p:(小写)指定端口映射,有以下四种格式:
ip:hostPort:containerPort ip::containerPort hostPort:containerPort 主要使用这种 containerPort
3.2 启动交互式容器
docker run -it 镜像ID/镜像名称
上图执行命令类似:docker run -it centos /bin/base
默认添加/bin/base表示:使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令
为容器指定名称
$ docker run -it --name myCentos centos # --name和新名称之间有无=都可以
3.3 启动守护式容器
docker run -d 镜像ID/镜像名称
使用镜像centos:latest以后台模式启动一个容器
$ docker run -d centos
问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些 一直挂起的命令 (比如运行top,tail),就是会自动退出的。这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如 service nginx start
但是这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了,所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
实现后台运行
当执行一个不停止的进程时候,如:docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"
就不会自动退出
3.4 查看正在运行的容器
docker ps [OPTIONS]
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
列表说明
- CONTAINER ID:容器ID
- IMAGE:镜像
- COMMAND:执行命令,
- CREATED:创建日期
- STATUS:容器状态,Up正在运行,Exited已退出
- PORTS:端口
- NAMES:启动容器指定的名字,没指定随机生成一个
OPTIONS说明
- -a:列出当前所有正在运行的容器+历史上运行过的
- -l:显示最近(上一次)创建的容器
- -n:显示最近n个创建的容器
- -s:显示文件大小
- -q:静默模式,只显示容器编号
- --no-trunc:不截断输出
3.5 退出容器
exit
:容器停止退出
ctrl+P+Q
:容器不停止退出
3.6 进入容器
执行以下命令需要容器正在运行
docker attach 容器id或容器名称
直接进入容器启动命令的终端,不会启动新的进程
docker exec -it 容器id或容器名称 命令bashShell
在容器中打开新的终端,并且可以启动新的进程
$ docker exec -it 5d0ecb033cac /bin/bash # 进入容器内部
$ docker exec -it 5d0ecb033cac ls -l # 不进入容器内部,直接在外部输出信息
注意:当docker容器在 “-d”守护态运行的时候,比如通过supervisord控制两个程序非守护态运行:ssh -D tomcat那么这个时候,用户就无法直接进入到容器中去,docker attach 容器id 就会一直卡着。
因为此时容器运行的进程是ssh,而不是/bin/bash 也没有虚拟终端(-it)参数,所以是进入不到的,通过exec进去
3.7 启动、重启、停止容器
docker start 【容器id或容器名称】
--启动
docker stop 【容器id或容器名称】
--停止
docker restart 【容器id或容器名称】
--重启
docker kill 【容器id或容器名称】
--强制停止
docker update 【容器id或容器名称】 --restart=always
--应用开机自启
3.8 删除容器
docker rm [-f] 【容器id或容器名称】
--删除(-f 强制删除)容器
docker rm -f $(docker ps -a -q)
或者docker ps -a -q | xargs docker rm
--删除所有容器
3.9 查看容器日志
docker logs [OPTIONS] 容器id或容器名
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
- -t:是加入时间戳
- -f:跟随最新的日志打印
- --tail(或-n) 数字:显示最后多少条
3.10 查看容器内运行的进程
docker top 容器id或容器名称
3.11 查看容器内部细节
inspect: 检查; 查看; 审视; 视察
docker inspect 容器id或容器名称
3.12 容器和主机间拷贝文件
docker cp 容器ID或名称:容器内路径 目的主机路径
从容器拷贝文件到主机
docker cp 主机路径 容器ID或名称:容器内路径
从主机拷贝文件到容器
docker cp xxxx:/usr/local/a.txt /root
3.13 容器启动端口映射
-it前端启动打印tomcat启动的信息,-d 后端启动不打印tomcat启动的信息
-
-p 主机端口:docker容器端口
$ docker run -it -p 8090:8080 tomcat #本机8090映射tomcat8080端口
-P 随机分配端口
3.14 挂载数据卷
docker run -it/-d -v 宿主机目录:/容器内目录[:ro] 镜像名或镜像ID
-v (volume:[ˈvɑːljuːm] 体积; 容积; 容量; 量; 额; 音量; 响度)有创建文件功能,没有文件就创建文件
ro
只读,read-only,容器只能进行读操作,主机可以进行读写操作,数据共享
rw
读写,默认
# 单个目录挂载
docker run -it -v /myDataVolume:/containerDataVolume centos
# 多个目录挂载
docker run -it -v /myDataVolume1:/containerDataVolume1 -v /myDataVolume2:/containerDataVolume2 centos
完整启动命令
# nginx启动
$ docker run \
-d --restart=always -p 81:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name=mynginx \
nginx
# --restart=always: 开机自启
# 修改页面只能去 主机的 /data/html,容器内ro(只读)
# redis启动
$ docker run \
-v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
-d --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf
4.提交发布
4.1 容器提交成新的映像
docker commit -m="提交的描述信息" -a="作者" 容器id或名称 要创建的目标镜像名:[标签名]
(等号可有可无)
$ docker commit -a zy -m "del docs from tomcat" dazzling_darwin tomcat1.0
4.2 镜像传输
离线安装
# 将镜像保存成压缩包,-o output 输出文件目录
$ docker save -o abc.tar guignginx:v1.0
# 别的机器加载这个镜像
$ docker load -i abc.tar
4.3 推送远程仓库
$ docker tag local-image:tagname new-repo:tagname
$ docker push new-repo:tagname
4.3.1 发布到阿里云
阿里云开放平台:https://promotion.aliyun.com/ntms/act/kubernetes.html
在阿里云创建仓库镜像
- 创建命名空间
- 创建仓库名称
将镜像推送到阿里云
# 1. 登录阿里云Docker Registry
$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/custom_docker_test/custom_docker:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/custom_docker_test/custom_docker:[镜像版本号]
# 请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数
4.3.2 发布到docker hub
# 把旧镜像的名字,改成仓库要求的新版名字
docker tag nginx:v1.0 xxxx/nginx:v1.0
# 登录到docker hub
docker login
docker logout(推送完成镜像后退出)
# 推送
docker push xxxx/nginx:v1.0
# 别的机器下载
docker pull xxxx/nginx:v1.0