安装 Docker
# 1.yum包更新到最新
yum update
# 2.安装需要的软件包 yum-config-mapper功能 另外连个是device-mapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4.安装docker
yum install -y docker-ce
# 5.查看docker版本
docker -v
配置docker镜像加速器
#阿里云 容器镜像服务 配置加速器
#通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://asmpc6kh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
1. Docker服务相关命令
#启动
systemctl start docker
#停止
systemctl stop docker
#重启
systemctl restart docker
#查看状态
systemctl status docker
#设置开机启动
systemctl enable docker
2. Docker镜像相关命令
#查看本地镜像
docker images
#查看所有镜像id
docker images -q
#查询镜像
docker search redis
#拉取镜像 冒号后跟随版本号(:version ) 默认下载latest
docker pull redis
# https://hub.docker.com 查询版本号
#删除镜像 IMAGE ID
docker rmi de25a81a5aO
#删除镜像 名称版本号
docker rmi redis:latest
#删除所有镜像
docker rmi 'docker images -q'
3. Docker容器相关命令
#查看正在运行容器
docker ps
#查看所有容器 status Up 运行 Exited 关闭
docker ps -a
#创建一个容器
docker run -it --name=c1 centos:7 /bin/bash
docker run -id --name=c2 centos:7
#进入c2 容器
docker exec 参数 #退出容器,容器不会关闭
docker exec -it c2 /bin/bash
- -i 保持容器运行
- -t 分配一个输入终端
- -d 以守护(后台)模式运行容器
- -it 创建的容器 称为 交互式容器 -id 称为 守护式容器
- –name 为创建的容器命名
#停止容器
docker stop c2
#启动
docker start c2
#查询所有容器
docker ps -aq
# 删除容器 可以为容器名称 及 id
docker rm c1
#删除所有容器 如果容器是运行状态则删除失败,需停止容器才能删除
docker rm 'docker ps -aq'
#查看容器信息
docker inspect
Docker 容器的数据卷
1. 配置数据卷
#创建容器 -v设置数据卷 1 目录必须是绝对路径 2 目录不存在,会自动创建 3 可以挂在多个
docker run ... -v 宿主文件目录:容器内目录
docker run -it --name=c3 -v /data:/root/data/ centos:7 /bin/bash
2. 数据卷容器
#创建启动C3数据卷容器,使用-v参数 设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
#创建c1 c2容器,使用 --volume-from 参数设置数据卷
docker run -it --name=c1 --volume-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volume-from c3 centos:7 /bin/bash
Docker 应用部署
tomcat部署
#搜索tomcat镜像
docker search tomcat
#拉取tomcat镜像
docker pull tomcat
创建容器,设置端口映射,目录映射
#在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080
-v $PWD:/usr/local/tomcat/webapps \
tomcat
参数说明
-p 8080:8080 将容器的8080端口映射到主机的8080端口
-v $PWD:/usr/local/tomcat/webapps 将主机当前目录挂载到容器的webapps
使用外部机器访问 tomcat
redis 部署
# 下载redis
docker pull redis:5.0
# 下载官方配置文件
# 修改配置文件
mkdir -p /etc/nginx
# 开启redis验证
requirepass alidata!
# 允许外部连接 注释 bing 127.0.01
daemonize yes
#开启redis数据持久化
appendonly yes
#创建 redis 容器
docker run -id -p 6379:6379 -v /usr/redis/redis.conf:/etc/redis/redis.conf --name=redis redis:5.0 redis-server /etc/redis/redis.conf
mysql 部署
#拉取mysql镜像
docker pull mysql:5.7.29
docker run --privileged=true --name=mysql5.7
-p 3306:3306 -v/var/lib/mysql:/var/lib/mysql
-v /etc/my.cnf:/etc/my.cnf
-v /etc/init.d/:/etc/init.d/ -e MYSQLROOT
Dockerfile
Docker镜像的本质是一个分层文件系统 复用
1. Docker 镜像原理
- Docker 镜像是由特殊的文件系统叠加而成
- 最底端是bootfs,并使用宿主机的bootfs
- 第二层是root文件系统rootfs称为base image
- 然后再往上叠加其他的镜像系统
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供一个统一的视觉,这样就隐藏了多层的存在在用户角度看来,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
- 当从一个镜像启动容器时,Docker会从最顶层加载一个读写文件系统作为容器
2. Docker 镜像制作
容器转镜像
docker commit 容器id 镜像名称:版本号
docker commit 381575 it_tomcat:1.0
#目录挂载 commit 不生效
docker save -o 压缩文件名称 镜像名称:版本号
docker save -o it_tomcat.tar it_tomcat:1.0
docker load -i 压缩文件名称
docker load -i it_tomcat.tar
Dockerfile
- Dockerfile 文本文件
- 包含一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 官网 https://hup.docker.com
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签可以使用Label代替Maintainer最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令默认是/bin/bash 格式;RUN command 或者RUN[“command”,“param1”,param2] |
CMD | 容器启动命令 | 提供启动容器时活的默认命令和ENTRYPOIN配合使用 格式CMD command param1 param2或者CMD[“command”,“param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数只在构建的时候使用的参数,如果有ENV 那么ENV的相同名字值始终覆盖ARG的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定格式 VOLUME[“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器时 使用-p来绑定暴露端口 格式:EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定 /使用绝对定制 如果不是 / 开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定检测当前容器的健康检测的命令 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后会指向 ONBUILD的命令 但是不影响当前镜像 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号已退出 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
3. Dockerfile 案例
创建centos7
FROM centos:7 #定义父镜像
MAINTANER it<qq.com> #定义作者信息
RUN yum install -y vim #执行安装vim命令
WORKDIR /usr #定义默认的工作目录
CMD /bin/bash #定义容器启动执行的命令
部署springboot项目
FROM java:8
MAINTANER it<qq.com>
ADD springboot.jar springboot.jar #将jar添加到容器中
#CMD java -jar app.jar #定义容器启动执行的命令
ENTRYPOINT ["nohup","java","-jar","app.jar"]
#通过dockerfile构建镜像
docker build -f dockerfile文件路径 -t 镜像名称:版本 .
# 使用centos7 制作 java8环境 配置环境变量
FROM centos:7
MAINTAINER g<qq.com>
RUN mkdir /usr/local/java
ADD jdk-8u251-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_251
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin
#创建项目 目录 复制jar包 启动项目
RUN mkdir -p /data/springboot
ADD boot-security-0.0.1-SNAPSHOT.jar /data/springboot/app.jar
ENTRYPOINT ["nohup","java","-jar","/data/springboot/app.jar",">info.log","2>&1","&"]
#部署 redis
docker run -id -p 6379:6379 -v /usr/redis/redis.conf:/etc/redis/redis.conf --name=redis redis:5.0 redis-server /etc/redis/redis.conf
Docker 服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量很大
- 要从Dockerfile build image 或者是dockerhub拉取image
- 要创建多个container
- 要管理多个container 启动停止删除
服务编排:按照一定的有业务规则批量管理容器
Docker Compose: 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完成开发周期,包括服务构建 启动 停止
使用步骤:
- 利用Dockerfile定义运行环境镜像
- 使用docker-compose.yml定义组成应用的隔服务
- 运行docker-compose up 启动应用
1. 安装 Docker Compose
#Compose 目前已经完全支持Linux、Mac OS和Windows,在安装Compose之前需要先安装 Docker,下面编译好二进制包方式安装在linux系统中
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-'uname-s'-'uname -m' -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose -version
2. 卸载 Docker Compose
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3. 使用docker compose 编排nginx+springboot项目
创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
编写docker-compose.yml文件
名词 | 描述 |
---|---|
version | docker文件的版本 |
image | 指定容器镜像就是之前拉取的redis镜像 |
container_name | 给这个镜像起一个别名 |
restart | always:表名开机自启动 |
command | 相当于执行一些命令 (–requirepass 指定redis密码 --appendonly yes 这个命令是用于开启redis数据持久化) |
ports | 端口映射,将容器的端口映射到对应宿主机的端口 |
volumes | 数据卷的映射.因为一旦容器停止了那么里面的数据也没有.所以我们需要把这个数据文件放在外面,然后映射到容器中 |
vim docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
在./nginx/conf.d目录下 编写nginx.conf
vim nginx.conf
server {
listen 80;
access_log off;
location /{
proxy_pass http://app:8080
}
}
在 ~/docker-compose 目录下使用docker-compose 启动容器
docker-compose up
# 后台执行
docker-compose up -d
测试访问
http://ip/hello
Docker 私有仓库
1. 私有仓库搭建
# 1.拉取私有仓库镜像
docker pull registry
# 2.启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3.打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4. 修改daemon.json
vim /etc/docekr/daemon.json
#在上述文件中添加一个key,保存退出。此步用于让docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真是ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
# 5.重启docker
systemctl restart docker
docker start registry
2. 将镜像上传至私有仓库
# 1.标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
# 2.上传标记的镜像
docker push 私有仓库服务器ip:5000/centos:7
3. 从私有仓库拉取镜像
# 拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7