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
运行安装,安装时要勾选所有内容,包括Git
和VirtualBox 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 # 将容器导出为本地文件
-
使用
run
或attach
命令进入到容器交互式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