Docker命令大全
个人总结
参考1:https://www.runoob.com/docker/docker-command-manual.html、参考2:《CKA/CKAD应试指南》
- name: 个人总结
desc: 参考1:https://www.runoob.com/docker/docker-command-manual.html、参考2:《CKA/CKAD应试指南》
bgColor: '#F0DFB1'
textColor: 'green'
1
2
3
4
2
3
4
# Docker配置文件
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxx.com"], // 镜像源
"insecure-registries": ["192.168.80.10:5000"] // 设置docker可以通过 http:// 协议访问
}
1
2
3
4
2
3
4
# /usr/lib/systemd/system/docker.service
系统服务文件/usr/lib/systemd/system/docker.service
# 查看
# docker ps
查看正在运行的容器列表
-a
- 列出所有容器,包括停止运行的
-l
- 列出最后一次创建的容器
CONTAINER ID(容器 ID)
IMAGE(使用的镜像)
COMMAND(启动容器时运行的命令)
CREATED(容器的创建时间)
STATUS(容器状态)
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS(容器的端口信息和使用的连接类型(tcp/udp))
NAMES(自动分配的容器名称)
docker ps
1
# docker top
- 查看容器内部运行的进程
docker top XXXXXX
1
# docker info
- 查看docker环境
docker info
# 查看docker源
docker info | grep registry -i
1
2
3
4
2
3
4
# docker logs
- 查看指定容器内的标准输出
- -f
- 跟踪日志输出
- 类似tail -f
docker logs XXXXXX
docker logs NAME
docker logs -f XXXXXX
1
2
3
4
2
3
4
# docker port
- 查看一个容器的端口映射
docker port XXXXXX
docker port NAME
1
2
2
# docker images
- 列出本地主机上的镜像
- REPOSITORY
- 镜像的仓库源
- TAG
- 镜像的标签
- IMAGE ID
- 镜像ID
- CREATED
- 镜像创建时间
- SIZE
- 镜像大小
- REPOSITORY
- -q
- 只显示镜像id,不会显示太多信息
docker images
docker images -q
1
2
2
# docker inspect
- 查看一个容器的底层Docker信息
docker inspect XXXXXX
1
# docker history
- 查看一个镜像的层结构(修改历史)
docker history 镜像名
1
# 容器管理
# docker rm
- 删除容器
- -f
- 强制删除正在运行的容器
docker rm -f XXXXXX
1
# docker run
- 运行一个容器
- -i
- 允许你对容器内的标准输入进行交互(Stdin)(交互式操作)
- -t
- 在新容器内,指定一个伪终端或终端(终端)
- exit / Ctrl+D
- 退出一个容器的交互模式
- -d
- 在后台运行并打印容器ID
- 加了-d参数,默认不会进入容器
- -c
- 指定容器要运行的命令
- --name
- 指定容器的名称
- -P
- 将容器内部使用的网络端口,随机映射到我们使用的主机上
- -p
- 指定容器和主机映射的端口
- --network
- 指定容器使用的网络
- 可以使用docker network ls查看
- --rm
- 容器退出时,自动清理容器内部的文件系统
- -h / --hostname
- 设置容器的主机名
- 还会同时写入容器内的/etc/hostname和/etc/hosts
- --dns
- 添加DNS服务器到容器的/etc/resolv.conf中
- --dns-search
- 设置容器的搜索域
- 当搜索域为example.com时,搜索一个名为host的主机,DNS不仅搜索host,还会搜索host.example.com
- -v
- -v /dir1
- 物理机的目录/var/lib/docker/volumes/ID/_data(ID是随机生成的)
- 挂载到容器的/dir1目录里
- -v /dir2:/dir1
- 在物理机里指定目录/dir2
- 映射到容器的/dir1目录里
- 如果目录不存在,自动创建
- -v /dir2:/dir1:rw
- 读写挂载(默认)
- -v /dir2:/dir1:ro
- 只读挂载
- -v /dir1
- --link
- 连接一个容器,并设置别名
docker run ubuntu:15.10 /bin/echo "Hello World"
docker run -i -t ubuntu:15.10 /bin/bash
docker run -d ubuntu:15.10 /bin/bash -c "while true; do echo hello world; sleep 1; done;"
docker run -itd --name ubuntu-test ubuntu /bin/bash
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
# 连接容器db, 设置别名为mysqlxx, 在后续命令中可以使用"mysqlxx"这个主机名进行操作
docker run -itd --link db:mysqlxx -e WORDPRESS_DB_HOST=mysqlxx wordpress
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# docker pull
- 从源获取/载入一个镜像
- 如果不指定镜像的版本标签,Docker将默认使用ubuntu:latest镜像
- 使用一个不存在的镜像时,Docker将会自动下载这个镜像
docker pull ubuntu
docker pull ubuntu:15.04
1
2
3
2
3
# docker stop
- 停止一个容器
docker stop XXXXXX
docker stop NAME
1
2
2
# docker restart
- 重启一个容器
docker restart XXXXXX
1
# docker container
- 管理容器列表
- prune
- 清除所有处于终止状态的容器
docker container prune
1
# docker attach / docker exec
- 进入一个容器
- attach在退出容器时,会终止容器的运行
- exec在退出容器时,容器会继续运行
- --user
- 以XXX用户进入容器
docker attach XXXXXX
docker exec -it XXXXXX /bin/bash
docker exec -it --user=root XXXXXX /bin/bash
1
2
3
4
2
3
4
# 镜像管理
# docker rmi
- 删除镜像
docker rmi ubuntu:15.10
1
# docker tag
- 为镜像添加一个新的标签
docker tag XXX runoob/centos:dev
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 XXX About an hour ago 190.3 MB
runoob/centos dev XXX About an hour ago 190.3 MB
1
2
3
4
5
2
3
4
5
# docker build
- 根据Dockerfile构建一个新的镜像
- -t
- 指定创建的镜像(镜像名称:镜像标签)
- .
- Dockerfile的上下文路径,.表示当前目录下
- -t
- 需要创建Dockerfile文件
- 其中包含一组指令,来告诉docker如何构建镜像
- 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀必须是大写
- FROM
- 指定使用的镜像源
- RUN
- 在镜像内执行的命令
vim Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' | chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' | chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
docker build -t centos:v2 .
1
# docker commit
- 提交一个容器副本,创建镜像
- -m
- 提交的描述信息
- -a
- 镜像的作者
- XXX
- 容器ID
- runoob/ubuntu:v2
- 创建的镜像名称
docker run -it ubuntu:15.10 /bin/bash
apt-get update
exit
docker commit -m="has update" -a="runoob" XXX runoob/ubuntu:v2
docker images
docker run -it runoob/ubuntu:v2 /bin/bash
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# docker push
- 推送一个镜像到镜像服务器
docker tag centos:v1 192.168.80.10:5000/xxx/centos:v1
docker push 192.168.80.10:5000/xxx/centos:v1
1
2
2
# 导入/导出
# docker export
- 导出一个容器快照
docker export XXXXXX > ubuntu.tar
1
# docker import
- 导入一个容器快照文件(本地或URL)
# 导入一个容器快照文件,到镜像test.ubuntu:v1
cat ubuntu.tar | docker import - test/ubuntu:v1
docker import http://example.com/xxxpro
1
2
3
4
2
3
4
# docker save
- 导出镜像到本地文件
docker save -o test.tar test/ubuntu:v1
docker save 镜像名 > file.tar
docker save 镜像名1 镜像名2 ... > file.tar
1
2
3
4
2
3
4
# docker load
- 导入一个镜像
docker load < test.tar
docker load -i 文件名
1
2
3
2
3
# 网络
# docker network ls
- 查看网络列表
docker network ls
1
# docker network create
- 新建网络
- -d
- 网络类型
- bridge或overlay
docker network create -d bridge test123
1
# 配置文件
# /etc/docker/daemon.json
- 设置所有容器的配置
# 配置所有容器的DNS为114.114.114.114和8.8.8.8(容器启动时自动设置)
vim /etc/docker/daemon.json
{
"dns": [
"114.114.114.114",
"8.8.8.8"
]
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 仓库管理
# docker push
- 用户登录Docker Hub后,可以使用docker push将自己的镜像推送到Docker Hub
- username应为自己的用户名
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
docker search username/ubuntu
1
2
3
4
5
2
3
4
5
# docker login
- 登录Docker Hub
- https://hub.docker.com/
docker login
输入账号密码
1
2
2
# docker logout
- 退出Docker Hub登录状态
docker logout
1
# docker search
- 从Docker Hub上搜索镜像源
- NAME
- 镜像仓库源的名称
- DESCRIPTION
- 镜像的描述
- OFFICIAL
- 是否是docker官方发布
- stars
- 类似Github里的star,表示点赞
- AUTOMATED
- 自动构建
docker search httpd
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/httpd The Apache HTTP Server Project 4216 [OK]
docker.io docker.io/centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or b... 44
docker.io docker.io/centos/httpd 35 [OK]
1
2
3
4
5
6
2
3
4
5
6
# 镜像registry搭建私有仓库
- 修改配置文件/etc/docker/daemon.json
- 允许http方式访问
- 使用镜像registry运行容器,端口5000
docker run -d --name myreg -p 5000:5000 --restart=always -v /myreg:/var/lib/registry registry
# 使用国内源
docker run -d --name myreg -p 5000:5000 --restart=always -v myreg:/var/lib/registry hub.c.163.com/library/registry
1
2
3
4
2
3
4
- 给镜像做标签
# docker tag <镜像名:标签> <仓库地址:端口/镜像地址:标签>
docker tag centos:latest 192.168.80.10:5000/xxx/centos:v1
1
2
3
2
3
- 推送镜像
docker push 192.168.80.10:5000/xxx/centos:v1
1
- 查看和下载镜像
# 安装工具jq
yum install jq
curl -s http://192.168.80.10:5000/v2/_catalog | jq
curl http://192.168.80.10:5000/v2/xxx/centos/tags/list
# 下载镜像
docker pull 192.168.80.10:5000/xxx/centos:v1
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 删除镜像
- 通过shell脚本(本地删除)
- 直接删除仓库里的目录(本地删除)
- 通过仓库的HTTP API删除(远程删除)
# shell脚本
wget ftp://ftp.rhce.cc/cka-tool/delete_docker_registry_image
chmod +x delete_docker_registry_image
export REGISTRY_DATA_DIR=/myreg/docker/registry/v2
./delete_docker_registry_image -i 192.168.80.10:5000/xxx/centos:v1
# 删除目录
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/XXX
# http api
curl -X DELETE https://192.168.80.10:5000/v2/messer/manifests/sha256:XXX
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# harbor搭建私有仓库
- 修改配置文件/etc/docker/daemon.json
- 允许http方式访问**(把端口去掉,只留下IP地址)**
- 下载离线包并解压
- https://github.com/goharbor/harbor/releases
tar -zxvf harbor-offline-installer-v2.0.6.tgz
cd harbor/
1
2
2
- 导入镜像
docker load -i harbor.v2.0.6.tar.gz
1
- 运行脚本./prepare执行一些准备工作
./prepare
1
- 生成harbor.yaml,编辑文件
- 修改hostname为本主机名
- harbor_admin_password是默认密码
- 默认为:Harbor12345
- 注释https相关信息
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
1
2
2
- 运行install.sh
./install.sh
1
- 访问harbor,输入用户名admin和密码(默认密码Harbor12345)
- 项目 -> 新建项目(项目名称-XXX、访问级别-公开)
- 系统管理 -> 用户管理 -> 创建用户
- 为项目添加用户,项目 -> XXX -> 成员 -> +用户
- 修改/etc/docker/daemon.json,更换仓库地址
- 重启docker
- 登录私有仓库
- 会生成隐藏文件.docker,记录了登录信息
docker login 192.168.80.10
# 输入账号密码
1
2
2
- 推送镜像
docker tag XXX 192.168.80.10/XXX:v1
docker push 192.168.80.10/XXX:v1
1
2
2
- 在harbor管理界面查看推送的镜像
# Dockerfile
# COPY
- 复制指令,从上下文目录中,复制文件或目录 到容器里指定路径
- --chown=<user>:<group>
- 可选参数
- 用户改变复制到容器内,文件的拥有者和属组
- <源路径>
- 源文件或者源目录
- 可以是通配符表达式,规则需要满足Go的filepath.Match包
- <目标路径>
- 容器内的指定路径
- 如果不存在会自动创建
- --chown=<user>:<group>
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
1
2
3
4
5
2
3
4
5
# ADD
- 和COPY使用格式类似
- 同样需求下,官方推荐使用COPY
- ADD优点
- 如果<源文件>为tar压缩文件的话
- 压缩格式为gzip、bzip2、xz的情况下
- 会自动复制并解压到<目标路径>
- ADD缺点
- 在不解压的前提下,无法复制tar压缩文件
- 会令镜像构建缓存失败,可能会导致镜像构建变得比较缓慢
- 具体是否使用,可根据是否需要自动解压来决定
# CMD
- 类似RUN,但是运行的时间点不同
- CMD在docker run时运行
- RUN在docker build时运行
- 作用
- 为启动的容器,指定默认要运行的程序
- 程序运行结束,容器也就结束
- CMD指令可被docker run指定的程序覆盖
- 注意
- 如果Dockerfile存在多个CMD指令,仅最后一个生效
- 推荐使用第二种格式
- 执行过程比较明确
- 第一种格式在运行过程中,也会自动转换为第二种格式运行
CMD <shell命令>
CMD ["<可执行文件或命令>", "<param1>", "<param2>", ...]
CMD ["<param1>", "<param2>", ...] # 为ENTRYPOINT指令指定的程序 提供默认参数
1
2
3
2
3
# ENTRYPOINT
- 类似CMD指令
- 不会被docker run指定的命令所覆盖
- 这些指定的命令,会被当作参数传递给ENTRYPOINT指定的程序
- 如果docker run指定了--entrypoint选项,将覆盖ENTRYPOINT
- 优点
- 执行docker run时,可以指定ENTRYPOINT运行所需的参数
- 注意
- 如果Dockerfile中存在多个ENTRYPOINT指令,仅最后一个生效
ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]
1
- 可以搭配CMD命令使用
- 一般是变参才会使用CMD
- 这里的CMD等于给ENTRYPOINT传参
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1
2
3
4
2
3
4
# 不传参运行
docker run nginx:test
# 容器默认运行以下命令,启动主进程
nginx -c /etc/nginx/nginx.conf
# 传参运行
docker run nginx:test -c /etc/nginx/new.conf
# 容器默认运行以下命令,启动主进程
nginx -c /etc/nginx/new.conf
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# ENV
- 设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
1
2
2
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
1
2
3
4
2
3
4
# ARG
- 与ENV作用一致,作用域不一样
- ARG设置的环境变量,仅对Dockerfile内有效
- docker build过程
- 构建好的镜像不存在此环境变量
- 可以被docker build的--build-arg <key>=<value>覆盖
- ARG设置的环境变量,仅对Dockerfile内有效
ARG <参数名>[=<默认值>]
1
# VOLUME
- 定义匿名数据卷
- 在启动容器时,如果忘记挂载数据卷,会自动挂载到匿名卷
- docker run时,可以通过-v参数修改挂载点
- 作用
- 避免重要的数据,因容器重启而丢失(致命)
- 避免容器不断变大
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
1
2
2
# EXPOSE
- 声明端口
- 镜像服务的守护端口,以方便配置映射
- 在docker run -P时,会随机映射EXPOSE指定的端口
EXPOSE <端口1> [<端口2>...]
1
# WORKDIR
- 指定工作目录
- WORKDIR指定的工作目录,会在构建镜像的每一层中都存在
- 指定的目录必须提前创建好
- 每一个RUN都是新建的一层,只有WORKDIR创建的目录才会一直存在
WORKDIR <工作目录路径>
1
# USER
- 指定执行后续命令的用户和用户组
- 只是切换用户(后续执行命令的用户)
- 用户和用户组必须已存在
USER <用户名>[:<用户组>]
1
# HEALTHCHECK
- 指定某个程序或指令,监控docker容器服务的运行状态
- 设置检查容器健康状态的命令
- 如果基础镜像有健康检查指令,NONE可以屏蔽掉其健康检查指令
- CMD后面跟随的命令使用,可参考CMD的用法
HEALTHCHECK [选项] CMD <命令>
HEALTHCHECK NONE
HEALTHCHECK [选项] CMD <命令>
1
2
3
4
5
2
3
4
5
# ONBUILD
- 延迟构建命令的执行
- Dockerfile里用ONBUILD指定的命令(FROM ubuntu - test)
- 在本次构建镜像的过程中不会执行
- 当有新的Dockerfile使用了上一个镜像(FROM test - test2)
- 在进行构建时,会执行test中的ONBUILD
- Dockerfile里用ONBUILD指定的命令(FROM ubuntu - test)
ONBUILD <其它指令>
1
# LABEL
- 给镜像添加一些元数据(metadata)
LABEL <key>=<value> <key>=<value> <key>=<value>...
LABEL org.opencontainers.image.authors="runoob"
1
2
3
2
3
# MAINTAINER
- 维护者的信息
# Docker Compose
# docker-compose up
- 运行一个Compose应用
- -d
- 后台运行
- -d
docker-compose up
docker-compose up -d
1
2
3
2
3
编辑 (opens new window)