工作中可能常用的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
2
3
4
5
6
#将一个容器导出为文件
docker run --rm -it nginx bash #得到容器ID为c07f89f23325
#额外在开启一个终端
docker export -o nginx.tar.gz c07f89f23325
#文件导入成为一个新的镜像
docker import nginx.tar.gz nginx:custom

容器操作

这个很少用了,一般是之前用于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
2
3
4
docker rm 容器名 :删除容器
docker rmi 镜像名:删除镜像
docker stop 容器名 :停止容器
docker stats 容器名:监控容器的CPU、内存、I/O

向容器中传送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
2
3
4
docker run --net="容器名或者容器ID" 镜像名
docker network create bridge模式网络名
docker run --network bridge模式网络名 容器1
docker run --network bridge模式网络名 容器2

容器1和容器2即可实现之前的–link功能

容器中使用的是美国的时区,所以总是会相差8个小时,将宿主机的时间挂载过去就好了,实在还是不行就手动修改

1
docker run -v /etc/localtime:/etc/localtime 镜像名

docker同步时间

1
2
3
4
5
6
7
上传本地的Shanghai文件到容器
docker cp /usr/share/zoneinfo/Asia/Shanghai redis:/etc/
进入容器
mkdir -p /usr/share/zoneinfo/Etc/
cp -rf /etc/Shanghai /usr/share/zoneinfo/Etc/UTC
cp -rf /etc/Shanghai /etc/localtime
date

容器和宿主机之间拷贝文件

1
2
3
docker cp 本地文件路径 容器名:容器中路径

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
2
3
4
5
6
7
8
9
10
FROM alpine
ENV REFRESHED_AT 2017-09-14
RUN alpineverion=$(cat /etc/issue | grep "Alpine" | awk '{print $NF}') \
&& echo "https://mirrors.aliyun.com/alpine/v${alpineverion}/main/" > /etc/apk/repositories && echo "https://mirrors.aliyun.com/alpine/v${alpineverion}/community/" >> /etc/apk/repositories && apk update \
#替换时区
&& apk add tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#安装常用工具busybox-extras就是telnet
&& apk add vim net-tools less procps wget curl busybox-extras

轻量级容器镜像

debian:slim:自带包管理系统,兼容性最好

#替换dibian源为阿里云源

1
2
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& sed -i s@/security.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
2
3
sed -i s\@/archive.ubuntu.com/\@/mirrors.aliyun.com/\@g /etc/apt/sources.list
apt-get -y update
apt-get -y install net-tools

容器中常用工具

1
vim net-tools less procps telnet wget curl