虚拟容器化学习----Docker学习
安装前准备
yum install -y yum-utils device-mapper-persistent-data lvm2
安装数据存储驱动包 , 安装yum工具yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
设置安装源yum makecache fast
yum自动检测最快安装源
安装
yum -y install docker-ce
安装docker开源社区版本
service docker start
启动docker服务
检测
docker version
查看版本信息
docker pull hello-world
下载docker hello-word
docker run hello-world
更换阿里云的镜像加速
- 登录阿里云
- 搜索镜像加速器
- 根据相关操作文档操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [加速器地址]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker是什么
Docker 是一种CS架构的软件, Docker 是提供应用打包,部署于运行引用的容器平台
docker 引擎包裹:
- docker 引擎
- docker REST API
- docker CLI
Docker 使用了HTTP 协议,docker的兼容于拓展很好
docker 结构
- 客户端:docker CLI
- 通信层:REST API
- 引擎:docker daemon
容器与镜像
镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的集装箱
容器: 镜像的实例,由Docker负责创建,容器之间彼此隔离
docker 容器与镜像在宿主机上的安装路径 /var/lib/docker
除非特殊需要,一般不建议修改默认安装地址
Docker 常用命令
- docker pull 镜像名<:tags> - 从远程仓库抽取镜像
- tags:指定版本类型
- docker images - 查看本地镜像
- docker run 镜像名 <:tags> - 创建容器,启动应用
- 如果在运行run的时候,镜像在没有pull到本地的话docker会先去pull latest 版本的镜像 latest 版本为使用最多的版本
- tags:指定版本类型
- docker ps - 查看正在运行中的镜像
- docker rm <-f> 容器id - 删除容器
- 如果容器在运行的情况下 <-f> 强制删除
- docker rmi <-f> 镜像名<:tags> - 删除镜像
- 如果镜像存在且有容器在运行的情况下 <-f> 强制删除
- tags:指定版本类型
- docker stop 容器id - 停止容器
- docker exec [-it ] 容器id linux 命令...[bash || /bin/bash]
- exec 在容器内部执行命令
- -it 使用交互的方式执行命令
PS
-
hub.docker.com
docker 远程中央仓库 -
在开发中可以使用 -f 强制移除,但是在开发环境中不能这么做,-f 相当于强制关机。
-
docker hub 一般有图片或者镜像名为需要的软件名一般是官方提供的。其他的通常是有第三方或个人提供的。第三方的一般不推荐,除非你对它非常了解
Docker 宿主机与容器通信
docker run -p 宿主机端口:容器内部端口 -d 容器名
- -p 端口映射
- -d 后台运行
查看
容器生命周期
DockerFile 构建镜像
什么是Dockerfile
- DockerFile 是一个包含用于组合镜像的命令的文本文档
- Docker通过读取Dockerfile中的指定命令按步自动生成镜像
- docker build -t 机构/镜像名<:tags> Dockerfile 目录
Docker 的分层(Docker layer)
docker file 在构建的过程中,每一步都会创建一个临时容器,这个临时容器是只读的,好处:临时容器在使用的时候的好处在于可以共用。
列如
-
构建一个普通的Dockerfile
-
对Dockerfile重新进行编辑
修改完之后重新build,之后输出如下
它使用了缓存,这里看到没有使用缓存的是由输出的。使用缓存的是没有输出的
Dockerfile 基础命令
-
FROM 容器版本
基于基准镜像- 尽量使用官方提供的BASE Image
FROM scratch
不依赖任何基准镜像
-
MAINTAINER 作者
没有运行含义,只是说明名作者 -
LABEL XXX="XXX"
描述性信息 -
WORKDIR 容器目录
切换工作目录 , 如果当前目录不存在的时候,会自动创建这个目录- 这个目录是通过我们的
docker exec -it 进程号 bash
进入来的
- 这个目录是通过我们的
-
尽量使用绝对路径
-
ADD 宿主机目录 容器目录
将宿主机的目录全部复制到容器目录中ADD xxx.gz /
添加根目录并解压缩- ADD 除了复制,还具备添加远程文件功能
-
ENV XXX /XXX/XXX
设置环境常量- ENV JAVA_HOME /usr/local/openjdk8
- RUN ${JAVA_HOME}/bin/java -jar XXX.jar
- 尽量使用环境常量,可提高程序的维护性
-
RUN&&CMD&&ENTRYPOINT
RUN
在构建镜像时执行命令(修改镜像内部的文件)CMD|ENTRYPOINT
在容器创建时执行命令(对容器中的文件进行操作)
RUN 构建时运行
- 命令格式 RUN yum install -y vim # Shell
- 命令格式 RUN ["yum","install","-y","vim"] #Exec
- 在分不清的情况下推荐使用
Shell 运行方式
- 使用Shell执行时,当前shell 时父进程,生成一个子shell进程
- 在子shell中执行脚本,脚本执行完毕,退出子shell进程,回到当前shell
Exec 运行方式
- 使用Exec方式,会用Exec进程替换当前进程,并保持PID不变
- 执行完毕,直接退出,并不会退回之前的进程环境
ENTRYPOINT 启动命令
- ENTRYPOINT (入口点) 用于在容器启动时执行命令
- Dockerfile中只有最后一个ENTRYPOINT会被执行
- 推荐使用Exec格式
CMD 默认命令
- CMD 用于设置默认执行的命令
- 如Dockerfile中出现多个CMD,则只有最后一个被执行
- 如容器启动时附加指令,则CMD被忽略
- 推荐使用Exec命令格式
- 若容器启动时有其他的参数,CMD 将不会执行
当我们使用下面这种情况启动容器时CMD将不会被执行,这里可以配合ENTRYPOINT一起使用。
Dockerfile 使用例子
使用Dockerfile 构建redis
FROM centos
# 安装C编译组件
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
- 构建镜像
docker build -t xxx/xxx:1.0 .
- 启动容器
docker run -p 7000:6379 xxx/xxx:1.0
容器间的单向访问
docker 内部每个容器都会有一个虚拟ip
docker inspect id
显示容器的原数据
ip放再netSetting中。
在容器间通信的时候不能使用ip进行通信,这个虚拟ip会变动的。
这时我们可以通过对容器取个名字
docker run -d --name xxx 镜像
在没有配置的情况下,ip默认时互通的,但是别名时无法访问得
若要能使用别名访问需要在启动的时候添加额外的参数
docker run -d --name xxx --link 别名 镜像名
Bridge 网桥双向通信
docker 环境下的网桥能够直接链接到宿主机的物理网卡上,配置了网桥后,容器内部可以直接访问到公网上的数据了。
网桥还可以实现docker容器网络上的分组,只要绑定在同一个网桥上,这是容器在网络层面进行了分组。在同一个网桥上,天然互通。
docker network ls
:列出docker网络服务docker network create -d bridge 网桥名称
创建网桥docker network connect 网桥名称 容器名称
容器与网桥绑定
Volume 容器间数据共享
在宿主机上开个空间,所有容器可以读取这个空间上的文件
通过设置-v挂在宿主机目录
docker run --name 容器名 —v 宿主机路径:容器内挂在路径 镜像名
通过--volumes-from 共享容器内挂载点
- 创建共享容器
docker create --name 共享容器名 -v /xx/xx:/xx/xx 镜镜像名 /bin/true
- 共享容器挂载点
docker run --volumes-from 共享容器名 --name xxx -d 镜像名
DockerCompose容器编排
docker 官方为我们提供的容器编排工具时docker compose
我们可以使用docker compose对一组容器进行编排,让他们有顺序的创建。有顺序的启动。
- Docker Compose 单机多容器部署工具
- 通过yml文件定义多容器如何部署
- WIN/MAC 默认提供Docker Compose, Linux 需要安装
安装
由于是github 所以下载会比较慢
https://docs.docker.com/compose/install/
安装后若出现
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc
这种情况的问题则是版本不对,需要去官网下载对应版本的docker-compose然后手动替换掉
docker-compose官网:https://github.com/docker/compose/releases/
将/usr/local/bin/
路径下的docker-compose 删除
重新上传正确版本的docker-compose
授权chmod +x /usr/local/bin/docker-compose
因为正式环境下使用的比较少,一般不使用这个,所以这里我不打算研究了