前言:Docker概括
我们即将进入微服务阶段学习,微服务项目动辄就是几十台、上百台服务需要部署,有些大型项目甚至达到数万台服务。而由于每台服务器的运行环境不同,你写好的安装流程、部署脚本并不一定在每个服务器都能正常运行,经常会出错。这就给系统的部署运维带来了很多困难。
我们今天要学习的Docker技术。就是解决此问题的,有了Docker以后项目的部署如丝般顺滑,大大减少了运维工作量。
即便你对Linux不熟悉,你也能轻松部署各种常见软件、Java项目。
用一幅图标示如下:
Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。Docker服务部署应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并允许容器,应用就部署完成了。
一、常见命令
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/
拉取Nginx镜像
docker pull nginx
查看本地镜像列表
docker images
创建并运行Nginx容器
docker run -d --name nginx -p 80:80 nginx
查看容器
docker ps
docker ps -a
停止容器
docker stop nginx
再次启动容器
docker start nginx
进入Nginx容器
docker exec -it nginx bash
#退出容器
exit
删除容器
docker rm mysql
docker rm -f mysql
二、数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
docker volume create
创建数据卷
docker volume ls
查看所有数据卷
docker volume rm
删除指定数据卷
docker volume inspect
查看某个数据卷的详情
docker volume prune
清除数据卷
三、数据挂载
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
查看容器是否与宿主机挂载
docker inspect 容器名
Mounts目录下为如下结构则为挂载上了
1,准备好mysql的init目录和conf目录:
2,以及对应的初始化SQL脚本和配置文件:
其中,hm.cnf主要是配置了MySQL的默认编码,改为utf8mb4;而hmall.sql则是后面我们要用到的黑马商城项目的初始化SQL脚本。
3,我们直接将整个mysql目录上传至虚拟机的/root目录下:
4,创建并运行新mysql容器,挂载本地目录
# 2.进入root目录
cd ~
# 3.挂载本地目录
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
四、自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
案例:
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
也可以直接基于JDK为基础镜像,省略前面的步骤:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
五、网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
六、命令别名
给常用Docker命令起别名,方便我们访问:
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
然后,执行命令使别名生效
source /root/.bashrc