文章目录

  • 1. 构建镜像
  • 2. docker
  • 2.1安装
  • 2.2 启动Docker引擎
  • 2.3 创建docker用户组
  • 2.4macos安装
  • 2.5 镜像加速器
  • 2.5.1 ubuntu配置
  • 3.docker run
  • 4.查看虚悬镜像
  • 5.commit理解镜像
  • 6.Dockerfile
  • 6.1FROM
  • 6.2RUN
  • 7.容器运行
  • 8.VOLUME匿名卷
  • 9. EXPOSE 声明端口
  • 10. WORKDIR指定工作目录
  • 11. USER制定当前用户
  • 12.docker 保存
  • 13.docker load


1. 构建镜像

在构建镜像的时候,会一层层的构建,前一层是后一层的基础.每一层构建就不会在发生改变,后一层的任何改变只发生在自己这一层.比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅仅在当前层标记该文件已经删除.但是在容器运行的时候,虽然你不会看到这个文件,但是实际上该文件一直会跟随镜像.因此在构建镜像的时候需要额外小心,删除本层的无用文件的时候,只需要在该层结束的时候清理掉.
容器读写仅仅最好直接对宿主机的挂载路径读写,最高效与安全.

2. docker

2.1安装

$ curl -sSL https://get.docker.com/ |sh
$ sudo apt-get install docker-engine

2.2 启动Docker引擎

$ sudo service docker start
$ sudo systemctl enable docker
$ sudo systemctl start docker

2.3 创建docker用户组

  • 注释:root权限一般不直接使用,需要建立docker用户组
$ sudo groupadd docker
$ sudo usermod -aG docker $USER # 添加当前用户到docker组下,避免每次使用sudo

2.4macos安装

$ brew cask install docker

2.5 镜像加速器

2.5.1 ubuntu配置

阿里云申请加速器: https://qwl3529h.mirror.aliyuncs.com

配置加速器,编辑/etc/default/docker文件,在DOCKER_OPTS中获的加速器配置

DOCKER_OPTS="--registry-mirror=https://qwl3529h.mirror.aliyuncs.com"

重启docker

sudo service docker restart

3.docker run

参数 -it i是指交互 t是指终端 --rm是指容器退出后随后删除

4.查看虚悬镜像

sudo docker images -f dangling=true
docker rmi $(docker images -q -f dangling=true)

5.commit理解镜像

$ docker commit --author "yanerle 2681506@gmail.com" --message "修改内容" container_name image_name:tag
$ docker history images_name:tag #查看镜像历史变更记录

6.Dockerfile

6.1FROM

FROM 基础镜像

6.2RUN

shell格式:RUN 命令
exec格式:RUN [“可执行文件”,“参数1”,]
写dockerfile的时候每一层都要清理掉无关的文件

COPY ./package.json /app/  # 目标路径可以是绝对路径,可以是相对路径

ADD 指令会令镜像构建缓存失效,从而可能会令镜像变得缓慢.

7.容器运行

  • 容器运行是一个进程.这就要在运行的时候将参数输入进来.docker run -it ubuntu会直接进入bash.
  • docker run -it ubuntu cat /etc/os-release 用cat /etc/os-release命令替换了/bin/bash命令 输出了系统版本信息.
  • 容器没有前后台之分,容器只有前台.因为sh是主进程,指令的命令"service nginx start"结束后,主进程也结束.

8.VOLUME匿名卷

VOLUME /data

/data为匿名卷,任何/data写入的数据会写在挂载的路径下.docker run -d -v mydata:/data xxxx 会覆盖这个路径

9. EXPOSE 声明端口

  • EXPOSE仅仅是声明运行容器的时候提供服务端口,仅仅是声明不会开启端口. docker run -p <宿主机>:<容器端口> 是真正开发端口.

10. WORKDIR指定工作目录

  • WORKDIR <工作路径>,指令可以制定哦工作目录,以后各层的当前目录就被改为制定的目录,该目录已经存在,WORKDIR不会帮你创建目录.
  • 不指定路径的话各层其实是不同的容器,执行环境也就不同,造成各层的工作路径不同.

11. USER制定当前用户

  • USER指令和WORKDIR相似,都是改变环境变量影响以后的各层.USER是改变之后各层的用户.
  • USER仅仅是切换用户,前提是用户你已经建立.
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN ["redis-server"]

12.docker 保存

$ docker save images_name | gzip > name_.tar.gz

13.docker load

$ docker load -i name_.tar.gz
$ docker rmi images_name