Docker基础概念
工作中可能常用的docker基础命令,可能有些命令已经淘汰,此处介绍常用的一些docker使用,主要是基础概念
镜像
Dockerfile
1.CMD:命令/参数;
2.ENTRYPOINT:命令;docker –entrypoint=命令 镜像名 /进行覆盖操作
3.WORKDIR:工作目录;docker -w=绝对路径 镜像名 、进行覆盖
4.ENV:环境变量/变量;永久的保存到建立的容器中,docker -e 变量=值 镜像名 可进行容器增加全局变量
5.USER: 指定用户去运行容器,不指定就是root,用户名:组名;格式
6.VOLUME:卷
7.ADD:复制和解压,构建缓存失效,源文件必须在Dockerfile同一级目录下
8.COPY:复制文件
9.ONBUILD:触发器
Dockerfile中没法使用source来添加环境变量,必须使用ENV
镜像制作命令
镜像名命名格式为:用户/服务:标签,如果你想上传到docker hub或者自己的私库,就需要将用户名设置正确的,如果不正确也可以使用docker tag进行复制镜像并重命名,也可将运行的容器docker commit为新镜像
1 | docker build -t "镜像名" . |
–no-cache是所有建立镜像的过程都重新运行,不使用之前的缓存,最后面的.是构建上下文的意思,可自行百度理解,在这里你可以逻辑上理解为当前目录
1 | docker build --no-cache -t "镜像名" . |
镜像管理命令
镜像列表
1 | docker images |
列出错误构建Dockerfile的时候生成的镜像,清除掉节约空间,其实就是错误的缓存,正确构建Dockerfile后,缓存是会整合到镜像中去的。
1 | docker images -f "dangling=true" |
查看镜像的ID
1 | docker images --format "{{.Reposittory}}" |
将一个镜像导出为文件。 docker save -o 文件名 镜像名
1 | docker save 镜像名 |
将docker save导出的文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
1 | docker load -i 文件名 |
将一个容器导出为文件
1 | docker export -o 文件名 容器ID |
将容器中export导出的文件导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照
1 | docker import 文件名 自定义镜像名 |
例如:
1 | #将一个容器导出为文件 |
容器操作
这个很少用了,一般是之前用于docker -it 镜像名 这种方式建立的时候,这个的缺点是exit会关闭容器,除非你建立容器的时候加了-d
1 | docker attach 容器名 |
默认从docker hub拉取,拉取私库需要docker login dockerhub用户名(不是邮箱账户,就是用户名)
1 | docker pull huisebug/jetty:1 |
dockerhub镜像搜索命令,最后面跟上你要搜索的镜像,进行过滤匹配
1 | docker search nginx |
容器管理,(启动,重启,停止,强制停止))
1 | docker start/restart/stop/kill -s 容器名 |
容器日志查看
1 | docker logs 容器名 : |
相当于tail -f 的功能
1 | docker logs -f 容器名 : |
直接进入容器,这是需要安装一个docker-enter的脚本,脚本是调用的docker早期的nsenter这个进入容器的命令,现在已经被docker exec取代,想使用docker-enter这个命令,需要在建立容器时写成docker run -dit 镜像名, -dit是一个组合,-d后台运行,-i输入,-t终端。
1 | docker-enter 容器名 |
目录挂载,ro:只读 rw:可读写
1 | docker run -v 宿主机路径:容器路径:ro -v 宿主机路径:容器路径:rw 镜像名 |
单独的dns服务,一般容器会复制宿主机的/etc/resolv.conf文件
1 | docker run --dns=61.139.2.69 镜像名 |
特权模式:可以修改宿主机的模式,相当于获取了docker组的权限,docker组的权限和root组基本相同
1 | docker run --privileged 镜像名 |
将建立后的容器ID输出到一个文件中,可用于后面的启动全部容器for i in $(cat /root/cidfile); do docker stop $i ;done; cidfile是容器ID后加上一串其他的ID
1 | docker run --cidfile=文件路径 镜像名 |
用于调用之前的容器建立时候挂载的卷和在Dockerfile中声明的VOLUME的调用,常见的场景就是日志的查看,或者前一个容器是一个编译器,将编译好的文件放在挂载的目录下,然后另一个容器运行的服务需要编译好的包
1 | docker run --volumes-from 容器名 镜像名 |
这里为什么不是镜像名呢,这个命令常用与构建镜像的时候Dockerfile出错了,docker build 每一层都是有镜像ID和容器ID的。
1 | docker run --rm -it 镜像ID bash |
这个常用于日志查看,这里镜像名一般都是采用Ubuntu或者centos这种只有操作系统的镜像
1 | docker run --rm --volumes-from 容器名 -i 镜像名 命令 |
指定主机名
1 | docker run -h 镜像名 |
这是让容器跟随docker服务重启时候自动重启
1 | docker run --restart=always -d 镜像名 |
列出容器中的文件
1 | docker diff 容器名 |
随机使用端口号49000~49900映射镜像中在编写Dockerfile中定义的EXPOSE端口
1 | docker run -P |
添加hosts本地解析
1 | docker run --add-host 镜像名 |
容器详细的参数,里面会列出当前容器的所有信息,挂载
1 | docker inspect 容器名 |
清除未使用的对象
1 | docker container容器/image镜像/volume存储卷/network防火墙规则/system所有对象 prune |
在要输出信息的命令后面加上–no-trunc输出不截断的完整信息
正在运行的容器
1 | docker ps |
所有的容器,包含停止的容器
1 | docker ps -a |
所有容器的ID
1 | docker ps -a -q |
1 | docker rm 容器名 :删除容器 |
向容器中传送bash命令,以实现进入容器的效果
1 | docker exec -it 容器名 /bin/bash |
指定容器用户
1 | docker exec -it -u root 容器名 bash -c |
指定容器网络
创建容器的网卡,默认的
1 | docker run --net="bridge" 镜像名 |
无网络,可以使用link通信
1 | docker run --net="none" 镜像名 |
可以看到host上所有的设备,不安全
1 | docker run --net="host" 镜像名 |
建立与一个容器相同的网络
1 | docker run --net="容器名或者容器ID" 镜像名 |
容器1和容器2即可实现之前的–link功能
容器中使用的是美国的时区,所以总是会相差8个小时,将宿主机的时间挂载过去就好了,实在还是不行就手动修改
1 | docker run -v /etc/localtime:/etc/localtime 镜像名 |
docker同步时间
1 | 上传本地的Shanghai文件到容器 |
容器和宿主机之间拷贝文件
1 | docker cp 本地文件路径 容器名:容器中路径 |
docker早期知识
docker-machine config 节点名 可查看证书连接,这是使用驱动为virtualbox的查看
docker swarm standalone 独立
docker stack deploy,这个需要在dammon.json文件定义开启部署功能。才可以部署,将docker-compose.yml文件打包为dab文件,然后进行swarm部署。使用service进行查看
fig早期的服务运用栈,现在使用docker-compose
consul进行服务发现,现在的docker swarm是默认建立了集群模式,使用的是etcd服务发现
centos7的docker守护进程文件位/usr/lib/systemd/system/docker.service进行私库指定,集群标签,加密通信等操作。
docker ENTRYPOINT 的脚本文件记得声明#!/bin/bash
dig一个DNS查询命令,需要安装
docker容器中的172.17.0.0网段IP地址会变化,不是固定的。这时候需要使用link机制,这个只有在互相配置的时候,如果是后续添加就无法实现,最终还是用自带的dns解析比较好。
FROM alpine 最简洁的linux系统docker镜像,可使用apk add 软件名可进行安装软件
镜像模板
1 | FROM alpine |
轻量级容器镜像
debian:slim:自带包管理系统,兼容性最好
#替换dibian源为阿里云源
1 | RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \ |
#修改时区
1 | && apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
#替换Ubuntu源
1 | sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list |
调试命令
测试cpu过高
1 | docker run --rm -it busybox sh -c "while true; do :; done" |
debian系列系统安装netstat命令
1 | sed -i s\@/archive.ubuntu.com/\@/mirrors.aliyun.com/\@g /etc/apt/sources.list |
容器中常用工具
1 | vim net-tools less procps telnet wget curl |