目录
零、Docker简单介绍总结
0-0 容器介绍
0-1 容器 vs 虚拟机
0-2 Docker的应用场景
0-3 Docker 内核依赖技术
0-4 Docker 所具备的功能
一、Docker容器技术前期准备
1-0 环境准备
1-1 pull 下载常用镜像
二、Docker容器技术的三大构成
2-0 三大构成的简单介绍
2-1 Docker各组成部分关系
三、 Image镜像相关操作
3-1 选择指定镜像的方式(两种)
3-1-1 使用指定名字 镜像名:版本TAG
3-1-2 使用IMAGE ID
3-2 本地镜像的查询操作
3-2-0 查看本地所有已pull镜像
3-2-1 --no-trunc 查看ID的全部内容,但通常使用前几位
3-2-2 只显示镜像id
3-2-3 显示镜像的详细信息
3-3 本地镜像及容器的删除操作
3-4 本地镜像的导入导出
3-4-1 导出 (save)
3-4-2 导入(load)
3-5 启动容器并获取镜像
四、镜像制作
4-0 容器的增删查
4-1 创建镜像的三大步骤
4-2 本地镜像的状态保存及创建
五、镜像内yum源的优化操作
5-1 基于centos7系统,对ssh的配置
六 、具体环境制作镜像 - centos7.5+vim+net-tools+iproute+sshd
七、Dockerfile 的简单应用- centos7.5+vim+net-tools+iproute+sshd
八、container容器相关操作
8-0 容器的基本类型
8-0-1 工具类 - 交互式启动
8-0-2 服务类 - 后台启动
8-1 容器的启动方式
8-1-1 交互式启动
8-1-2 守护式启动
8-2 容器的基本管理
8-2-1 查看
8-2-2 删除
8-2-3 关闭和启动
九、Dockerfile 的基本介绍及使用
9-1 Dockerfile的作用(用于镜像生成)
9-2 Dockerfile 语法格式
9-3 Dockerfile 命令详解
9-3-1 FROM
9-3-2 RUN
9-3-3 CMD
9-3-4 ENTRYPOINT
9-3-5 EXPOSE
9-3-6 ENV
9-3-7 ADD
9-3-8 COPY
9-3-9 VOLUME
9-3-10 USER
9-3-11 WORKDIR
9-3-12 ONBUILD
十、Docker 数据卷
10-1 启动时使用数据卷(-v)
十一 、实现复杂的Dockerfile使用,包含数据卷(redis配置)
十二、Docker 本地私有仓库
12-0 搭建私有仓库
12-1 上传镜像到私有仓库
12-2 从私有仓库下载镜像到本地
零、Docker简单介绍总结
0-0 容器介绍
- 一种类虚拟化的方案
- 操作系统级别功能
- 只能运行同内核或类内核的OS
- 依赖Linux内核特性:Namespace与Cgroups
0-1 容器 vs 虚拟机
容器和虚拟机之间的主要区别:虚拟化层的位置和操作系统资源的使用方式
- 容器
- 不需要安装主机操作系统,直接将容器层(比如LXC或libcontainer)安装在主机操作系统(通常是Linux变种)之上
- 每个容器化应用都会共享相同的操作系统(单个主机操作系统)
- 直接利用了宿主机的内核,抽象层比虚拟机更少,更加轻量化,启动速度极快
- 每套容器都拥有自己的隔离化用户空间,从而使得多套容器能够运行在同一主机系统之上
- 虚拟机
- 虚拟机会将虚拟硬件、内核(即操作系统)以及用户空间打包在新虚拟机当中,虚拟机能够利用“虚拟机管理程序”运行在物理设备之上。
- 虚拟机依赖于hypervisor,其通常被安装在“裸金属”系统硬件之上,这导致hypervisor在某些方面被认为是一种操作系统。一旦 hypervisor安装完成, 就可以从系统可用计算资源当中分配虚拟机实例了,每台虚拟机都能够获得唯一的操作系统和负载(应用程序)。
- 虚拟机先需要虚拟一个物理环境,然后构建一个完整的操作系统,再搭建一层Runtime,然后供应用程序运行。
0-2 Docker的应用场景
- 开发、测试、部署服务
- 隔离的运行环境
- 构建多用户的平台即服务(PaaS)基础设施
- 提供软件即服务(SaaS)应用程序
- 高性能、超大规模系统
0-3 Docker 内核依赖技术
0-4 Docker 所具备的功能
- 文件系统隔离:每个容器都有自己的rootfs
- 进程隔离:每个容器都运行在自己的集成环境中
- 网络隔离:容器间的虚拟网路接口和IP都是分开的
- 资源组隔离:使用Cgroup将Cpu、Mem资源独立分配给每个Docker容器。
一、Docker容器技术前期准备
1-0 环境准备
# 获取 Docker 的 yum 源 curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# 依赖包安装 yum install -y yum-utils device-mapper-persistent-data lvm2 # 查询docker版本情况 yum list docker-ce.x86_64 --showduplicates | sort -r # 安装docker(一条语句) yum install -y --setopt=obsoletes=0 \ docker-ce-17.03.2.ce-1.el7.centos.x86_64 \ docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
docker启动 systemctl daemon-reload systemctl restart docker 开机自启 systemctl enable docker
测试语句,显示当前docker版本号 docker version
配置镜像加速(阿里云Docker-hub) mkdir -p /etc/docker 配置文件 vim /etc/docker/daemon.json { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"] } 或者一步(同上一部配置文件) - 若存在错误,请查看阿里云Docker配置官方文档 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"] } EOF
重启docker systemctl restart docker
1-1 pull 下载常用镜像
下载基础镜像系统 docker pull centos:6.9 docker pull centos:7.5.1804 获取带有nginx的镜像 docker pull nginx
查看pull到本地的镜像 docker images
启动本地镜像容器 docker run -it centos:6.9 查看当前镜像(容器内执行命令) cat /etc/redhat=release 退出 exit
二、Docker容器技术的三大构成
2-0 三大构成的简单介绍
- Docker Image镜像
- 容器的基石
- 层叠的只读文件系统
- 联合加载模式
- Docker container容器
- 通过Image启动
- 是容器的启动和执行阶段
- 写时复制
- Docker registry 仓库
- 公有
- 私有
- Docker hub
2-1 Docker各组成部分关系
三、 Image镜像相关操作
3-1 选择指定镜像的方式(两种)
3-1-1 使用指定名字 镜像名:版本TAG
3-1-2 使用IMAGE ID
3-2 本地镜像的查询操作
3-2-0 查看本地所有已pull镜像
docker images
3-2-1 --no-trunc 查看ID的全部内容,但通常使用前几位
docker images --no-trunc
3-2-2 只显示镜像id
docker images -q
3-2-3 显示镜像的详细信息
docker inspect ID/name:tag
3-3 本地镜像及容器的删除操作
删除指定镜像 docker rmi ID 删除命令的所有结果镜像 docker rmi `docker images -q` -f 强制删除所有当前启动容器 docker rm -f `docker ps -qa`
3-4 本地镜像的导入导出
3-4-1 导出 (save)
docker save IMAGE-ID >重定向的指定目录文件 docker image save nginx >/opt/nginx.tar.gz
3-4-2 导入(load)
docker load -i 指定镜像地址 docker image load -i /opt/nginx.tar.gz
查看本地镜像,确认镜像被导入 docker images
3-5 启动容器并获取镜像
启动容器并自动获取镜像 docker run -d -p 80:80 httpd 查看正在运行的镜像 docker ps -a 查看本地镜像 docker images
访问httpd curl -I 10.0.0.100
四、镜像制作
制作镜像的目的:保存一个镜像的当时环境状态,可用于回滚等操作,类似于虚拟机的快照
4-0 容器的增删查
启动指定容器 docker run -it --name "test" centos:6.9 docker run -it --name "指定name" 基于的镜像名字或ID
查看当前启动容器 docker ps -a
强制删除所有当前启动容器 docker rm -f `docker ps -qa`
4-1 创建镜像的三大步骤
查看当前启动的容器 docker ps -a docker commit 镜像name 自定义名:TAG docker commit xxxxxx oldguo/wordpress:v1 查看本地镜像 docker images
4-2 本地镜像的状态保存及创建
原有镜像修改创建(状态的保存) 启动本地的指定镜像 docker run -it -p 180:80 --name="wordpress1" ae74026f73e5 /bin/bash 在指定镜像内做相关操作,改变一些状态 cd /usr/local/apache2/htdocs echo "
Hi,Oldguo
" >index.html exit 创建当前状态的镜像 docker commit wordpress1 oldguo/wordpress:v2 删除现有所有启动的容器 docker rm -f `docker ps -qa` 启动指定镜像,获取保存镜像 docker run -it --name="test" 0ae9bcda8b8b /bin/bash
五、镜像内yum源的优化操作
mv /etc/yum.repos.d/*.repo /tmp echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo 下载必须的软件包 yum install -y vim net-tools iproute -y yum install -y openssh-*
5-1 基于centos7系统,对ssh的配置
注意:Centos7系统必须对ssh进行一些配置,才能启动ssh服务
yum install -y sed 下方代码全部一次复制粘贴 mkdir /var/run/sshd echo 'UseDNS no' >> /etc/ssh/sshd_config sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd echo 'root:123456' | chpasswd /usr/bin/ssh-keygen -A 注意:配置了ssh的相关用户名和密码
启动ssh服务 /usr/sbin/sshd -D 退出前步 ctrl+p+q
查看容器的ip地址 docker inspect
通过宿主器去连接容器 ssh 容器IP 密码在ssh配置脚本内配置root:123456
六 、具体环境制作镜像 - centos7.5+vim+net-tools+iproute+sshd
启动新容器 docker run -it --name "centos7.5" 76d6bc25b8a5
优化yum源 mv /etc/yum.repos.d/*.repo /tmp echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
安装必须软件包 yum install -y vim net-tools iproute openssh-* -y 启动sshd(centos7容器) mkdir /var/run/sshd echo 'UseDNS no' >> /etc/ssh/sshd_config sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd echo 'root:123456' | chpasswd /usr/bin/ssh-keygen -A /usr/sbin/sshd -D 退出上述步骤,但不关闭容器 ctrl p q
基于上述容器制作镜像 docker commit centos7.5 oldguo/centos7_sshd:v2
七、Dockerfile 的简单应用- centos7.5+vim+net-tools+iproute+sshd
注意:Dockerfile 必须依赖于yum优化后的镜像
''' FROM 基础镜像(若基础镜像本地不存在,会自动进行pull操作获取) RUN 执行命令 EXPOST 服务对外暴露的端口号 CMD 使用命令执行 CMD ["/usr/sbin/sshd", "-D"] 基于当前容器启动是,执行-D命令,用于夯住sshd服务 ''' # 宿主机下的配置 cd /opt mkdir dockerfile vim dockerfile '''注意:dockerfile文件的名字必须是dockerfile''' FROM centos:7.5.1804 RUN mv /etc/yum.repos.d/*.repo /tmp RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo RUN yum install -y openssh-server RUN yum install -y openssh-clients RUN yum install net-tools* -y RUN yum install iproute-* -y RUN mkdir /var/run/sshd RUN echo 'UseDNS no' >> /etc/ssh/sshd_config RUN sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd RUN echo 'root:123456' | chpasswd RUN /usr/bin/ssh-keygen -A EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
构建镜像 docker build -t "oldguo/centos7_sshd:v3" /opt/dockerfile 注意:/opt/dockerfile 是文件所在的目录,而非文件本身
八、container容器相关操作
8-0 容器的基本类型
8-0-1 工具类 - 交互式启动
工具类:vim docker run -it --name="test_vim" 3fe2fe0dab2e /bin/bash -it 交互式启动(启动即登陆) /bin/bash 进入后执行的命令 退出交互式 exit 将交互式交于后台执行 ctrl + p + q
注意:交互式无法自动启动,必须手动启动服务,如下图:
8-0-2 服务类 - 后台启动
服务类:nginx docker run -d -p 8080:80 --name="discuz" nginx:1.14 -d 后台运行 -p 虚拟机的8080端口:容器的80端口
8-1 容器的启动方式
8-1-1 交互式启动
- docker run -it --name="test_vim" 3fe2fe0dab2e /bin/bash
- -it 启动
- /bin/bash 指定启动后的命令;/bin/bash为为容器生成母进程的命令
- exit 退出,服务类进程会关闭服务
8-1-2 守护式启动
- 1- 交互式启动容器+Ctrl+p+q -- 后台执行
- 2- 死循环 - 夯住服务
- 3- 服务前台运行 - 挂机操作
8-2 容器的基本管理
8-2-1 查看
查看当前容器状态 docker ps -a 查看当前所有容器情况 docker ps -q 查看当前正在运行的id docker ps -qa 查看所有容器的id docker ps -l 查看最近创建的一个容器 docker ps -ql 查看最近创建的一个容器id
查看指定容器的进程情况 docker top nginx
查看指定容器的详细信息 docker inspect nginx
进入交互式容器内(ctrl+q+p的相反操作) docker attach 容器ID|容器名称 注意:atach为镜像关系,多个窗口执行相同步骤 退出即结束服务 exit 另一种进入交互式的方式(非镜像操作) docker exec -i -t 容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用 docker exec -it centos6.9 /bin/bash
8-2-2 删除
删除单个指定容器(使用name或ID指定) docker rm 容器ID|容器名称 删除所有容器(已退出和未退出) docker rm -f `docker ps -a –q`
批量删除已经退出的容器 docker rm -v $(docker ps -aq -f status=exited)
8-2-3 关闭和启动
停止服务(速度较慢) docker stop 指定容器 强制停止 docker kill 指定容器
启动容器 docker start -i 指定容器 重启容器 docker restart 指定容器
九、Dockerfile 的基本介绍及使用
9-1 Dockerfile的作用(用于镜像生成)
Docker通过读取Dockerfile里面的内容可以自动build image,Dockerfile是一个包含了build过程中需要执行的所有命令的文本文件。也可以理解为Dockfile是一种被Docker程序解释的脚本,由一条一条的指令组成,每条指令对应Linux系统下面的一条命令,由Docker程序将这些Dockerfile指令翻译成真正的Linux命令。
Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
9-2 Dockerfile 语法格式
基本功能 FROM RUN 常用功能 CMD MAINTAINER ENTRYPOINT EXPOSE USER ENV ADD COPY VOLUME WORKDIR ONBUILD
9-3 Dockerfile 命令详解
9-3-1 FROM
- Dockerfile必须以FROM指令开始,FROM指令指定了基础镜像是什么。也就是基于哪个镜像来制作自己的镜像。
- FROM
- image name的格式一般为"image:tag"
9-3-2 RUN
- 在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。
- RUN
9-3-3 CMD
- 支持三种格式
- CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
- CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
- CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
- 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
- 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令
9-3-4 ENTRYPOINT
- ENTRYPOINT
- 两种格式:
- ENTRYPOINT ["executable", "param1", "param2"]
- ENTRYPOINT command param1 param2(shell中执行)
- 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
- 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
9-3-5 EXPOSE
- 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
- 格式为 EXPOSE
[ ...] 9-3-6 ENV
- 功能为设置环境变量
- 语法有两种
- 1. ENV
一次设置一个 - 2. ENV
= 一次设置多个... 9-3-7 ADD
- 一个复制命令,把文件复制到镜像中。并带有自动解压功能。
- 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。
- 语法如下:
- 1. ADD <src>... <dest>
- 2. ADD ["<src>",... "<dest>"]
- <dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
- <src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
- 如果把<src>写成一个url,那么ADD就类似于wget命令;如下写法:
- ADD test relativeDir/
- ADD test /relativeDir
- ADD http://example.com/foobar /
9-3-8 COPY
- 复制命令
- 语法如下:
- 1. COPY <src>... <dest>
- 2. COPY ["<src>",... "<dest>"]
- <src>与ADD的区别:
- COPY的<src>只能是本地文件,其他用法一致
9-3-9 VOLUME
- 可实现挂载功能,可以将内地文件夹或者其他容器种得文件夹挂在到这个容器种
- 语法:VOLUME ["/data"]
9-3-10 USER
- 格式:USER daemon
- 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
- 当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
9-3-11 WORKDIR
- 语法:WORKDIR /path/to/workdir
- 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。
9-3-12 ONBUILD
- 语法:ONBUILD [INSTRUCTION]
- 这个命令只对当前镜像的子镜像生效。
十、Docker 数据卷
在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式 - 数据卷、数据卷容器。:
Docker数据卷的备份及恢复
- 数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
- 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷
10-1 启动时使用数据卷(-v)
十一 、实现复杂的Dockerfile使用,包含数据卷(redis配置)
打包已安装好redis tar -cvf redis-3.2.10.tar redis-3.2.10
创建目录 用于放dockerfile文件和redis文件 mkdir -p /opt/docfile/redis3 注意:将要上传的软件,必须和dockerfile文件在同一目录下 将打包好的文件,放到新建的指定文件夹内 编写dockfile文件,将指定路径的本地文件上传到容器内
测试基础镜像centos7.5.1804安装redis 启动容器,将本地宿主机/opt目录映射到容器的/data目录 docker run -it --name="centos_redis" -v /opt/:/data centos:7.5.1804 /bin/bash 进入容器内的redis文件的src配置文件夹 执行配置文件夹内的redis-server文件,并后台运行 ./redis-server & 若不进行后台运行(&) 则会使得软件夯住 ./redis-server
书写dockerfile文件 cd /opt/docfile/redis3 vim dockerfile
配置redis的配置文件 cd /opt/docfile/redis3/ vim redis.conf
- 使用 Dockerfile 生成镜像
- docker build -t 镜像名:tag
- 启动生成的镜像
- docker run -d -p 本地端口:映射容器端口 --name “镜像别名” 镜像名:tag
- 测试:宿主机连接容器内的redis
- redis-cli 宿主机ip:宿主机端口
十二、Docker 本地私有仓库
12-0 搭建私有仓库
制作私有仓库,存储本地镜像 docker run -d -p 5000:5000 --restart=always --name registry -v /opt/Registry:/var/lib/registry registry
vim /etc/docker/daemon.json { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"], "insecure-registries": ["10.0.0.100:5000"] }
重启容器 systemctl restart docker
12-1 上传镜像到私有仓库
将镜像打上tag [root@docker ~]# docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1 查看镜像 [root@docker ~]# docker images 上传指定镜像 [root@docker ~]# docker push 10.0.0.100:5000/oldguo/nginx:v1
12-2 从私有仓库下载镜像到本地
下载镜像 [root@docker ~]# docker pull 10.0.0.100:5000/oldguo/nginx:v1 查看本地镜像 [root@docker ~]# docker images