1. Docker
Docker 是一个开源的应用容器引擎
2. 安装
yum install -y docker
3. 架构
4. Docker 镜像加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://o7uzc3zp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
5. Docker 命令
5.1. 服务
systemctl start docker # 启动
systemctl stop docker # 停止
systemctl status docker #状态
systemctl restart docker #重启
systemctl enabled docker #开机自启
5.2. 镜像
- 查看本地镜像
docker images
- 搜索镜像
docker search 镜像名
- 拉取镜像
docker pull 镜像名:版本号 # 版本号默认为latest
- 删除镜像
docker rmi 镜像id # 也可以通过名称:版本号删除
- 删除所有镜像
docker rmi `docker images -q`
5.3. 容器
创建容器并 运行参数run
- -i 保持运行
- -t 以终端模式运行并进入
- -d 后台常驻模式
- —name=xxx 此容器名称
- 镜像名/id
- /bin/bash 初始化命令
docker run -it --name=redis redis /bin/bash #进入容器内部
docker run -d --name=redis2 redis # 后台运行容器
查询容器
docker ps #查询正在运行的容器
docker ps -a # 查看所有容器包括已停止的
- 进入已经运行的容器内部
docker exec -it 名称/id /bin/bash
- 运行 停止容器
docker stop 名称/id #停止容器
docker start 名称/id #启动容器
- 删除00容器
docker rm 名称/id # 删除容器 先docker ps -a 查询
docker rm `docker ps -aq` # 删除所有容器 慎用 正在运行的容器无法删除
- 查看容器 配置信息
docker inspect 名称/id
- 修改配置信息
systemctl stop docker
cd /var/lib/docker/containers/docekr inspect查出的id
vim config.v2.json
systemctl restart docker
- 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及即无tag的镜像 谨慎使用
docker system prune
- 查看docker自身磁盘使用情况
docker system df
6. 容器数据卷
数据卷是宿主机中的一个目录或文件 称为挂载目录 一个数据卷可以被多个容器同时挂载
- 创建启动容器时 使用 -v参数 设置数据集
docker run -d -v 宿主机目录:容器内目录
目录必须为绝对路径 如果目录不存在则自动创建
7. 数据卷容器
多容器进行数据交换 之前我们通过多容器绑定宿主机的同目录
- 创建一个数据卷容器 单创建容器目录 作为数据卷容器
docker run -it --name=c3 -v /volume redis /bin/bash
- 创建 c1 c2 容器 使用 —volume-from 参数 设置数据卷from c3数据卷容器中
docker run -it --name=c1 --volume-from c3 redis /bin/bash
docker run -it --name=c2 --volume-from c3 redis /bin/bash
8. 应用部署
8.1. MySQL
创建容器
docker run -id \
-p 3307:3306 \
--name=my_mysql \
-v $PWD/conf:/etc/mysql \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
进入容器中
docker exec -it my_mysql /bin/bash
mysql -uroot -p123456
8.2. Tomcat
创建容器
docker run -d \
--name=my_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
8.3. Nginx
docker run -id \
--name=my_nginx \
-p 80:80 \
-v $PWD/html:/usr/share/nginx/html \
nginx
8.4. Redis
docker run -id --name=my_redis -p 6379:6379 redis
9. Docker 镜像
Docker镜像是由特殊的文件系统叠加而成
最底端是bootfs 并使用宿主机的bootfs
第二层是 root 文件系统 rootfs 称为 base image
9.1. 镜像制作
- 容器转为镜像 注意通过映射方式挂载的目录或文件 打包后并不会保存在镜像中
docker commit 容器id 镜像名称:版本号
- 镜像转为压缩文件
docker save -o 压缩名称.tar 镜像名称:版本号
- 从压缩文件中 加载镜像
docker load -i 压缩名称.tar
9.2. Dockerfile
Dockerfile是一个文本文件 包含许多指令 每一条指令构建一层 基于基础镜像 最终构建出一个新的镜像
命令 | 说明 | 示例 | ||
---|---|---|---|---|
FROM | 基于这个Image开始 | FROM nginx:latest | ||
ENV | 环境变量 | ENV localfile /usr/local/nginx | ||
RUN | 新层中执行命令 | RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME’ | ||
LABEL | 设置metadata | LABEL version=”1.0” | ||
MAINTAINER | 维护者 (deprecated) | MAINTAINER ducafecat | ||
EXPOSE | 声明容器监听端口 | EXPOSE 80 443 | ||
ADD | 复制文件 | ADD ./dist ${foo}/html | ||
COPY | 复制文件 | COPY ./dist ${foo}/html | ||
ENTRYPOINT | 容器启动时执行指令 | CMD [“ls”] | ||
CMD | 容器启动时执行指令默认值 | CMD [“-la”] | ||
VOLUME | 挂载点 | VOLUME [“/data”] | ||
USER | 指定操作用户 | USER www | ||
WORKDIR | 设置工作目录 | WORKDIR /path/to/workdir | ||
ARG | 设置参数 | ARG user=www | ||
ONBUILD | 镜像被From时触发 | ONBUILD RUN /bin/bash -c ‘echo ONBUILD …’ | ||
STOPSIGNAL | 停止信号退出 | STOPSIGNAL SIGTERM | ||
HEALTHCHECK | 检查容器的健康状况 | HEALTHCHECK —interval=5m —timeout=3s CMD curl -f http://localhost/ | exit 1 | |
SHELL | 覆盖默认shell | SHELL [“powershell”, “-command”] |
9.2.1. 通过官方centos 自定义
- 创建dockerfile文件
FROM centos:7
MAINTAINER Iekr <Iekr_wh@qq.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
- 通过file文件build镜像
# docker buid -f dockerfile文件 -t 镜像名称:版本号 .
# 注意最后有一个 点
docker build -f ./my_dockerfile -t my_centos:1 .
- 运行容器
#docker run --name <容器名称> -d -p 8080:8080 <上一步构建的镜像名称>
docker run --name test -d -p 8080:8080 my_centos:1
9.2.2. Spring Boot dockerfile
FROM java:8
MAINTAINER iekr iekr_wh@qq.com
VOLUME /home/iekr
ADD Schoolelectricity-1.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Duser.timezone=GMT+8","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker build -t mystory .
docker run -d -p 8080:8080 mystory
第二个方案
docker run -id -p 8080:8080 openjdk:8-jre-alpine
#添加时区
apk add tzdata
#下载好复制时区过去 就可以了
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
nohup java -jar Schoolelectricity-1.0-SNAPSHOT.jar > /logs.log 2>&1 & #后台启动java
10. Docker Compose服务编排
微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,工作量会非常的大
Docker Compose是一个编排多容器分布式部署的工具 提供命令集管理容器化应用的完整开发周期,包括服务构建 启动 停止
- 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
- 创建 docker-compose.yml
# yaml 配置实例
version: '3'
services:
web: #自定义名称
build: . # builddockerfile
ports: #映射端口
- "5000:5000"
volumes: #映射目录
- .:/code
- logvolume01:/var/log
links: #当前容器可以访问下面的容器
- redis
redis: # 第二个容器
image: redis #容器名称
volumes:
logvolume01: {}
- 在当前目录 构建编写配置
docker-compose up #启动配置
docker-compose up -d # 后台启动
11. 私有仓库
服务端
docker pull registry
docker run -id --name=registry -p 5000:5000 registry
#访问 http://192.168.130.124:5000/v2/_catalog 如果出现{"repositories":[]}则安装成功
客户端
vim /etc/docker/daemon.json
#添加为私有仓库服务端地址
{"insecure-registries":["192.168.130.124:5000"]}
#重启docker服务
systemctl restart docker
上传前先给镜像打上标记
#docker tag 镜像名:版本号 私有仓库地址/镜像名:版本号
docker tag centos:7 192.168.130.124:5000/centos:7
上传
docker push 192.168.130.124:5000/centos:7
从仓库拉取镜像
docker pull 192.168.130.124:5000/centos:7
12. Docker Hub
登陆 输入账号和密码
docker login
镜像改名 以自己 用户名/镜像名 改
docker tag centos:7 iekr/centos:7
docker push iekr/centos:7
13. docker容器与虚拟机比较
14. 本地镜像导出和导入
使用export 和 import 将容器镜像导出和导入操作
14.1. 导出
docker export 镜像id > 压缩文件名.tar
docker export f299f501774c > hangger_server.tar
14.2. 导入
docker import - 自定义容器名称 < 镜像压缩文件.tar
docker import - new_hangger_server < hangger_server.tar
- export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
- save 保存镜像所有的信息-包含历史
- export 只导出当前的信息 只包含当前版本信息 无法回滚其他版本