零基础入门Docker

Posted Eric%258436

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础入门Docker相关的知识,希望对你有一定的参考价值。

** 如有错误,感谢指正**

如有错误,感谢指正,请私信博主,有辛苦红包,拜“一字之师”。

请根据目录寻找自己需要的段落

导语:本博客为个人整理Java学习记录帖,如有错误,感谢指正。系统学习,欢迎持续关注,后续陆陆续续更新~
Java 交流qq群 383245788。群内有一些资源和大佬,欢迎进来交流。

本文旨在学习交流,个人Docker学习心得

全文参照1:菜鸟教程
全文参照2:docker官网

Docker技术应用与实战

1、 Docker的安装和介绍

1. 没有docker的世界

  1. 场景一===》节省项目环境部署时间
    问题:每次部署项目到测试、生产等环境,都要部署一大推以来的软件,工具,花费很长时间。
    使用docker可以实现一次构建多次部署,一劳永逸
  2. 场景二===》环境一致性
    问题:程序在我这里跑跑得好好的,在你那怎么就不行呢?
    版本一致性:包括操作系统、数据库、中间件的版本,被测系统的版本。
    配置一致性:系统(操作系统/数据库、中间件/被测试系统)参数的配置一致。
  3. 场景三===》持续集成(devops)
    问题:老板突然说5分钟后在服务器上演示一下项目的最新成果,你能做到嘛?
  4. 场景四—微服务于容器
  5. 场景五—弹性伸缩

2. Docker是什么

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
官方团队对Logo的解释: 「The logo is a Whale carrying a stack of containers. It is on itsway to deliver those to you」

为什么是"集装箱技术"

定义: Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化

Docker,其实就是可以打包程序和运行环境,把环境和程序一起发布的容器。
其他人到你的程序后可以直接运行,避免出现一次编译到处调试的尴尬局面~
主要为了解决:

”在我机器是正常的 为什么到你的机器就不正常了“ 的问题

3. 容器和虚拟机

Docker与虚拟化

  • 虚拟化技术定义
    Virtual Machine(又名VM) 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且 应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
    简单的说,「虚拟化」,顾名思义,就是「虚拟」的,是「假」的,是形而上的,是观念上、逻辑上的划分。

Docker和虚拟机比喻

  • 什么是物理机
    一栋房子
  • 什么是虚拟机
    一个个家
  • 什么是Docker
    一个家里面的一个个卧室

4. Docker概念

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器 (Container)
  • 仓库 (Repository)

Docker的两句口号

  • 「Build, Ship and Run (搭建,发送,运行)」
  • 「Build once,Run anywhere (搭建一次,运行到任何地方)」

镜像

我们可以将 Docker 镜像理解为包含应用程序以及其相关依赖的一个基础文件系统(存储着我们的程序和数据文件等等信息,镜像层可以理解为基本的镜像,可以通过组合多个镜像层生成一个新的镜像;也可以将一个镜像可以作为一个镜像层,成为组合别的镜像的一份子),在 Docker 容器启动的过程中,它以只读的方式被用于创建容器的运行环境。

容器

容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层
前面说镜像的时候我们有提到它是一个静态文件系统,那么既然容器跟它一样,所以,镜像跟容器都是一个静态概念,但是,容器是可以run起来的,当容器run起来时,就会成为一个被称作运行态容器的东西
运行态容器(run container)是由静态容器(可读写的静态文件系统)、一个隔离的进程空间、以及运行于其中的程序进程所组成。我们通常用docker run运行起来的其实就是运行态容器,而使用docker stop停止后的容器,就是静态容器。

Docker改变了什么?

  • 面向产品:产品交付
  • 面向开发:简化环境配置
  • 面向测试:多版本测试
  • 面向运维:环境一致性
  • 面向架构:自动化扩容

5. Docker安装

  • 系统环境
序号软件版本
1CentOS8
2Linux内核3.8之上
  • 关闭防火墙
systemctl stop firewalld.service
  • 关闭selinux
vim /etc/selinux/config
// 修改 SELINUX=disabled
  • 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 安装aliyun镜像下载
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker引擎
yum install docker-ce docker-ce-cli containerd.io
// 如果报错,执行下面指令
// rpm -q podman
// dnf remove podman
// yum erase podman(容器管理工具) buildah (容器镜像)
  • 启动docker
systemctl start docker
  • 设置docker自启动
systemctl enable docker
  • 测试docker是否安装成功
docker run hello-world
  • 配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'

"registry-mirrors": ["https://vmdgahdo.mirror.aliyuncs.com"]

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、 Docker镜像和容器

帮助命令

// 显示docker的版本信息
docker version
// 显示docker 的系统信息,包括镜像和容器的数量
docker info
// 帮助命令
docker 命令 --help

镜像命令

在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

  • 查看镜像
docker images
  • 镜像搜索
docker serach
  • 镜像下载
docker pull 镜像名:[tag]
  • 删除镜像
docker rmi 源名字
docker rmi image id

容器命令

当我们有了镜像,才可以创建容器, 下载一个centos镜像来学习

  • 新建容器并启动
docker run [可选参数] image
// # 常用参数
// --name #创建容器名字用来区分容器
// -d #后台交互式运行
// -it #使用交互方式运行, 进入容器查看内容
// -p #指定容器端口号 -p 8080:8080
// -p 主机端口:容器端口
// -P #随机指定端口号
// # 启动容器
  • 列出容器
docker ps // 列出当前运行的容器
  • 退出
// # 如果docker容器在启动的时候没有加 -d 参数
exit // # 会直接停止同期并退出
Ctrt + p + q // # 容器不停止 并退出
  • 删除容器
docker rm 容器id // # 删除指定容器 如果不能删除 强制删除 rm -r
  • 启动与停止容器
docker start 容器id // # 启动容器
docker stop 容器id // # 停止容器
docker rm 容器id // # 删除容器
docker restart 容器id // # 重新启动容器
docker kill 容器id // # 强制性停止当前容器

其他命令

docker run -d 镜像名字
  • 查看日志
docker logs -tf --tail 10 c6
  • 查看容器中的进行信息
docker top 容器id
  • 查看镜像元数据
docker inspect 容器id
  • 进入容器
// 方式一
docker exec -it /bin/bash 容器id // #开启一个新的终端, 常用
// 方法二
docker attach 容器id // # 进入容器正在执行的终端, 不会开启新的进程
  • 从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目录路径

小结

Docker实践

  • Docker安装nginx
    安装步骤
// 1. 查看nginx镜像
docker search nginx
// 2. 下载nginx镜像
docker pull nginx
// 3. 运行nginx镜像
docker run -d --name mynginx -p 3344:80 nginx

端口绑定:

-p 80:80
  • Docker安装Tomcat
    安装步骤
// 1. 查看tomcat 镜像
docker search tomcat
// 2. 下载tomcat镜像
docker pull tomcat
// 3. 运行tomcat镜像
docker run -it --rm tomcat:9.0
// --rm 测试容器 我们这个容器运行完之后就自动删除

启动tomcat容器

 docker run -d --name mytomcat -p 3355:8080 tomcat:9.0
 docker ps
 docker exec -it 1a /bin/bash
 // 以下命令是在镜像内执行
 # ls
 # cd webapps
 # ls
 # rm -rf webapps
 # mv webapps.dist/ webapps
 # exit
 docker ps -a
 docker restart 1a
  • Docker安装mysql
    安装步骤
// 1. 查看镜像
docker search mysql:5.7
// 2. 下载镜像
docker pull mysql:5.7
// 3. 启动镜像
docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
// -p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
// -e 配置环境变量
// MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码
  • Docker安装Redis
    安装步骤
// 1. 搜索镜像
docker search redis
// 2. 下载镜像
docker pull redis
// 3. 启动镜像
docker run --name my-redis -d redis

3、 Docker容器数据卷

什么是Docker数据卷

Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)

  • 思考
    Docker容器删除后,在容器中产生的数据还在吗?
    Docker容器和外部机器可以直接交换文件吗?
    容器之间能进行数据交互?
  • 数据卷概念
    数据卷是宿主机中的一个目录或文件.
    当容器目录和数据卷目录绑定后,对方修改会立即同步.
    一个数据卷可以同时被多个容器同时挂载.
    一个容器也可以被挂载多个数据卷.
  • 数据卷作用
    容器数据持久化
    外部机器和容器间接通信
    容器之间数据交换

一句话总结: 卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。

  • 配置数据卷
docker run ..... -v 宿主机目录(文件):容器内目录(文件)
// 注意事项
// 1. 目录必须是绝对路径
// 2. 如果目录不存在则会自动创建
// 3. 可以挂载多个数据卷

Volume的基本使用

  • 管理卷
docker volume create edc-nginx-vol // 创建一个自定义容器卷
docker volume ls // 查看所有容器卷
docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息
  • 使用指定卷容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:

docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx

其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到/usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载

企业级Mysql实战

  • 实战Mysql数据卷
docker run -d -p 3306:3306 -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysql:5.7

具名和匿名挂载

匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径
如何确定是匿名挂载还是具名挂载,还是指定路径挂载
-V 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主内路径:容器内路径 #指定路径挂载

  • 拓展

通过 -v 容器内路径 ro rw 改变目录读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v my-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v my-nginx:/etc/nginx:rw nginx

4、 DockerFile完全指南

什么是DockerFile

Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成docker 镜像.

DockerFile文件格式

## Dockerfile文件格式 
# This dockerfile uses the ubuntu image
# VERSION 2 -EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command].. 
# 1、第一行必须指定 基础镜像信息
FROM ubuntu 
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com 
# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.listRUN 
apt-get update && apt-get install -y nginxRUN 
echo "\\ndaemon off;" >> /etc/nginx/nginx.conf 
# 4、容器启动执行指令
CMD /usr/sbin/nginx
  • Dockerfile 四部分说明

一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
最后是CMD指令,来指明运行容器时的操作命令.

  • 简单示例
// 在一个空白的文本文件, 命名为Dockerfile
mkdir mynginxcd mynginxvi Dockerfile
// Dockerfile文件内容:
FROM nginx
MAINTAINER WCC 
RUN echo '<h1>It works!</h1>' > /usr/share/nginx/html/index.html
// 构建镜像
docker build -t nginx:v1 . 
// 接下来是启动容器, 使用docker run 命令
docker run --rm --name docker_nginx_v1 -d -p 80:80 nginx:v1

DockerFile中常见的13种指令

FROM #基础镜像一切要从这里开始
MAINTAINER # 镜像是谁写的 姓名+ 邮箱
RUN # 镜像构建的时候要运行命令
ADD # tomcat 需要 压缩包 。 添加内容
WORKDIR # 镜像工作目录
VOLUME # 挂载目录EXPOSE # 保留端口配置
CMD # 指定容器启动的时候要运行命令。 只有一个生效
ENTRYPOINT # 指定容器启动的时候运行命令。 可以追加命令
COPY # 类似ADD 将我们文件拷贝道镜像中
ENV # 构建的时候设置环境变量
  • FROM
// 指定基础镜像,必须为第一个命令
格式: FROM <image> or FROM <image>:<tag> or FROM <image>@<digest>
示例:FROM mysql:5.6
注: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础
镜像
  • MAINTAINER
// 维护者信息
格式: MAINTAINER <name>
示例: MAINTAINER allen 
MAINTAINER sare@163.com 
MAINTAINER allen sare@163.com
  • RUN
// 构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行格式: RUN <command>exec 
执行格式: RUN ["executable", "param1", "param2"]
示例: RUN ["executable","param1", "param2"] 
RUN apk update RUN ["/etc/execfile", "arg1", "arg1"]
注: RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。
如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数如:docker build --no-cache
  • ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式: ADD <src>... <dest> ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例: 
ADD hom* /mydir/ 
# 添加所有以"hom"开头的文件 
ADD hom?.txt /mydir/
# ? 替代一个单字符,例如:"home.txt" 
ADD test relativeDir/ 
# 添加 "test"到 `WORKDIR`/relativeDir/ 
ADD test /absoluteDir/ 
# 添加 "test"/absoluteDir/ 

压缩格式为gzip、bzip2以及xz的情况下,ADD指令都会将其解压缩!非常值得注意的是,目标路径为一个URL时,会将其自动下载到目标路径下,但是其权限被自动设置成了600,如果这并不是你想要的权限,那么你还需要额外增加一层RUN命令进行更改,另外,如果下载的是一个压缩包,同样你还需要额外增加一层RUN命令进行解压缩。所以,在这种情况下,你还不如指定只用一层RUN,使用curl或者wget工具进行下载,并更改权限,然后进行解压缩,最后清理无用文件!当你的源路径为压缩文件并且不想让Docker引擎将其自动解压缩,这个时候就不可以使用ADD命令,你可以使用COPY命令进行完成!其实ADD命令并不实用,并不推荐使用!!!

  • COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

COPY <源路径> ... <目标路径>原路径可以是多个,甚至是通配符,其通配规则只需要满足GO语言的filepath.Math规则即可,如下:
COPY ./test1.py ./test2.py /test/
COPY ./t*.py/test/
COPY ./test?.py /test/

目标路径是容器内的绝对路径,也可以是工作目录下的相对路径,工作目录可以使用WORKDIR指令进行指定。目标路径不需要事先创建,Docker会自动创建所需的文件目录。使用COPY指令会将源路径的文件的所有元数据,比如读、写、指定全选、时间变更等。如果源路径时一个目录,那么会将整个目录复制到容器中,包括文件系统元数据

  • CMD

构建容器后调用,也就是在容器启动时才进行调用。
指定这个容器启动的时候要运行的命令只有最后一个会生效 可被替换。

CMD指令与RUN指令相似,也具有两种格式:shell格式:
CMD <命令>
exec格式:CMD [“可执行文件”, “参数1, “参数2,]
之前介绍容器的时候就说过,Docker不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,就需要指定运行的程序及参数。
CMD就是指定默认的容器主进程的启动命令的。
在运行时可以设置CMD指令来代替镜像设置中的命令,例如Ubuntu默认的CMD是/bin/bash,当我们使用命令
dockerrun -it ubuntu
创建并启动一个容器会直接进入bash。
我们也可以在运行时指定运行别的命令,比如
docker run -it ubuntu cat /etc/os-release
这就用cat /etc/os-release命令代替了默认的/bin/bash命令,输出了系统版本信息。比如,我想在启动容器的时候,在控制台中输出HelloDocker!,我们可以在Dockerfile中这样写,如下:
FROM ubuntuCMD echo "Hello Docker!"
接下来,我们构建一个镜像ubuntu:v1.0,接下来,我们以此镜像为基础创建并启动一个容器,如下:
dockerrun -it ubuntu:v1.0
值得注意的是,如果使用shell格式,那么实际的命令会被包装成为sh -c的参数的形式进行执行。上面的CMD指令,在实际执行中会变成:
CMD ["sh", "-c", "echo", "HelloDocker!"]
  • ENTRYPOINT

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
指定容器启动的要运行的命令,可以追加命令

ENTRYPOINT指令和CMD指令目的一样,都是指定容器运行程序及参数,并且与CMD一样拥有两种格式的写法:
shell格式:ENTRYPOINT <命令>
exec格式:ENTRYPOINT [“可执行文件”, “参数1, “参数2,]
与CMD指令一样,ENTRYPOINT也更加推荐使用exec格式,
ENTRYPOINT在docker run命令中同样也可以进行指定,只不过比CMD指令来的繁琐一些,需要指定--entrypoint参数。
同样,在docker run命令中指定了--entrypoint参数的话,会覆盖Dockerfile中ENTRYPOINT上的指令。
当指定了ENTRYPOINT指令时,CMD指令里的命令性质将会发生改变!
CMD指令中的内容将会以参数形式传递给ENTRYPOINT指令中的命令,如下:
FROM ubuntuENTRYPOINT ["rm", "docker2"]CMD ["-rf"]
其实,它真正执行的命令将会是:rmdocker2 -rf
  • LABEL

用于为镜像添加元数据

格式: LABEL <key>=<value> <key>=<value> <key>=<value> ... 
示例: 
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注: 使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。
推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
  • ENV

这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

FROM ubuntu:16.04
ENV MODE=testRUN apt-get update && apt-get install -y curl && curl http://192.168.0.89:5000/$MODE && rm -rf /var/lib/apt/lists/
*如果你要设置多个环境变量,为了美观,你可以使用\\来进行换行。
多个环境变量的隔开,使用空格进行隔开的,如果某个环境变量的值是由一组英文单词构成,那么你可以将其使用""进行圈起来。
如下:
FROM ubuntu:16.04
RUN MODE=test DESCRITPION="ios 12" \\ TITLE="iphone" 
接下来,将这个Dockerfile构建成镜像,然后以此镜像为基础创建并启动一个容器,在容器中,我们调用这个环境变量,仍然是有用的!!!值得注意的是,如果你想通过CMD或者ENTRYPOINT指令的exec格式来打印环境,就像下面这样:
CMD ["echo", $MODE]CMD ["echo", "$MODE"]
这样都是不能正确输出环境变量的值的,你可以改成
exec格式来执行shell命令,如下:
CMD ["sh", "-c", "echo $MODE"]
如此,就能正确输出环境变量的值了!
  • EXPOSE

EXPOSE指令是声明运行时容器服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在Dockerfile中这样声明有两个好处:一个是帮助镜像使用者更好的理解这个镜像服务的守护端口,另一个作用则是在运行时使用随机端口映射时,也就是docker run -p命令时,会自动随机映射EXPOSE端口。
要将EXPOSE和在运行时使用-p <宿主>:<容器端口>区分开来,-p是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而EXPOSE仅仅是声明端口使用什么端口而已,并不会自动在宿主进行端口映射。

格式: EXPOSE <port> [<port>...]
示例: 
EXPOSE 80 443 EXPOSE 8080 
EXPOSE 11211/tcp 11211/udp
注: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在dockerrun运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
  • VOLUME

指令用于构建镜像时定义匿名卷,其格式有两种:

格式: VOLUME ["/path/to/dir"]示例: 
VOLUME ["/data"] 
VOLUME ["/var/www","/var/log/apache2", "/etc/apache2"
注: 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
FROM ubuntu:16.04VOLUME ["/data", "/command"]
这里的/data和/command目录在容器运行时会自动挂载为匿名卷
任何向/data和/command目录中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化!
容器匿名卷目录指定可以通过docker run命令中指定-v参数来进行覆盖
  • WORKDIR

工作目录,类似于cd命令

格式: WORKDIR /path/to/workdir示例: 
WORKDIR /a (这时工作目录为/a) 
WORKDIR b(这时工作目录为/a/b) 
WORKDIR c (这时工作目录为/a/b/c)
注: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
案列
FROM ubuntu:16.04
WORKDIR /data/testRUN mkdir dockerWORKDIR /data/test/docker
RUN echo"test" > demo.txt
这样,Dockerfile中两次RUN指令的操作都在不同的目录下进行,最终容器会切换到最后一次WORKDIR指令下的目录。
WORKDIR指令可以通过docker run命令中的-w参数来进行覆盖
  • USER

USER指令用于将会用以什么样的用户去运行

FROM ubuntu:16.04USER docker
基于该镜像启动的容器会以 docker 用户的身份来运行,我们可以指定用户名或者UID,组名或者GID,或者两者的结合,如下:
FROM ubuntu:16.04
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
USER 指令可以在 docker run 命令中的 -u 参数进行覆盖
  • ARG

构建参数ARG和ENV指令一样,都是设置环境变量。与之不同的是,ARG设置的环境变量只是在镜像构建时所设置的,在将来容器运行时是不会存在这些环境变量的。但是不要因此就用ARG来保存密码之类的信息,因为通过docker history还是能够看得到的。ARG指令与ENV指令的使用类似

FROM ubuntu:16.04
ARG app="python-pip"
RUN apt-get update && apt-get install -y $app && rm -rf /var/lib/apt/lists/*
ARG 构建参数可以通过 docker run 命令中的 --build-arg 参数来进行覆盖
  • ONBUILD

ONBUILD 指令是为了帮助别人定制而准备的

格式: ONBUILD [INSTRUCTION]示例: 
ONBUILD ADD . /app/src ONBUILD RUN/usr/local/bin/python-build --dir /app/src
注: 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
from ubuntu:16.04WORKDIR /dataONBUILD RUN mkdirtestdocker build -t test:v8 .此时,我们以此Dockerfile进行构建镜像ubuntu:test
并以此镜像为基础创建并启动一个容器,进入容器后,容器会自动切换到WORKDIR指令下的目录,此时我们使用ls命令会发现在工作目录下,并未创建test文件夹,如下:
root@ubuntu:~/docker# docker run -ittest:v8
root@3a8f912fd23b:/data# ls
root@3a8f912fd23b:/data# 
此时,我们再创建一个Dockerfile,只需一个FROM指令即可,使其继承刚刚我们构建的ubuntu:test镜像,如下:
FROMtest:v8
我们再以此Dockerfile构建镜像ubuntu:test_onbuild,并以此镜像为基础创建并启动一个容器
进入容器后,容器会自动切换到WORKDIR指令下的目录
此时我们使用ls命令会发现在工作目录下,已经创建好了一个名为test的文件夹,如下:
root@ubuntu:~/docker# docker run -it ubuntu:test_onbuild
root@5394e605b6ea:/data# ls test
  • CMD和ENTRYPOINT的区别

CMD #指定这个容器启动的时候要运行的命令,可被替换ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

from centosCMD ["ls" ,"-a"]docker build -t test04:v1

DockerFile综合实战

  • DockerFile制作Tomcat镜像

dockerfile是用来构建dokcer镜像的文件!令参数脚本!构建步骤:

  1. 编写一个dockerfile 文件
  2. docker build构建成为一个镜像
  3. docker run运行镜像
DockerFile
FROM centos
MAINTAINER WCC<18587781058@163.com>
# 解压缩
ADD ./apache-tomcat-9.0.50.tar.gz /usr/local
ADD ./jdk-8u201-linux-x64.tar.gz /usr/local
RUN yuminstall -y vim
ENV MYPATH /usr/local 
WORKDIR $MYPATH 
ENV JAVA_HOME=/usr/local/jdk1.8.0_201
ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50
ENV PATH $PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin:$TOMCAT_HOME/lib
EXPOSE 8080 
CMD /usr/local/apache-tomcat-9.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.50Docker技术详解(零基础入门使用教程)

零基础入门Docker

零基础入门Docker

零基础入门Docker

从实战开始,零基础Docker入门教程

从零开始入门docker