介绍和安装
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
几个概念:
- 镜像(image):Docker将应用程序及其所需要的依赖、函数库等打包在一起,即为镜像。
- 容器:镜像中的应用程序运行后形成的进程。
- Docker Registry:镜像托管平台,如DockerHub,网易云镜像服务,阿里云镜像服务。
docker架构:
安装
可以先选择卸载:
- yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-selinux \
- docker-engine-selinux \
- docker-engine \
- docker-ce
安装存储驱动等:
- yum install -y yum-utils \
- device-mapper-persistent-data \
- lvm2 --skip-broken
设置docker仓库:
- # 设置docker镜像源
- yum-config-manager \
- --add-repo \
- https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
- yum makecache fast
安装社区版docker:
- yum install -y docker-ce
启动
- # 关闭防火墙
- systemctl stop firewalld
- # 禁止开机启动防火墙
- systemctl disable firewalld
- # 启动docker服务
- systemctl start docker
- # 停止docker服务
- systemctl stop docker
- # 重启docker服务
- systemctl restart docker
- # 查看docker版本
- docker -v
镜像加速
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
Docker基本操作
镜像操作
一些简单的操作:
- # 查看镜像
- docker images
- # 删除镜像
- docker rmi
- # 拉取镜像
- docker pull
- # 推送镜像到Docker Registry
- docker push
- # 保存镜像为tar包
- docker save
- # 加载tar包为镜像
- docker load
- …………
命令有很多,不必记忆,勤用
- --help
例如:
- docker images --help
容器操作
一些简单的容器操作:
- # 创建容器
- docker run
- # 进入容器
- docker exec
- # 查看容器日志(添加-f可以持续查看)
- docker logs
- # 查看容器
- docker ps
- # 删除容器
- docker rm
- …………
数据卷操作
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。
- docker volume [COMMAND]
create 创建数据卷inspect 显示一个或多个数据卷的信息ls 列出所有数据卷prune 删除未使用数据卷rm 删除一个或多个数据卷
后文练习123帮助理解。
Dockerfile
很多时候需要自己构建镜像,构建镜像需要写Dockerfile。
镜像结构
首先介绍镜像结构,镜像是应用程序及其所需要的系统函数库、环境、配置、依赖一层一层构建出来的,以mysql为例:
底层是系统函数库(例如Ubuntu),这一层也叫做基础镜像(BaseImage),相当于地基。
然后在地基上添加安装包,配置环境变量、配置、依赖等等。
最后需要提供一个入口(Entrypoint),也就是程序启动的脚本和参数。
Dockerfile
Dockerfile是一个文本文件,名为Dockerfile,没有后缀,其中包含一些指令,每一个指令就是一层。
常用指令:
写好Dockerfile后使用
- docker build
命令构建镜像
详见练习4
Docker-Compose
若是部署微服务集群,一个个docker去构建会很繁琐,所以需要DOcker-Compose。
DockerCompose基于Compose文件快速部署分布式应用,无需手动一个个的创建和运行。
Compose文件也是一个文本文件,通过指令定义集群中的每个容器如何运行。
安装
- # 下载docker-compose
- curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- # 添加执行权限
- chmod +x /usr/local/bin/docker-compose
- # 下载自动补全
- curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
基本命令
- # 后台启动当前项目 也可以指定服务
- docker-compose up -d
- # 查看项目容器
- docker-compose ps
- # 停止容器运行 可以指定服务
- docker-compose stop
- # 停止并删除容器 可以加参数来删除镜像、数据卷等
- docker-compose down
- # 持续查看日志
- docker-compose logs -f
- # 构建或重新构建镜像 可以指定服务
- docker-compose build
- …………
和docker操作差不多
Docker 私 服搭建
搭建一个docker 私 服。
docker-compose.yml:
- version: '3.0'
- services:
- registry:
- image: registry
- volumes:
- - ./registry-data:/var/lib/registry
- ui:
- image: joxit/docker-registry-ui:static
- ports:
- - 5000:80
- environment:
- - REGISTRY_TITLE=docker私 服
- - REGISTRY_URL=http://registry:5000
- depends_on:
- - registry
存放镜像的目录得准备好。
还得给docker设置信任地址。
我们的私 服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
- # 打开要修改的文件
- vi /etc/docker/daemon.json
- # 添加内容:
- "insecure-registries":["http://yourip:port"]
- # 重加载
- systemctl daemon-reload
- # 重启docker
- systemctl restart docker
然后就可以
docker-compose up -d
启动
访问ip+端口,成功:
上传一个镜像试试:
- # 标记镜像,归入私 服,有格式要求,名称前缀为私 服地址
- docker tag nginx:latest xxx:xxx/nginx:1.0
- # 推送
- docker push xxx:xxx/nginx:1.0
- # 拉取
- docker pull xxx:xxx/nginx:1.0
练习
练习1:save和load
打包镜像:
- docker save -o mynginx.tar nginx:latest
加载镜像:
- docker load -i mynginx.tar
练习2:docker部署nginx
- # 拉取
- docker pull nginx
- # 启动
- docker run --name mynginx -p 8080:80 -d nginx
- # -p 后面的端口 左边是宿主机 右边是容器
- # -d 后台运行
此时访问宿主机的8080端口即可访问到nginx服务。
问题:修改主页
方式一:进入容器修改/usr/share/nginx/html/index.html文件(这个路径dockerhub的nginx镜像官方文档中可以找到)
- # 进入容器
- docker exec -it mynginx bash
- # -it 给当前进入的容器创建一个标准输入输出的终端,允许我们与容器交互
- # bash 进入容器执行的命令
- # 因为没有vi等文本编辑器,所以使用替换命令
- sed -i 's#Welcome to nginx#替换#g' index.html
- sed -i 's#<head>#</head><meta charset="utf-8">#g' index.html
这种方式明显是有很大局限性的!容器和数据耦合度非常高,操作繁琐不说,数据也不可复用,维护也非常困难。
方式二:将数据卷挂载到/usr/share/nginx/html目录。
- # 强行删除容器
- docker rm -f mynginx
- # 准备一个目录
- mkdir -p /tmp/nginx/html
- # 启动
- docker run --name mynginx -v /tmp/nginx/html:/usr/share/nginx/html -p 8080:80 -d nginx
- # -p 后面的端口 左边是宿主机 右边是容器
- # -d 后台运行
- # -v 数据卷挂载 左边是宿主机目录 右边是容器
这样 就可以把数据和容器解耦了。
练习3:部署MySQL
- # 拉取镜像(先去dockerhub看看镜像名和版本)
- docker pull mysql:5.7.25
- # 准备存放数据和配置的数据卷
- mkdir -p /tmp/mysql/data
- mkdir -p /tmp/mysql/conf
准备mysql配置文件后缀是.conf例如my.conf,内容如下:
- [mysqld]
- skip-name-resolve
- character_set_server=utf8
- datadir=/var/lib/mysql
- server-id=1000
- # 启动mysql
- docker run \
- --name mysql \
- -e MYSQL_ROOT_PASSWORD=123456 \
- -p 3306:3306 \
- -v /tmp/mysql/conf:/etc/mysql/conf.d \
- -v /tmp/mysql/data:/var/lib/mysql \
- -d \
- mysql:5.7.25
- # -e 后面表示这个容器的环境变量 这里我们将环境变量MYSQL_ROOT_PASSWORD赋值为123456
- # -p 端口 左宿主 右容器
- # -v 数据卷挂载
- # -d 后台运行
这里面的一些数据是需要取看官方文档的,例如环境变量、配置文件目录等。
练习4:基于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 .
- # -t 表示后面是 name:tag
- #. 表示Dockerfile所在的目录 . 表示当前目录
- # 启动容器
- docker run --name web -p 8090:8090 -d javaweb:1.0
问题 层数太多,每次都要安装jdk
这样做有缺陷,有很多层都用来做安装jdk了:
- # 指定基础镜像
- FROM ubuntu:16.04
- # 配置环境变量,JDK的安装目录
- ENV JAVA_DIR=/usr/local
- # 拷贝jdk
- 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
所以改进后:
- # 指定基础镜像
- FROM java:8-alpine
- # 拷贝项目
- COPY ./docker-demo.jar /tmp/app.jar
- # 暴露端口
- EXPOSE 8090
- # 入口,java项目的启动命令
- ENTRYPOINT java -jar /tmp/app.jar
练习5:部署微服务集群
部署之前的cloud-demo。
修改cloud-demo中的配置,nacos和mysql的地址改为docker-compose中的服务名,例如:
- spring:
- datasource:
- url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
- application:
- name: orderservice
- cloud:
- nacos:
- server-addr: nacos:8848
打包,然后写对应的Dockerfile,例如:
打包有个小坑 如果之前feign-api这个公共模块是创建的spring项目而不是maven项目,那么会order-service打包失败,换一个打包插件就好:
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
然后install一下这个模块就行。
- FROM java:8-alpine
- COPY ./app1.jar /tmp/app.jar
- ENTRYPOINT java -jar /tmp/app.jar
完成后:
编写docker-compose.yml:
- version: "3.2"
- services:
- nacos:
- image: nacos/nacos-server
- environment:
- MODE: standalone
- ports:
- - "8848:8848"
- mysql:
- image: mysql:5.7.25
- environment:
- MYSQL_ROOT_PASSWORD: 123
- volumes:
- - "$PWD/mysql/data:/var/lib/mysql"
- - "$PWD/mysql/conf:/etc/mysql/conf.d/"
- userservice:
- build: ./user-service
- orderservice:
- build: ./order-service
- gateway:
- build: ./gateway
- ports:
- - "10010:10010"
启动docker-compose
- docker-compose up -d
- # 后台运
- docker-compose logs -f
- # 持续查看日志
问题:微服务注册失败
原因:nacos启动慢,微服务启动时nacos还没有启动完成。
解决:重启指定微服务,下次部署时先部署好nacos,使用depends_on也不行不知道啥问题。
- docker-compose restart gateway userservice orderservice
- # 重启指定服务
- docker-compose logs -f
- # 持续查看日志
到此这篇关于Docker(黑马spring cloud笔记)详解的文章就介绍到这了,更多相关Docker内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/yangsf_/article/details/128707602