Docker笔记

我的Docker笔记,记录在此,以防忘记。

安装注意事项

安装文档

安装后需要将当前用户加入docker用户组,方可以普通用户权限执行docker:

sudo groupadd docker
sudo usermod -aG docker ${USER}
# 重新登录后生效,或
su -s ${USER}

修改容器镜像文件保存目录

sudo systemctl  stop docker
sudo vim /etc/docker/daemon.json
# 添加如下一行,注意修改想要使用的路径
# "graph":"/docke/image/path"
sudo systemctl start docker

一些说明

  • docker命令行参数中,容器名与ID等效,通常可以互换使用。
  • Dockerfile的指令通常有与之对应的docker run参数
  • 阅读文档:
    man docker
    man docker-run # 查看 docker run 的文档
    man docker-exe # 查看 docker exec 的文档
    

容器的操作

docker run - 通过镜像创建容器并运行

下面这条命令运行后会运行Ubuntu系统并进入其命令行:

docker run --name bob -i -t ubuntu /bin/bash

常用参数如下,更多详细的文档可通过man docker-run阅读:

  • --name 指定生成的容器名,如不指定docker会随机生成
  • --restart 有以下几种选项
    • always 始终自动重启
    • on-failure 仅在容器的exit code非0时重启
    • on-failure:5 仅在容器的exit code非0时重启,最多尝试5次
  • --expose=1000-5000 开放容器的端口。相当于Dockerfile里的EXPOSE。
  • -p 配置容器的端口与本地主机端口的映射关系
    • -p 8080:80 将容器的80端口映射至本地的8080端口。
    • -p 127.0.0.1::80 将容器的80端口映射至本地的随机端口,并限制为使用网口127.0.0.1,即只允许本主机访问。注意若不指定网口,默认为0.0.0.0
    • -P 开放并映射所有Dockerfile里EXPOSED参数配置的端口
  • -i 保持容器的STDIN开启
  • -t 为容器分配虚拟TTY,以进入交互式命令行
  • -v /localpath:/remotepath 参考VOLUME
  • -d 以后台服务方式运行
  • --net netname 加入指定的网络
  • -h 设定容器的hostname。同一网络中,其它容器可通过hostname访问该容器,而不必直接用IP

docker start / docker restart 启动/重启容器

可以使用容器名或容器ID启动或重启容器。

docker start bob

docker attach

对于正在运行的容器,本命令可以用容器创建时的参数再次创建会话:

docker attach bob

运行后会进入Ubuntu的BASH窗口。

docker exec 在容器中执行命令

此命令要求容器正在运行。

下面的命令在容器中创建/etc/sample文件:

docker exec bob touch /etc/sample

常用参数说明:

  • -d 以后台方式执行。如果需要运行阻塞型的命令可以使用此参数
  • -u tom 以指定用户运行命令。要求容器能找到此用户
  • -it 交互式命令,如进入容器的BASH窗口

docker stop / kill 停止/杀死 容器

以停止bob容器为例:

  • docker stop bob使用SIGTERM终止容器中的程序。
  • docker kill bob使用SIGKILL终止容器中的程序。

docker ps 查看本地容器列表

docker ps只显示当前正在运行的容器。常用下面几个参数:

  • docker ps -l 显示最近使用的容器
  • docker ps -n3 显示最近使用的3个容器
  • docker ps -a 显示所有容器

docker port 查看容器端口映射

docker port bob 8080

docker inspect 查看容器信息

返回容器的详情,支持Go语言的模板语言提取指定字段:

docker inspect  -f '{{ .NetworkSettings.IPAddress }}' bob

docker rm 删除容器

常用参数举例

  • docker rm tom 删除名称为tom的容器
  • docker rm -f tom 停止并删除名称为tom的容器
  • docker rm -f ‘docker ps -a -q‘ 停止并删除所有容器

docker logs 查看容器日志

常用参数:

  • docker logs bob -f 持续显示容器的最近日志(与tail -f类似)
  • docker logs bob -f --tail 20 显示日志的最后20行
  • docker logs bob -tf 持续显示容器的最近日志并自动加载时间戳

docker top 查看容器的进程

docker top bob

docker stats 查看容器的资源使用情况

返回容器ID,名称,CPU,内存,磁盘,网络等使用情况

docker stats bob

镜像的操作

关于镜像的名称

镜像的命名规则为:[repo]:[tag]

ubuntu:16.04为Ubuntu 16.04版本的镜像。许多流行的镜像还提供多硬件平台版本,例如ubuntu:bionic-20191202@sha256:56ea270e0c0826ab6b155acf5130fbc59fa36703e982bddea3143261fca60b8d为Ubuntu 18.04 Arm版本的镜像(可在Docker Hub先找到系统版本,再从Tag列表里查找硬件版本对应的Tag)。

docker images 查看本地镜像列表

  • docker images 返回所有镜像列表
  • docker images ubuntu 返回所有ubuntu镜像列表

docker rmi 删除镜像

通过镜像ID删除镜像:docker rmi image_id

docker pull 拉取远程镜像

将远程镜像下载到本地:

docker pull ubuntu:16.04

docker search 搜索远程镜像

在远程镜像仓库里搜索指定镜像:

docker search puppet

docker hisotry 查看镜像的生成步骤

docker history --no-trunc=true image_id

制作Docker镜像

要制作镜像,需要将Dockerfile与所需的其它文件放在同一个目录。

有几点需要注意:

  • Dockerfile里的指令只能访问同一目录及子目录里的文件。
  • 生成镜像时,除.dockerignore中指定的文件外,同一目录的其它所有文件都会打包入镜像。
  • 每一条具有修改效果的指令执行后,都会生成一个中间层镜像。在创建镜像时,这些中间层镜像会缓存。由于我们很难保证一次就把Dockerfile写好,生成镜像的命令很可能需要多次运行,利用缓存可以节省很多时间。

进入Dockerfile目录,使用如下命令生成镜像:

docker build -t "my_repo/my_image:my_tag" ./

关于生成Docker镜像的几点说明:

  • 如果不指定tag,docker自动指定为latest
  • docker还支持使用远程git项目创建镜像,只需将Dockerfile所在的目录(此处为./)替换为Git项目地址,注意Dockefile必须在项目的根目录。
  • 可使用--no-cache选项禁用中间层缓存。

Dockerfile示例:

FROM ubuntu:bionic-20191202@sha256:56ea270e0c0826ab6b155acf5130fbc59fa36703e982bddea3143261fca60b8d
ENV CACHE_REFRESH_AT=2019-12-23
RUN  apt-get update
RUN  apt-get install -y apt-transport-https
COPY bionic.sources.list /etc/apt/sources.list
RUN  apt-get update
RUN  apt-get install -y libudev1 libudev-dev software-properties-common
RUN  apt-get install -y curl
RUN  echo 'export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup' >> /etc/profile
COPY .cargo/ /root/.cargo/
RUN  curl https://sh.rustup.rs -sSf | sh -s -- -y
ENV  PATH="/root/.cargo/bin:${PATH}"
RUN  rustup install nightly
RUN  rustup default nightly
RUN  apt-get install -y build-essential

Dockerfile的指令:RUN

执行一条命令,有以下两种方式:

  • RUN apt-get install -y apt-transport-https 本方式会通过容器的/bin/sh -c命令执行。
  • RUN ["apt-get", "install", "-y", "apt-transport-https"] 直接运行指定的命名

Dockerfile的指令:EXPOSE

开放指定的端口。也可以在运行时通过--expose参数指定,如docker run --expose ...

Dockerfile的指令:ENV

ENV A=1 B=2

相当于命令行的-e "A=1",通过ENV配置的环境变量对其后的命令(如RUN指定的命令)及生成的容器均有效。

Dockerfile的指令:CMD

示例

CMD /bin/bash

说明

  • 建议以数组方式使用
  • 若存在多次CMD配置,只有最后一次配置有效
  • 调用docker run时,通过指定命令覆盖CMD配置

Dockerfile的指令:ENTRYPOINT

指定容器启动时自动执行的命令。等效于容器启动时的--entrypoint参数。

同时指定ENTRYPOINTCMD时,后者将作为前者的命令行参数追加到前者执行。例如

ENTRYPOINT ["nginx"]
CMD ["-h"]

当然也可以在容器启动时通过传入参数:

docker run -it nginx -g "deamon off"

Dockerfile的指令:ADD

将指定内容添加到构建的镜像里。例如

ADD soft.lic /opt/app/soft.lic
ADD my_app.gz /opt/app/my_app/
  1. 支持添加文件、目录及链接。
  2. 添加文件或目录时,要求这些文件必须在Dockerfile目录中。
  3. 通过目标名判断是添加文件还是目录,即以/结束时,为添加目录。
  4. 支持自动解压tar, gzip bzip2, xz格式的压缩包。

Dockerfile的指令:COPY

复制文件或目录到指定目录里,若目录不存在,会自动创建。

复制conf.d/目录里的文件到/et/appache2/

COPY conf.d/ /et/appache2/

Dockerfile的指令:VOLUME

设置文件卷。通常这些目录会在容器间或容器与宿主间共享,生成镜像时,这些目录不会包含进去。

VOLUME ["/opt/a" "/opt/b"]

也可通过docker run-v指令使用,如

docker run -it --rm -v /opt/myapps/:/opt/myapps/ archlinux/base  /opt/myapps/myapp

Dockerfile的指令:WORKDIR

用于指定容器启动时默认进入的工作目录。

Dockerfile的指令:ARG

添加构建镜像时的可选参数。

ARG v1
ARG v2=myval

通过--build-arg <arg_name>=<arg_value>的方式使用:

docker build --build-arg v1=12 -t myimage .

在生成镜像时,v1的值为12v2的值为默认值myval

Dockerfile的指令:SHELL

设置后将使用指定的Shell执行后续的命令。默认值为["/bin/sh" "-c"]

Dockerfile的指令:HEALTHCHECK

配置假死应用检测。

HEALTHCHECK --intervals=10s --timeout=1m --retries=5 CMD curl http://localhost || exit 1 

配置后可通过docker inspect --format="{{ .State.Health.Status}}" container_id 查看。

若存在多个HEALTHCHECK配置,则仅最后一个配置有效。

Dockerfile的指令:USER

指定默认用户,不指定时默认为root。可通过username, uid:gid等方式指定。

Dockerfile的指令:STOPSIGNAL

使用docker stop停止容器时,发送给容器的syscal信号,如9(即SIGKILL)。

可通过kill -l查看可选值。

Dockerfile的指令:ONBUILD

当生成的镜像被作为基础镜像,再用于生成其它镜像时执行。通常在做镜像模板时使用:

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src ; make

Dockerfile的指令:LABEL

key="val"的形式指定镜像的元数据,可多次使用,如

LABEL version="1.0"
LABEL maintainer="a"

docker-compose:管理多个docker容器

安装文档:https://docs.docker.com/compose/install/

进入docker-compose.yml所在目录:

# 启动`docker-compose.yml`定义的容器
docker-compose up -d
# 查看进程
docker-compose ps
# 停止docker-compose的所有容器
docker-compose stop
# 停止docker-compose的所有容器
docker-compose kill
docker-compose rm
# 查看日志
docker-compose logs

Docker国内源 已不好用了

修改/etc/docker/daemon.json(若不存在可创建)如下:

{
  "storage-driver": "overlay2",
  "registry-mirrors" : [
	  "http://f1361db2.m.daocloud.io",
  "http://ovfftd6p.mirror.aliyuncs.com",
  "http://registry.docker-cn.com",
  "http://docker.mirrors.ustc.edu.cn",
  "http://hub-mirror.c.163.com"
],
"insecure-registries" : [
  "registry.docker-cn.com",
  "docker.mirrors.ustc.edu.cn"
],
"debug" : false,
"experimental" : true
}

修改后还需要重启docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker
留言