Docker

Docker

  • 安装
  • 配置镜像加速器
  • 容器部署
  • 容器创建
  • Dockerfile入门
  • 构建镜像

前言

  • 环境问题
    • 开发, 测试, 生产
    • 安装,环境变量
    • 环境版本冲突
  • 资源问题
    • JDK, C++, Python, PHP
    • 资源分配,资源冲突

Docker

简介

  • 容器化引擎/管理

  • 开源的容器引擎,它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可减少从编写到部署运行代码的周期。

  • 应用场景

    • Web 应用的自动化打包和发布。
    • 自动化测试和持续集成、发布。
    • 在服务型环境中部署和调整数据库或其他的后台应用。
    • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker架构

Docker_第1张图片

概念 说明
Docker daemon(Docker守护进程) Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可通过Docker客户端与之通信。
Client(Docker客户端 Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。
Images(Docker镜像) Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——我们使用系统安装光盘安装系统,同理,我们使用Docker镜像运行Docker镜像中的程序。
Container(容器) 容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。我们可通过Docker API或者CLI命令来启停、移动、删除容器。
Registry(仓库) Docker Registry是一个集中存储与分发镜像的服务。我们构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。此时,我们可借助Docker Registry来避免镜像的手动拷贝。一个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。

Docker入门

安装Docker步骤

  1. 上传 docker-ce-18.06.2.ce-3.el7.x86_64.rpm 到opt
  2. 执行命令:
    • yum install -y docker-ce-18.06.2.ce-3.el7.x86_64.rpm
  3. 查看docker是否安装成功, 执行命令:
    • docker info

配置Docker镜像加速器

  • 以阿里云为例, 注册登录阿里云账号并访问

    • https://cr.console.aliyun.com/#/accelerator
  • 配置镜像加速器

    • 通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,以下为linux指令

      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://yzb87oam.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
    • 查看是否配置成功

      • 输入指令 docker info
      • 查看倒数第二行是否是先前配置的镜像加速器

启动与停止docker

  • 启动
    • systemctl start docker
  • 停止
    • systemctl stop docker
  • 重启后台守护进程
    • systemctl daemon-reload
  • 查看docker状态
    • systemctl status docker

Docker的常用指令

镜像操作

搜索指令
  • 通过镜像仓库搜索
    • Docker镜像仓库网址:
      • https://hub.docker.com/search?q=&type=image
  • 通过指令搜索
    • docker search tomcat (以搜索tomcat为例)
下载镜像
  • docker pull 镜像名称:版本
    • 若不填:版本则默认最新版本
查看本地镜像
  • docker images
删除镜像
  • docker rmi 镜像名:版本号
  • docker rmi 镜像ID
保存镜像为文件
  • docker save -o 保存文件路径 镜像名:版本号
    • e.g. docker save -o /root/centos.tar centos:centos7
通过备份文件恢复镜像
  • docker load -i 镜像文件路径

容器操作

使用镜像新建容器
  • 创建并运行一个容器
    • docker run -dti --name=命名 镜像名:版本号 /bin/bash
      • -d 表示守护式容器
      • -i 运行容器
      • -t 交互 (后面跟交互shell脚本)
  • 创建一个有带端口映射的容器
    • docker run -di --name=命名 -p 宿主机端口:容器端口 镜像名:版本号
列出容器
  • 列出正在运行的容器
    • docker ps
  • 列出当前全部容器
    • docker ps -a
  • 列出当前容器的所有编号
    • docker ps -a -q
停止容器
  • docker stop 容器名或容器id
  • docker stop $(docker ps -q)
    • 批量停止容器
启动容器
  • docker start 容器名或容器id
强制停止容器
  • docker kill 容器名或容器id
重启容器
  • docker restart 容器名或容器id
进入到容器
  • docker exec -it 容器名 /bin/bash
退出容器
  • exit
宿主机下拷贝文件到容器
  • docker cp 文件路径 容器名:容器路径
宿主机下从容器拷贝文件到宿主机
  • docker cp 容器名:文件路径 宿主机路径
挂载宿主机的指定到容器
  • docker run -di --name=自定义命名 -v 容器下的目录 --privileged 容器名:容器版本
    • –privileged是可选的
    • 如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
删除容器
  • docker rm 容器名称或容器id
    • 注意
      • 不能删除正在运行中容器,需要停掉才可以删除
  • docker rm $(docker ps -a -q)
    • 批量删除容器
查看容器IP
  • docker inspect 容器名称
    • 输出的内容并较多
  • docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
    • 只输出ip
查看容器日志输出
  • docker logs 容器名称
  • docker logs --tail="2" n1
    • 查看日志 左后2行

Java开发者Docker常用镜像容器创建

JDK部署

  1. 拉去jdk镜像
    • docker pull java:8
  2. 创建JDK容器
    • docker run -di --name=jdk1 java:8
      • 说明:jdk安装的是openjdk,具体安装路径是:/usr/lib/jvm/java-1.8.0-openjdk-amd64
  3. 进入容器验证java环境
    • docker exec -it jdk1 /bin/bash
      • java -version

MySQL部署

  1. 拉取MySQL镜像

    • docker pull mysql:5.7
  2. 创建MySQL容器

    • docker run -d --name=mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=scwdb  mysql:5.7 
      
      • -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
      • -e MYSQL_ROOT_PASSWORD=123456 //表示设置root的密码为123456
      • -e MYSQL_DATABASE=scwdb //创建mysql数据库容器的同时初始化创建一个数据库 scwdb
      • 如上创建需要解决中文乱码问题乱码(默认是latin1)
    • 解决中文乱码问题

      1. 进入 mysql1 容器 修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf

        • 注意有offcn_mysql 容器中不能使用 vi 命令 ,所以我们将文件拷贝到宿主机后修改后在 拷贝回去
      2. 将文件拷贝到宿主机

        • docker cp mysql1:/etc/mysql/mysql.conf.d/mysqld.cnf /root/
      3. 修改配置文件 vi mysqld.cnf并保存

        • 找到[mysqld] 在其下添加 编码处理

          character-set-server=utf8
                   collation-server=utf8_general_ci
          
      4. 将修改后的文件从宿主机拷贝回容器

        • docker cp /root/mysqld.cnf mysql1:/etc/mysql/mysql.conf.d/mysqld.cnf
      5. 重启容器

        • docker restart mysql1

Redis部署

  1. 拉取Redis镜像
    • docker pull redis:4.0.8
  2. 创建Redis容器
    • docker run -di --name=redis1 -p 16379:6379 redis:4.0.8

Dockerfile入门

  • 一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
  • 作用
    • 对于开发人员
      • 可以为开发团队提供一个完全一致的开发环境
    • 对于测试人员
      • 可以直接拿开发时所构成的镜像后缀通过Dockerfile文件构建一个新的镜像开始工作
    • 对于运维人员
      • 在部署时,可以实现应用的无缝移植

Dockerfile常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条),可以在创建容器的时候传递参数给容器
RUN command 是Dockerfile的核心部分,执行系统指令(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
CMD 指定容器启动时运行的命令

自定义镜像

  • 创建前先创建容器
    • docker run -dti --name=centso1 centos:centos7 /bin/bash

自定义创建jdk镜像

  1. 创建一个目录:

    • mkdir /usr/local/dockerjdk
  2. 上传jdk-8u131-linux-x64.tar.gz到 /usr/local/dockerjdk/

  3. 创建一个Dockerfile文件,编辑并保存

    • vi Dockerfile

    • 内容如下

      FROM centos:centos7
      MAINTAINER danny
      RUN mkdir /usr/local/java
      ADD jdk-8u131-linux-x64.tar.gz  /usr/local/java/
      ENV JAVA_HOME /usr/local/java/jdk1.8.0_131
      ENV CLASSPATH $JAVA_HOME/lib
      ENV PATH $JAVA_HOME/bin:$PATH
      
  4. 创建镜像 为jdk1.8

    • docker build -t='jdk1.8' /usr/local/dockerjdk/
  5. 查看已经创建的镜像

    • docker images
  6. 使用自定义的镜像创建一个容器

    • docker run -di --name=java1 jdk1.8
  7. 查看创建的容器

    • docker ps
  8. 进入容器并验证自定义容器jdk环境是否正常

    • docker exec -it java1 /bin/bash
    • java -version

自定义创建tomcat镜像

  1. 创建目录

    • mkdir /usr/local/dockertomcat
  2. 上传jdk tomcat到目录中

  3. 创建Dockerfile,编辑并修改

    • vi DockerFile

    • 内容如下

      FROM centos:centos7
      MAINTAINER danny
      RUN  mkdir /usr/local/app
      ADD jdk-8u131-linux-x64.tar.gz /usr/local/app/
      ADD apache-tomcat-8.5.15.tar.gz /usr/local/app/
      ENV JAVA_HOME /usr/local/app/jdk1.8.0_131
      ENV CATALINA_HOME /usr/local/app/apache-tomcat-8.5.15
      ENV CLASSPATH $JAVA_HOME/lib
      ENV PATH $JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
      EXPOSE 8080
      CMD ["/usr/local/app/apache-tomcat-8.5.15/bin/catalina.sh","run"]
      
  4. 创建镜像

    • docker build -t='tomcat8.5:10' .
  5. 查看镜像

    • docker images
  6. 创建容器

    • docker run -di --name=tomcat1 -p 5555:8080 tomcat8.5:10
  7. 查看容器

    • docker ps
  8. 测试是否安装成功

    • 访问http://192.168.188.132:5555/

Maven Docker插件构建Docker镜像

1.开启DockerServer远程连接

  1. 编写docker配置文件

    • vi /usr/lib/systemd/system/docker.service
      
  2. 找到以ExecStart开头的行,改成

    • ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
      
  3. 刷新docker守护进程

    • systemctl daemon-reload
      
  4. 重启docker服务

    • systemctl restart docker
      
  5. 开启linux服务器的2375的防火墙端口

    • firewall-cmd --add-port=2375/tcp --permanent
      firewall-cmd --reload
      
  6. 测试远程连接是否可以

    • 服务ip+端口号(2375)/version

2.项目工程发布镜像规划

  • 注册中心搭建集群(其他模块相同)
    1. 模块mian文件下创建目录docker创建文件Dockerfile

      #1.依赖基础镜像
      FROM jdk1.8
      MAINTAINER danny
      ADD scw-register-*.jar /app.jar
      
      #配置环境变量,接收外部传递参数
      ENV PORT=""
      #注册中心地址
      ENV EUREKA=""
      #默认端口(可不写)
      EXPOSE 8888
      #配置容器启动后执行的命令
      ENTRYPOINT ["sh","-c","java -jar $PORT $EUREKA /app.jar"]
      
    2. application.yml注释以下代码支持集群(默认为true)

      #    register-with-eureka: false   #此EurekaServer不在注册到其他的注册中心
      #    fetch-registry: false         #不在从其他中心中心拉取服务器信息
      
      • 注册中心搭建集群
        • 注册中心 配置互相指向
        • 服务提供者和调用者 配置多个注册中心的地址
    3. 修改pom.xml支持Maven Docker插件

      <build>
          <plugins>
              <plugin>
                  <groupId>org.springframework.bootgroupId>
                  <artifactId>spring-boot-maven-pluginartifactId>
              plugin>
              <plugin>
                  <groupId>com.spotifygroupId>
                  <artifactId>docker-maven-pluginartifactId>
                  <version>0.4.13version>
                  <configuration>
                      <imageName>danny/scw-register:0.0.1imageName>
                      <dockerDirectory>${project.basedir}/src/main/dockerdockerDirectory>
                      
                      <dockerHost>http://192.168.188.132:2375dockerHost>
                      <resources>
                          <resource>
                              <targetPath>/targetPath>
                              <directory>${project.build.directory}directory>
                              <include>${project.build.finalName}.jarinclude>
                          resource>
                      resources>
                  configuration>
              plugin>
          plugins>
      build>
      

3.编译工程创建镜像

  1. 在虚拟机中配置java maven环境

    1. 服务器导入maven,jdk的压缩包,解压并复制到/user/local/下,重命名maven与jdk1.8

      • tar -xvf xxx.tar.gz -C /usr/local
        
    2. 配置maven,jdk环境变量

      1. 修改配置文件

        vi /etc/profile
        
      2. 内容如下

        # java
        export JAVA_HOME=/usr/local/jdk1.8
        export PATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
        # maven
        export MAVEN_HOME=/usr/local/maven
        export PATH=$MAVEN_HOME/bin:$PATH
        
      3. 使配置文件生效

        source /etc/profile
        
      4. 查看Maven版本号

        mvn -v
        
    3. 修改maven配置文件 settings.xml并保存

      • 在当前目录下的 maven-3.3/conf/settings.xml

      • 内容如下

        .....
           
        	<localRepository>E:/java/repolocalRepository>
        .....
          
          <mirrors>
        	<mirror>
              <id>alimavenid>
              <name>aliyun mavenname>
              <url>http://maven.aliyun.com/nexus/content/groups/public/url>
              <mirrorOf>centralmirrorOf>        
            mirror>
          mirrors>
        ...
         
         <profiles>
        	<profile>	
        		<id>jdk1.8id>
        		<activation>
        		<activeByDefault>trueactiveByDefault>
        		<jdk>1.8jdk>
        		activation>
        <properties>
        			<maven.compiler.source>1.8maven.compiler.source>
        			<maven.compiler.target>1.8maven.compiler.target>
        			<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
        		properties>
        	profile>
        profiles>
        .....
        settings>
        
  2. 执行编译打包构建docker镜像指令

    1. 创建目录/usr/local/dockersrc

    2. 将springboot项目整体clean并上传到Linux /usr/local/dockersrc

    3. 工具类打jar包,不用生成镜像,进入该模块目录

      • mvn clean install -Dmaven.test.skip
        
    4. 注册中心模块,生成镜像,进入该模块目录(其他模块相同)

      • mvn clean package -Dmaven.test.skip=true docker:build
        
    5. 查看镜像

      • docker images
        

4.搭建实际运行项目

  1. 创建docker网络

    • 本次需要创建一个用户自定义网络:

      1. Docker网格创建指令:

        docker network create mynet
        
      2. 查看docker网络指令:

        docker network ls
        
  2. 创建运行docker容器(两种方式推荐第二种)

    1. 可以直接在docker服务器端输入docker指令来创建镜像

      1. 注册中心1,容器创建指令:

        docker run -di --name=scw-register1 --network=mynet -e PORT="-Dserver.port=8761"  -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka" -p 8761:8761 danny/scw-register:0.0.1
        

        解释

        docker run            #创建容器指令
        -di                   # d守护式容器i 运行容器
        --name=scw-register1       # 容器名称
        --network=mynet      #容器加入用户自定义网络mynet
        PORT="-Dserver.port=8761"  #指定环境参数--Eureka注册中心服务启动监听端口
        #指定环境参数--Eureka注册中心地址(高可用架构)
        -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka" 
        -p 8761:8761         #容器端口号映射
        danny/scw-register:0.0.1   #镜像名称
        
      2. 注册中心2,容器创建指令:

        docker run -di --name=scw-register2 --network=mynet -e PORT="-Dserver.port=8762"  -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka" -p 8762:8762 danny/scw-register:0.0.1
        

        解释

        docker run            #创建容器指令
        -di                   # d守护式容器i 运行容器
        --name= scw-register2# 容器名称
        --network=mynet      #容器加入用户自定义网络mynet
        -e PORT="-Dserver.port=8762"  #指定环境参数--Eureka注册中心服务启动监听端口
        #指定环境参数--Eureka注册中心地址(高可用架构,互相指向对方)
        -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka" 
        -p 8762:8762         #容器端口号映射
        danny/scw-register:0.0.1   #镜像名称
        
      3. db1 数据库,容器创建指令: (注意创建容器后需要修改配置文件解决中文乱码问题)

        docker run -di --name=db1 --network=mynet  -p 3306:3306 -v /root/scwdb.sql:/docker-entrypoint-initdb.d/mysql.sql -v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=scwdb mysql:5.7
        

        解释

        docker run 
        -di 
        --name=db1 
        --network=mynet 
        -p 3306:3306
        -v /root/atcrowdfunding.sql:/docker-entrypoint-initdb.d/mysql.sql  #导入结构及数据 
        -v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf  #配置解决中文乱码问题
        -e MYSQL_ROOT_PASSWORD=root    #mysql数据库密码
        -e MYSQL_DATABASE=atcrowdfunding     #初始化mysql数据库
        mysql:5.7    #镜像名称
        
      4. myredis 缓存, 容器创建指令:

        docker run -di -p 6379:6379 --name=myredis --network=mynet  redis:4.0.8
        
      5. 其他模块同注册中心(web模块举例)

        docker run -di --name=scw-web --network=mynet -e PORT="-Dserver.port=10000" -e APPLICATION="-Dspring.application.name=SCW-WEB"  -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka,http://scw-register2:8762/eureka" -p 10000:10000 danny/scw-web:0.0.1
        
    2. 第二种方法: 也可以在idea使用docker插件来创建镜像

      1. idea安装docker插件

      2. idea打开docker插件(View->Tool Windows->Docker)

      3. 配置docker插件(setting->Build…->Docker->+)

        • name: docker
        • url: tcp://192.168.188.132:2375
        • 确认连接成功
      4. 使用docker插件(下方视图工具点击docker启动)

      5. 使用docker插件创建容器

        1. image下选择镜像右键创建容器

        2. 输入相关参数

          • Name

          • Server(选择连接的服务器)

          • ImageID(镜像名称)

          • Container name(容器名称)

          • Bind ports(端口映射)

            • 8761:8761
              
          • Environment variables(环境参数)

            • PORT

              • -Dserver.port=8761
                
            • EUREKA

              • -Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka
                
          • Run options(启动参数)

            • -di --network=mynet
              
        3. 配置端口映射

        4. 配置环境变量

          • PORT
          • EUREKA
        5. 运行创建容器

  3. 查看docker容器输出日志

    docker logs -f -t --tail 10 scw-register
    
  4. 测试运行

    • 访问:http://192.168.188.132:8761,查看注册中心

你可能感兴趣的:(Java,docker)