zoukankan      html  css  js  c++  java
  • Docker简单入门

    Docker

    1、什么是docker?

    • 是一个C/S架构的承载应用运行的平台软件

    2、为什么用docker

    • 解决应用运行环境配置的复杂性
    • 轻量级,内存占用低
    • 扩容方便,使用镜像部署效率高,只需要将程序及其所依赖的环境打包成镜像,即可在服务器上将程序及其运行环境一站式部署

    3、docker与虚拟机之间的区别

    4、docker核心架构

    • 镜像:一个镜像代表一个应用环境,他是一个只读的文件,如mysql镜像,tomcat镜像,nginx镜像等
    • 容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
    • 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
    • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
    • tar:一个对镜像打包的文件,日后可以还原成镜像

    5、Docker安装(CentOS7.X)

    Docker官网 下载链接 官方文档 练习play-with-docker

    1、卸载CentOS中老旧的Docker

    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    

    2、安装

    # 安装docker依赖
    	sudo yum install -y yum-utils device-mapper-persistent-data 1vm2
    # 配置yum依赖设置docker的yum源
    	sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repc
    # 安装最新版的docker
    	sudo yum install docker-ce docker-ce-cli containelrd.io
    # 启动docker
    	sudo systemctl start docker
    # 关闭docker
    	sudo systemctl stop docker
    # 测试docker安装
    	sudo docker run hello-world
    # 安装过程中 docker中报错 failure: repodata/repomd.xml from mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.pro
      解决方案
      https://blog.csdn.net/qq_18948359/article/details/102715729
    

    指定安装版本

    yum list docker-ce --showduplicates | sort -r

    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd. io

    sudo yum install docker-ce-18.09.5-3.e17 docker-ce-cli-18.09.5-3.e17 containerd.io

    6、配置阿里云镜像(加速镜像下载)

    执行命令添加阿里云镜像加速配置

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://uz579bhl.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    验证镜像加速是否生效

     docker info
    # 出现以下信息则配置成功
         Insecure Registries:
          127.0.0.0/8
         Registry Mirrors:
          https://uz579bhl.mirror.aliyuncs.com/
         Live Restore Enabled: false
    

    7、docker常用命令

    辅助命令

    # 查看版本
    	docker version
    # 查看详细信息
    	docker info
    # 指令帮助
    	docker --help
    

    images镜像命令

    # 查看镜像
        docker images 
        docker images -a
        docker images -q
    # 搜索镜像
    	docker search [options]
    	-s 指定值   列出收藏数不少于指定值的镜像
    	--no-trunce   显示镜像完整信息
    # 仓库下载镜像
    	docker pull 镜像名[:TAG|@DIGEST]
    # 删除镜像
    	docker rmi 镜像名
    	-f		强制删除
    

    container容器常用命令

    基本命令(容器外直接执行)

    # 运行一个容器
    	docker run	镜像
    	--name		为容器起一个别名
    	-p			端口映射
    	-d			守护进程的方式启动
    	例如:
    	docker run -it --name myNginx -p 80:80 nginx
    	docker run -d --name myNginx -P nginx
    # 查看运行中的docker容器
    	docker ps
    	-a			所有已运行过的容器
    	-q			静默方式,只显示容器编号
    # 停止|关闭|重启容器
        docker start 容器名字或者容器id
        docker restart 容器名或者容器id
        docker stop 容器名或者容器id
        docker kill 容器名或者容器id
    # 删除一个容器
    	docker rm -f 容器id或name
    # 删除所有容器
    	docker rm -f $(docker ps -aq)
    # 查看容器内进程
    	docker top 容器id或name
    # 查看容器内部细节
    	docker inspect 容器id	
    # 查看容器的运行日志
    	docker logs [OPTIONS] 容器id或容器名
    		-t			加入时间戳
    		-f			跟随最新的日志打印
    		--tail		数字显示最后多少条
    

    容器内数据交互命令

    # 1.进入容器内部
    	docker exec [options] 容器id 容器内命令
    	-i 以交互模式运行容器,通常与-t一起使用
    	-t分配一个伪终端
    	docker exec -it 容器id /bin/bash
    # 2.容器内安装软件
    	apt-get update
    	apt-get install 安装包名称
    # 3.修改容器内文件
    	修改文件内容使用 echo "内容" > 文件名
    # 4.退出容器
    	exit退出容器
    # 5.将容器打包为新的镜像
    	docker commit -a="作者名称" -m="描述信息" 容器ID 目标镜像名称:TAG
    # 6.从容器内复制文件到外部宿主机文件系统中
    	docker cp 容器id:容器内资源文件全路径  宿主机目标路径
    # 7.设置容器和宿主机共享目录(数据卷valueme)
    	docker run -it -v /宿主机的路径:/容器内的路径:ro(只读) 镜像名
    	注意:宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
    	运行 docker inspect 容器id 命令检查json串里有没有以下内容,如果有则证明卷挂载成功。
        例如:docker run -d -p 80:80 -v /root/test/:/usr/share/nginx/html:ro nginx
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/test",  // 主机数据源全路径
                "Destination": "/usr/share/nginx/html",   // 容器内目标路径
                "Mode": "ro",   // only read 只读
                "RW": false,
                "Propagation": "rprivate"
             }
         ]
    # 8.打包镜像
    	docker save 镜像名 -o 名称.tar
    # 9.载入镜像
    	docker load -i 名称.tar 
    

    8、docker镜像原理

    镜像是什么?

    镜像是一种轻量级的,能够独立执行的软件包,用来打包软件运行环境和基于运行环境开发的软件,包含软件运行所需要的所有内容,包括代码,库,环境变量以及配置文件。

    • UnionFS(联合文件系统):

    ​ Union文件系统是一种分层,轻量级并具高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

    镜像原理

    docker的镜像实际是由一层一层的文件系统组成
    • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs这一层与Linux/Unix系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
    • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
    • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的os,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
    为什么docker镜像要采用这种分层结构呢?

    最大的一个好处就是资源共享

    • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

    Docker中安装常用软件

    Docker与集群管理工具Swarm

    引言

    Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

    ☆docker可视化工具Portainer部署与汉化

    # 1、搜索镜像
    	docker search portainer
    # 2、下载最高start
    	docker pull portainer/portainer
    # 3、部署单机版仅本机能访问,命令如下
    	docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name prtainer-test portainer/portainer
    

    下载portainer汉化包 (提取码:6vjr)

    # 解压
    	tar -xvf public.tar
    # 将public移动到根目录
    	mv public /
    # 部署汉化版portainer
    	docker run -d -p 9000:9000 --restart=always  -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -v /public:/public --name prtainer-test  portainer/portainer
    

    安装mysql数据库

    # 1、安装mysql
    	docker pull mysql:TAG
    # 2、启动mysql
    	docker run --name 命名 -e MYSQL_ROOT_PASSWORD=密码 -d -p 3306:3306 mysql:TAG(版本)
    

    可能出现的问题

    官方参考

    # 3.进入mysq1容器
    	docker exec -it 容器名称|容器id bash
    # 4.外部查看mysq1日志
    	docker logs 容器名称|容器id
    # 5.使用自定义配置参数
    	docker run --name mysql -v /root/mysql/conf.d:/etc/mysq1/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysq1:TAG
    # 6.将容器数据位置与宿主机位置挂载保证数据安全
    	docker run --name mysql -p 3306:3306 -d -v /root/mysq1/data:/var/lib/mysql 
    	-v /root/mysq1/conf.d:/etc/mysq1/conf.d -e MYSQL_PASSWOT_PASSWORD=root mysql:TAG
    # 7.通过其他客户端访问如在window系统|macos系统使用客户端工具访问数据库
    # 8.将mysq1数据库备份为sq1文件
    	# 导出全部数据
    	docker exec 容器名|容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sq1 
    	# 导出指定库的数据
    	docker exec 容器名|容器id sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
    	# 导出指定库数据不要
    	docker exec 容器名|容器id sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
    # 9.执行sq1文件到mysq1中
    	docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' <  /root/文件名.sq1
    

    springboot中使用docker容器中的mysql数据库与正常使用无差别

    安装redis服务

    # 1、搜索镜像
    	docker search redis
    # 2、拉取下载
    	docker pull redis:TAG
    # 3、启动
    	docker -d -p 3306:3306 --name redis redis:TAG
    # 4、查看启动日志
    	docker logs -t -f 容器名|容器id
    # 5、进入容易内部操作
    	docker exec -it 容器名 /bin/bash
    # 5.挂载外部自定义配置启动redis容器
    	默认情况下redis官方镜像中没有redis.conf配置文件需要去官网下载指定版本的配置文件
    	1.wgethttp://download.redis.io/releases/redis-5.0.8.tar.gz下载官方安装包
    	2.将官方安装包中配置文件进行复制到宿主机指定目录中如/root/redis/redis.conf文件
    	3.修改需要自定义的配置
    	bind0.0.0.0开启远程权限
    	默认是rdb持久化模式
    	appenonly yes开启aof持久化,每秒同步一次
    	4.挂载自定义配置启动redis
    	docker run -v /root/myredis/conf:/usr/local/etc/redis --name myredis -d -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf  
    
    # 6.将数据目录挂载宿主机保证数据安全
    	docker run --name myredis -v /root/redis/data:/data -v /root/myredis/conf:/usr/local/etc/redis -d -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
    
    # 7、redis生成rdb快照指令:save
    

    springboot中使用redis

    1、引入操作redis依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    

    2、通过上述导入的依赖提供的RedisTemplete(操作对象)或者StringRedisTemplete(主要操作字符串)操作redis数据库,使用了模板方法设计模式。

    3、application.xml配置redis数据库,主机、端口、数据库

    4、注意点

    • RedisTemplete持久化对象时,目标对象需实现序列化接口
    • 设置键的序列化方式为Stirng的方式
    • 值的序列化方式一般设置为json序列化

    安装tomcat应用服务器

    # 搜索镜像
    	docker search
    # 拉取镜像
    	docker pull
    # 以用完即删的方式运行
    	docker run --rm 
    # 挂载tomcat的webapps目录到宿主机中运行
    	docker run --rm -d -p 8888:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:9.0
    # 复制docker容器中文件到宿主机
    	docker cp 容器id:容器中源路径 宿主机目标路径
    

    安装Mongo

    • 注意身份验证的问题

    安装ElasticSearch分布式搜索引擎

    • 拉取镜像

    • 配置linux虚拟机:配置JVM

    • 启动ElasticSearch

    • 安装IK分词器

    • 安装Kibana

    DockerFile

    什么是DockerFile?

    • 是Docker镜像的描述文件,是有一系列命令及参数构成的脚本,用来自定义镜像的构建文件。

    DockerFile文件解析过程

    注意:使用dockerfile构建自定义镜像时,最好在一个空目录下构建。

    构建指令

    # 指定路径
    	docker build -f /path/to/a/Dockerfile .
    # 当前路径
    	docker build -t shykes/myapp .
    

    DockerFile保留指令集

    构建第一个DockerFile

    # 1、创建DockerFile
    	touch Dockerfile
    # 2、编辑,保存,退出
    	vim Dockerfile
    	FROM centos
    # 3、构建
    	docker build -t 镜像命名 .
    # 4、查看
    	docker images
    

    指令语法

    FROM命令

    • 基于哪个镜像进行构建新的镜像,构建时都会自动从docker hub拉取base镜像作为Dockerfile的第一个指令出现
    • 语法:
    1 FROM <image>
    2 FROM <image>[:<tag>] 		使用版本不写为latest
    3 FROM <image>[@<digest>] 	使用摘要
    

    RUN命令

    • RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
    • 语法:
    1 RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    2 RUN echo hello
    3 
    4 RUN ["executable","param1","param2"](exec form)
    5 RUN ["/bin/bash","-c","echo hello"] # 指定bash执行命令
    RUN yum install vim
    RUN ["yum","install","vim"]
    

    EXPOSE命令(重要:外部与容器通信的通道)

    • 用来指定构建的镜像在运行为容器时对外暴露的端口
    • 语法:
    1 EXPOSE 80/tcp  # 不则默认使用tcp
    2 EXPOSE 80/udp
    

    CMD命令

    • 用来为启动的容器指定执行的命令,注意:在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
    • 语法:
    1 CMD ["executable","param1","param2"](exec form, this is the preferred form)
    2 CMD ["param1","param2"](as default parameters to ENTRYPOINT)
    3 CMD command param1 param2(shell form)
    

    WORKDIR命令

    • 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
    • 语法:
    1 WORKDIR /path/to/workdir
    2
    3 WORKDIR /a
    4 WORKDIR b
    5 WORKDIR C
    6 # 注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对
    

    ENV命令

    • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
    • 语法:
    1 ENV <key> <value>
    2 ENV <key>=<value> ...
    

    ADD命令(支持通配符)

    • 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
    • 语法:
    1 ADD hom* /mydir/ 					#通配符添加多个文件
    2 ADD hom?.txt /mydir/				#通配符添加
    3 ADD test.txt relativeDir/			#可以指定相对路径
    4 ADD test.txt /absoluteDir/		#也可以指定绝对路径
    5 ADD url
    

    COPY命令

    • 用来将context目录中指定文件复制到镜像的指定目录中
    • 语法:
    1 COPY src dest
    2 COPY ["<src>", ... "<dest>"]
    

    VOLUME命令

    • 用来定义容器运行时可以挂在到宿主机的目录,如果构建的时候没写,则不允许任何容器内数据被挂载
    • 语法:
    1 VOLUME ["/data"]
    

    Dockerfile构建springboot项目部署

    • 找一个能正常运行的springboot项目,使用maven的打包工具达成jar包

    • 将可运行的jar包上传到服务器中

    • 在Dockerfile中构建jar包的运行环境

      • 在服务器中编写Dockerfile

      •   FROM openjdk:8
          WORKDIR /testspring
          ADD testspring.jar /testspring
          EXPOSE 8989
          ENTRYPOINT ["java","-jar"]
          CMD ["testspring.jar"]
        
    • 构建镜像

      • docker build 名称 .
    • 运行镜像

      • docker run -d -p 8989:8989 --name test testspring:lastes
      • 注意:原项目中数据库连接地址url由localhost变更为指定路径,容器与容器之间是隔离的,使用localhost访问不到彼此之间的容器。
      • 解决方案:可以尝试把mysql构建在springboot程序运行环境中一同构建成为自定义镜像,避免更改所有数据库连接地址
    • 访问项目

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    linux输出信息调试信息重定向
    JDBC复习
    在Java中用for循环打印菱形
    深入.NET框架
    C#中等号左右的文本值交换
    使用集合组织相关数据
    深入类的方法
    值传递和引用传递专题案例
    深入C#数据类型
    Computer Vision Rescources
  • 原文地址:https://www.cnblogs.com/hhddd-1024/p/14508332.html
Copyright © 2011-2022 走看看