目录

Docker_learning

Docker学习笔记


一、概念

  • 镜像:root文件系统,容器的模板,静态不可写,类似于iso文件(安装盘、安装镜像)
  • 容器:基于镜像创建的实体,可读可写,可被创建、启动、停止、删除、暂停等
  • 仓库:用来保存镜像,可在本地局域网内搭建

二、安装

安装能正常运行的前提是CPU开启了虚拟化技术

1、Ubuntu 18.04安装docker

如果之前有安装过,需要先卸载

$ sudo apt-get remove docker docker-engine docker.io containerd runc

安装需要的包

$ sudo apt install apt-transport-https ca-certificates software-properties-common curl

添加GPG密钥,添加Docker-ce软件源

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$ $(lsb_release -cs) stable"

更新软件包缓存并安装Docker-ce

$ sudo apt update
$ sudo apt install docker-ce

设置开机自启动,并启动Docker

$ sudo systemctl enable docker
$ sudo systemctl start docker

添加当前用户到docker用户组,运行docker时不需要使用sudo

$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

2、Windows 7安装docker

通过下载docker toolbox运行安装,安装时要勾选所有内容,包括GitVirtualBox with NDIS5

3、镜像加速

可通过阿里云的 容器镜像服务 → 镜像中心 → 镜像加速器 提供的加速器地址进行镜像加速

Ubuntu下

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
> {"registry-mirrors": ["https://9kmyfnt7.mirror.aliyuncs.com"]}
> EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Windows 7下:

如下命令会使用docker toolbox创建一台装有Docker环境的Linux虚拟机,同时配置Docker加速地址

docker-machine create --engine-registry-mirror=https://XXXX.mirror.aliyuncs.com -d virtualbox default

4.修改docker storage driver

非必须,仅用于支持旧版本软件,建议使用默认overlay2存储驱动程序

查看docker当前使用的存储驱动程序

$ docker info | grep Storage
  Storage Driver: overlay2   # 当前存储驱动为overlay2

将存储驱动程序修改为aufs,以确保对容器内一些旧的应用程序的支持

$ grep aufs /proc/filesystems       # 查看是否支持aufs

若支持,则修改/etc/docker/daemon.json文件

# /etc/docker/daemon.json
{"registry-mirrors": ["https://9kmyfnt7.mirror.aliyuncs.com"], "storage-driver": "aufs"}

完成之后重启docker应用

$ sudo systemctl daemon-reload
$ sudo systemctl docker restart

三、入门常用命令

docker info                           # 查看docker程序是否正常
docker run -it ubuntu /bin/bash       # -i: 标准输入  -t 分配伪tty终端  加一起就能提供交互式shell
docker ps -a                          # 列出容器 -a 列出所有
docker ps -n 5                        # 列出最后5个容器    -l 列出最后一个运行的容器(无论当前运行与否)
docker run --name my_container -it ubuntu /bin/bash     # 为容器指定名称,不指定系统会随机给一个名称
docker run -d ubuntu /bin/sh -c "ping g.cn"             # -d 后台运行该容器 -c 执行后续命令 守护式进程
docker run -d -P my_container         # -P 端口随机映射到宿主机 -p 8000:80 指定80映射到宿主机8000【重要】
docker rename my_container new_name   # 重命名容器
docker start my_container             # 启动已经停止运行的容器
docker attach my_container            # 附着到运行的容器上,也就是进入交互式shell
docker logs my_container              # 获取容器的日志 -f 持续追踪日志 -t 加时间戳 --tail 5 获取最后5条
docker top my_container               # 查看守护式容器的进程
docker stats my_container new_ctner   # 显示多个守护式容器的统计信息:CPU、内存、网络、存储I/O等性能指标
docker exec -d my_container touch file         # 为守护式容器增加一个后台任务(无需交互)【重要】
docker exec -it my_container /bin/bash         # 容器内运行交互式命令(进入交互式shell)【重要】
docker stop my_container              # 停止正在运行的容器
docker restart my_container           # 重新启动容器
docker run --restart=always -d ubuntu                   # 遇到错误导致容器停止运行时,自动重启容器
docker run --restart=on-failure:5 -d ubuntu             # 遇到非正常状态停止时自动重启,最多重启5次
docker inspect my_container           # 查看容器的详细信息
docker inspect --format='{{.State.Status}}' my_container  # 查看容器的指定信息,可用 -f 缩写
docker rm my_container                # 删除容器
docker export my_container > container.tar                # 将容器导出为本地文件
  • 使用runattach命令进入到容器交互式shell,输入exit命令会导致容器停止运行,效果类似于stop

  • 使用exec命令进入到容器交互式shell,输入exit不会导致容器停止运行,退回到宿主机的命令行


四、镜像的使用

1、镜像常用命令

docker images                        # 列出本机的镜像
docker search ubuntu                 # 从仓库搜索镜像,字段包括仓库名、镜像描述、用户评价ST、是否官方
docker tag xxximage_id ubuntu:dev    # 为指定镜像id对应的ubuntu镜像增加一个dev标签(依然是同个镜像id) 
docker pull ubuntu:18.04             # 拉取镜像, :用于指定拉取镜像的标签,不带冒号默认标签为latest
docker pull tensorflow/tensorflow:latest-gpu-py3-jupyter # 用户名/仓库名:标签1-标签2-标签3-标签4
docker rmi ubuntu                    # 删除镜像

2、用commit命令创建镜像(不推荐使用)

docker run -it ubuntu /bin/bash           # 创建一个需要修改的定制容器
> apt-get -yqq update                     # 对容器的软件包进行更新检查
> apt-get -y install nginx                # 安装最新的nginx
> exit                                    # 关闭容器
docker commit xxxxxx my_rep/nginx         # 通过修改过的容器id、目标镜像仓库和镜像名,提交定制容器
docker commit -m="A new image" -a="Bill" xxxxxx my_rep/nginx:webserver
                                          # 增加了-m描述和-a作者,和标签webserver

3、用Dockerfile构建镜像

当仓库中拉取的镜像无法满足需求时,可以用Dockerfile进行镜像定制,类似windows下用ghost做一个系统镜像,打包安装好的驱动和常用软件,方便快速安装操作系统。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了多条构建镜像所需的指令和说明,用于定制镜像。

构建步骤

  • 创建新目录,并在目录内新建Dockerfile文件
> mkdir new_image && cd new_image
> touch Dockerfile
  • 修改Dockerfile文件
# Version: 0.0.1                                        # “#”符号表示注释
FROM ubuntu:18.04                                       # FROM必须是第一条指令,指定已有镜像作为基础镜像
MAINTAINER Bill Gates "bill@outlook.com"                # 指定镜像的作者、邮件等
RUN apt-get update && apt-get install -y nginx          # 在当前镜像中运行指定命令        (shell格式)
RUN ["echo","'Hi'",">/usr/share/nginx/html/index.html"] # 每条RUN指令会创建一个新的镜像层  (exec格式)
EXPOSE 80                                               # 向外部公开端口,docker run -P 时自动随机映射

Dockerfile指令每执行一次就会在docker上新建一层,过多无意义的层会造成镜像膨胀,可以用&&连接多条命令

  • 执行docker build进行新镜像的构建
docker build -t="my_rep/nginx:v1" .                     # 在Dockerfile文件所在目录下执行创建新镜像
  • 查看镜像的构建过程
docker history xxxximage_id                              # 通过镜像id来查看该镜像的构建过程

基本指令

FROM

​ 必须作为第一条指令。定制的镜像都是基于 FROM 的镜像,指定已有镜像作为基础镜像。

FROM ubuntu:18.04

RUN

​ 用于执行后面紧跟的命令行命令,在docker build时运行。

​ shell格式:

RUN apt-get update

​ exec格式:

RUN [“apt-get”, “upgrade”, “-y”]

CMD

​ 类run命令,用于运行程序,但用于docker run的时候执行,作为启动容器时默认要运行的命令,开机执行命令,可以被docker run指定的指令覆盖。

​ 若Dockerfile中存在多个CMD命令,仅最后一条生效。

CMD ["/bin/bash”, “-l”]

​ 也可为ENTRYPOINT指令提供默认参数,通过docker run紧跟的自定义参数进行修改覆盖修改。

ENTRYPOINT

​ 类CMD命令,但不会被docker run的命令行参数覆盖,且该命令行会被作为ENTRYPOINT的参数执行。

ENTRYPOINT [“nginx”, “-c”] # 定参

CMD ["/etc/nginx/nginx.conf”] # 变参

​ 启动容器时,如需要修改变参,则直接在docker run后面接指定参数。

$ docker run ubuntu -c /etc/nginx/new.conf

​ 如果确实需要改变定参,则通过docker run + --entrypoint + COMMAND 来修改。

COPY

​ 从上下文目录中复制文件或目录到容器内指定路径,如果该路径不存在,docker会自动创建所有需要的目录结构。

​ 被复制的文件或目录必须跟Dockerfile处于同一个目录下。目标位置必须是容器内部的绝对路径。

COPY sources.list /etc/apt/ # 复制文件

COPY website/ /var/www/html/ # 复制目录

COPY *.jpg /root/images # 可以使用 * 或 ? 通配符

ADD

​ 类COPY命令。除了可以复制文件和目录到容器之外,还可以有以下功能:

​ 将URL文件源拷入容器内部;

​ 拷入压缩包文件(gzip、bzip2、xz)时,自动解压缩。

ADD http://example.com/abc.zip /root/abc.zip # 拷入URL文件源

ADD abc.tar.gz /var/www/html/ # 拷入压缩包文件,并自动解压缩

EXPOSE

​ 指定暴露端口,在运行容器时可增加-P参数,作为端口映射。

EXPOSE 80 3306

ENV

​ 在镜像构建过程中设置环境变量,可在后续指令中调用,也会持久保存到该镜像创建的任何容器中。

ENV NGINX_VERSION 1.8.1 # 指定单个环境变量

RUN apt-get install -y nginx==$NGINX_VERSION

ENV JAVA_HOME=/bin/java JAVA_PATH=/bin/java/bin # 指定多个环境变量

​ 可在运行容器时增加-e标志来传递环境变量:

$ docker run -it -e “WEB_PORT=8080” ubuntu

ARG

​ 类ENV命令,但作用域仅在Dockerfile内部,也就是在docker build时用得上,一旦镜像构建完成即失效。

WORKDIR

​ 在容器内部设置工作目录,类似于cd命令。

WORKDIR /etc/apt

RUN mv sources.list sources.list.bak

​ 可通过-w来覆盖工作目录:

$ docker run -w /root/ ubuntu

VOLUME

​ 定义匿名数据卷。向基于镜像创建的容器添加卷,允许多个容器之间共享卷内文件。

VOLUME ["/opt/project”, “/data”] # 挂载多个卷

VOLUME /data # 挂载单个卷

USER

HEALTHCHECK

ONBUILD


五、容器的使用


六、本地仓库搭建