docker学习
概述
docker用于开发者打包代码及运行环境,避免环境不一致导致代码不能运行。也可用作虚拟化。
与传统虚拟化技术的区别
- 传统虚拟化技术是在虚拟出一套硬件之后,在其上运行一个完整的操作系统,再在该系统上运行应用程序
- 容器的应用程序直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器更为轻便
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会互相影响,能区分计算资源
组成
三大组成 : 容器(镜像跑起来之后就是实例(docker run xxx)),镜像,仓库(存放多个镜像)
基本使用
docker info : 查看docker相关信息
docker --help : 帮助
docker ps : 查看正在运行的容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] : 启动
docker run -d --name="nginx" -p 80:80 nginx
OPTIONS说明
--name : 为容器执行一个名称,--name="centos"
-d : 后台运行容器,并返回容器ID,也即启动守护式容器
-i : 以交互模式运行容器,通常与“-t”一起使用
-t : 为容器重新分配一个伪输入终端,通常与“-i”一起使用
-P : 随机端口映射
-p : 指定端口映射,有以下四种合适
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
例子 : docker run -it --name="mycentos" centos:centos6.9
Ctrl + P + Q 退出当前容器且不关闭容器
exit 退出且关闭容器
docker attach : 进入正在运行的容器
例子 : docker attach 73da45cc0ea5
docker commit : 提交当前容器并使之成为一个新的镜像
格式 : docker commit -m "描述" -a "作者" 容器ID 要创建的目标镜像名:标签名
例子 : docker commit -m "centos with vim" -a "jin" 6bf0ddc92102 jin/centos:1.0
容器数据卷
docker命令直接添加
docker -v 宿主目录:容器目录
例子 : docker run -it --name="mycentos" -v e:/testVolume:/testVolume centos:centos6.9
注意 : windows系统需要设置docker deskep(Settings -> File sharing)
DockerFile添加
VOLUME指令 : 给容器添加一个或多个数据卷
容器间传递共享(--volumes-from)
docker run --volumes-from xxx
例子 : docker run -it --name="mycentos2" --volumes-from mycentos centos:centos6.9
DockerFile
执行流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像曾
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有的指令执行完成
Dokerfile体系结构
FROM : 基础镜像。当前镜像基于该镜像创建
MAINTAINER : 镜像维护者的姓名和邮箱
RUN : 容器构建时需要运行的命令
EXPOSE : 当前容器对外暴露出的端口
WORKDIR : 再创建容器后,终端的默认工作目录
ENV : 用来在构建镜像的过程中设置环境变量
ADD : 拷贝+解压缩
COPY : 拷贝
VOLUME : 数据卷
CMD : 指定容器启动时要执行的命令(有多个时,最后一个生效,该指令会被run之后的参数替换)
ENTRYPOINT : 指定容器启动时要执行的命令(有多个时,最后一个生效,run之后的参数会追加到该命令后(传参))
ONBUILD : 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的ONBUILD会被触发
例子1 : 制作一个镜像,获取当前外网IP
FROM centos:centos6.9
MAINTAINER jin<jinblog@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 当命令是以 ["XXX"] 的形式定义时,命令将会以可执行二进制文件来执行,而不是shell
RUN yum install curl -y
CMD curl ip.sb
# docker build -f Dockerfile1.txt -t mycentos:1.0 .
例子2 : 制作一个镜像,获取当前外网IP,并能接受curl的参数
FROM centos:centos6.9
MAINTAINER jin<jinblog@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 当命令是以 ["XXX"] 的形式定义时,命令将会以可执行二进制文件来执行,而不是shell
RUN yum install curl -y
ENTRYPOINT ["curl", "ip.sb"]