springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。
一、安装docker的指令
1.1 安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
补充:配置镜像源
注意:
yum安装是在线联网下载安装,而很多的资源在国外,会去国外的网站安装,速度会很慢,此时需要配置镜像源。
命令如下:
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun\/docker-ce/g'
yum makecache fast
1.2 安装docker
yum install -y docker-ce
说明:
-y 表示“遇到问题都选y”
1.3 启动docker
注意:
启动docker前,一定要关闭防火墙。
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
启动docker服务:
# 启动docker服务
systemctl start docker
# 查看状态
systemctl status docker
关于docker的一些其他指令:
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
docker -v #查看docker版本
1.4 配置docker镜像
以使用华为云的docker镜像加速器为例。
登录华为云账号(公司买的IAM用户,使用的是公司购买的华为云服务器)找到docker镜像服务。
先创建一个镜像配置文件:
# 使docker重新读取镜像库配置文件
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
说明:
每次修改daemon.json文件都要执行上面两个命令。
二、docker的基本操作
2.1 镜像的命令规范
镜像名称一般分为两部分:[repository]:[tag]
tag指镜像版本,若是没有该项则默认为最新版本的(lastest)。
2.2 docker的镜像操作
docker build构建镜像
docker pull 从镜像服务器拉取镜像
docker push 推送镜像到镜像服务器
docker img 查看镜像
docker rmi 删除镜像
docker save 保存镜像为一个压缩包
docker load 加载压缩包为镜像
例如:
三、容器相关命令
**docker run 创建容器(运行状态)
docker rm 删除容器(删除容器及硬盘上的文件)
docker pause 暂停容器(保留容器的内存及硬盘上的文件)
docker unpause 唤醒容器
docker stop 停止容器(删除容器的内存,保留硬盘上的文件)
docker start 启动容器
docker exec 进入容器执行命令
docker ps 查看所有运行的容器及状态
docker logs 查看容器运行日志
**
3.1 容器基本命令(创建、删除)
说明:
容器是与外界隔离的,任何人都无法访问。为了能使外部请求能够访问到容器, 需要暴露容器的端口(与宿主机端口关联)。
例如上图,nginx容器的端口为80,把容器端口与宿主机端口关联。当访问http://宿主机ip:80时,会把请求转发到nginx容器。
例如:
访问容器:
跟踪日志输出:
3.2 进入容器执行命令
创建一个容器后进行容器控制台:
3.2.1 案例1-修改nginx容器首页内容
从上图中可以看出,容器有自己的文件系统。
下面进行一个小案例来体验一下(修改nginx欢迎页内容):
找到index.html文件,
修改文件:
sed -i 's#Welcome to nginx#hello docker#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
注意:都不要重启docker服务。
查看效果:
3.2.2 案例2-使用redis容器
docker run --name redis-docker -p 6379:6379 -d redis redis-server --appendonly yes
说明:
“–appendonly yes”执行可持支aof持久化。
创建docker后可以用redis desktop Mamager连接:
进入容器的控制台进行操作:
也可以直接进入redis的客户端:
查看效果:
四、数据卷命令
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。且不同的容器可以共享同一个数据卷(适用于集群)。
实例-创建一个数据卷并查看它在宿主机上的位置:
4.1 案例1-使用数据卷修改nginx首页内容
docker run --name nm -p 80:80 -v html:/usr/share/nginx//html -d nginx
说明:
-v 是使用数据卷(注意:如果-v 指定的数据卷html不存在会自动新建)
编辑index.html文件:
效果:
4.2 案例2-创建一个MySQL容器,将宿主机目录直接挂载到容器
五、Dockerfile自定义镜像
5.1 镜像结构
以MySQL镜像为例。
5.2 Dockerfile
Dockerfile是一个文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
第一行必须是FROM,从一个基础镜像来构建。
说明:
(1)EXPOSE指令后的端口后用于docker run的-p参数后的端口值。
5.3 案例-基于Ubuntu构建一个运行java项目的新镜像
创建前的资源如下:
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
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app/jar
执行创建镜像指令:
docker build -t javaweb:1.0 .
说明:
上述指令最后的"."表示Dockerfile所在目录。
效果如下:
补充:简化Dockerfile
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷到jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
# 安装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
# 前面的命令在安装基础镜像和JDK,每次都写很重复
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app/jar
如上,安装前几层(基础镜像和jdk)的步骤可以单独打包。
事实上,有一个名为java:8-alpine的镜像,基于它,可以将一个Java项目构建为镜像。
Dockerfile简化如下:
# 指定基础镜像
FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app/jar
六、DockerCompose
Docker Compose可以基于Compose文件帮我们快速地部署分布式应用,而无需手动一个个创建和运行容器。
Compose文件是个文本文件,通过指令(其实是把docker run和docker-build指令转换了一下)定义集群中的每个容器如何运行。
Compose文件示例如下:
6.1 DockerCompose安装
(后续补充)
6.2 部署微服务集群
(后续补充)
七、Docker镜像仓库(搭建企业私有镜像)
(后续补充)