• docker技术简介


    目录

    概念

    命令

    数据卷

    DockerFile

    应用部署

    服务编排

    私有仓库


    概念

    Docker 是一个开源的应用容器引擎,而容器技术是一种轻量级虚拟化方案(虚拟机太繁重了不够轻量级),Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。实现快速分发部署
    • 更快的交付和部署
    • 更高效的利用资源
    • 更轻松的迁移和扩展
    • 更轻松的管理和更新
    • 解决异构环境

    不同的虚拟机隔离的关键部分在于他们彼此有各自独立的磁盘、主机名、ipc、pid、网络、用户等,然而进程之间在内存的使用上天生就是彼此隔离的,因此通过技术手段让一个进程的网络空间、硬盘空间、pid等与其他进程隔离开, 这种技术就是docker,启动一个容器就是启动一个进程,该进程有自己的root文件系统,同时也有自己独立的“操作系统”(操作系统被制作成镜像放到进程里,镜像是由特殊的文件系统叠加而成,最底端是 bootfs,并使用宿主机的bootfs),其中docker三大核心技术:namespace名称空间实现容器之间空间和资源隔离,cgroup机制对cpu磁盘内存资源进行限制分配,UnionFS联合文件系统实现多个容器进程共享同一份镜像(rootfs镜像),而不是像传统虚拟机每台vm都有一个操作系统

    docker中有三个核心概念,镜像,容器,仓库

    1、Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。

    2、镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等

    3、用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。

    命令

    安装

    1. #更新yum源
    2. curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    3. wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
    4. # 清除rpm包及header
    5. yum clean all
    6. # 重新缓存远端服务器rpm包信息
    7. yum makecache
    8. #添加阿里云镜像加速器
    9. mkdir -p /etc/docker
    10. tee /etc/docker/daemon.json <<-'EOF'
    11. {
    12. "registry-mirrors": ["https://qi3pe2qe.mirror.aliyuncs.com"]
    13. }
    14. EOF
    15. systemctl daemon-reload
    16. #安装并启动
    17. yum install docker-ce -y
    18. [root@docker01 ~]# systemctl start docker
    19. [root@docker01 ~]# systemctl enable docker

    Docker 进程相关命令

    1. #启动docker服务
    2. systemctl start docker
    3. #停止docker服务:
    4. systemctl stop docker
    5. #重启docker服务:
    6. systemctl restart docker
    7. #查看docker服务状态:
    8. systemctl status docker
    9. #设置开机启动docker服务:
    10. systemctl enable docker

    Docker 镜像相关命令 

    1. #查看镜像: 查看本地所有的镜像
    2. docker images
    3. docker image ls
    4. docker images –q # 查看所用镜像的id
    5. #搜索镜像:从网络中查找需要的镜像
    6. docker search 镜像名称
    7. #拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
    8. docker pull 镜像名称
    9. #删除镜像: 删除本地镜像
    10. docker rmi 镜像id # 删除指定本地镜像
    11. docker rmi `docker images -q` # 删除所有本地镜像
    12. docker push 镜像id #上传镜像
    13. docker load -i docker_nginx.tar.gz #将包导入镜像
    14. docker save centos:7 -o docker_centos7.tar.gz #将镜像导出到包
    15. docker tag 镜像id 镜像标签 #给镜像打标签

    Docker 容器相关命令

    1. docker ps # 查看正在运行的容器
    2. docker ps –a # 查看所有容器
    3. #创建并启动容器
    4. docker run [参数] [镜像名称] [运行容器的启动命令]
    5. • -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
    6. • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
    7. • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
    8. • -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
    9. • --name:为创建的容器命名。
    10. • -p:指定端口映射。
    11. • -v:给容器挂载数据卷。
    12. docker run -d -p 10.0.0.7:80:80 nginx
    13. docker run -it -v /root/test:/root centos7
    14. docker exec 参数 [容器名称|id] [cmd]# 进入容器,退出时不会关闭
    15. docker stop 容器名称 #停止容器
    16. docker start 容器名称 #启动容器
    17. docker rm 容器名称 #删除容器
    18. docker inspect 容器名称 #查看容器信息
    19. docker commit [容器名称|id] 保存名称:版本 #保存容器成镜像
    20. docker export [容器id] > [包名称] #保存容器为镜像包

     

    数据卷

    数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,数据卷作用是容器数据持久化,外部机器和容器间接通信,容器之间数据交换
    一个数据卷可以被多个容器同时挂载
    一个容器也可以被挂载多个数据卷
    1. docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
    2. docker run –it --name=c3 –v /volume centos:7 /bin/bash
    3. docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
    4. docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash

    应用部署

    部署mysql:先拉取镜像,基于mysql镜像创建容器 ,再映射一下端口,即可从外部机器访问宿主机,从而间接访问容器的服务

    1. docker run -id \
    2. -p 3307:3306 \ #将容器的 3306 端口映射到宿主机的 3307 端口
    3. --name=c_mysql \
    4. -v $PWD/conf:/etc/mysql/conf.d \
    5. -v $PWD/logs:/logs \
    6. -v $PWD/data:/var/lib/mysql \ #将主机当前目录下的data目录挂载到容器的/var/lib/mysql。数据目录
    7. -e MYSQL_ROOT_PASSWORD=123456 \ #初始化 root 用户的密码
    8. mysql:latest
    9. docker exec –it c_mysql /bin/bash #进入容器,操作mysql

    部署tomcat:拉取tomcat镜像,创建容器,设置端口映射、目录映射

    1. cd ~/tomcat
    2. docker run -id --name=c_tomcat \
    3. -p 8080:8080 \ #将容器的8080端口映射到主机的8080端口
    4. -v $PWD:/usr/local/tomcat/webapps \ #将主机中当前目录挂载到容器的webapps
    5. tomcat

    部署nginx:拉取nginx镜像,创建容器,设置端口映射、目录映射

    1. cd ~/nginx/conf
    2. vim nginx.conf
    3. ...
    4. docker run -id --name=c_nginx \
    5. -p 80:80 \
    6. -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
    7. -v $PWD/logs:/var/log/nginx \
    8. -v $PWD/html:/usr/share/nginx/html \
    9. nginx

    部署redis:拉取redis镜像,创建容器,设置端口映射,使用外部机器连接redis,

    ./redis-cli.exe -h 192.168.149.135 -p 6379

    1. docker pull redis:5.0
    2. docker run -id --name=c_redis -p 6379:6379 redis:5.0

    DockerFile

    dockerfile包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像,对于开发人员:可以为开发团队提供一个完全一致的开发环境,对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件 构建一个新的镜像开始工作了,对于运维人员:在部署时,可以实现应用的无缝移植

    1. #发布springboot项目案例
    2. FROM java:8 #定义父镜像
    3. MAINTAINER cqq #定义作者信息
    4. ADD springboot.jar app.jar #将jar包添加到容器
    5. CMD java –jar app.jar #定义容器启动执行的命令
    6. docker bulid –f dockerfile文件路径 –t 镜像名称:版本 #通过dockerfile构建镜像

    服务编排

    按照一定的业务规则批量管理容器
    微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,因此需要服务编排来管理container, Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。可以快速部署分布式应用,无需一个个微服务去构建镜像和部署。使用步骤:
    1. 利用 Dockerfile 定义运行环境镜像
    2. 使用 docker-compose.yml 定义组成应用的各服务
    3. 运行 docker-compose up -d启动应用

     

    1. #环境镜像
    2. FROM java:8-alpine
    3. COPY ./app.jar /tmp/app.jar
    4. ENTRYPOINT java -jar /tmp/app.jar
    1. #docker-compose.yml
    2. version: "3.2"
    3. services:
    4. nacos:
    5. image: nacos/nacos-server
    6. environment:
    7. MODE: standalone
    8. ports:
    9. - "8848:8848"
    10. mysql:
    11. image: mysql:5.7.25
    12. environment:
    13. MYSQL_ROOT_PASSWORD: 123
    14. volumes:
    15. - "$PWD/mysql/data:/var/lib/mysql"
    16. - "$PWD/mysql/conf:/etc/mysql/conf.d/"
    17. userservice:
    18. build: ./user-service
    19. orderservice:
    20. build: ./order-service
    21. gateway:
    22. build: ./gateway
    23. ports:
    24. - "10010:10010"

     

    私有仓库

    除了官方仓库https://hub.docker.com,我们还可以搭建自己的私有仓库来存储和管理自己的镜像

    1. # 1、拉取私有仓库镜像
    2. docker pull registry
    3. # 2、启动私有仓库容器
    4. docker run -id --name=registry -p 5000:5000 -v registry-data:/var/lib/registry registry
    5. # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
    6. # 4、修改daemon.json使得私服被Docker信任 
    7. vim /etc/docker/daemon.json    
    8. # 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
    9. "insecure-registries":["10.0.0.31:8083"]
    10. # 5、重启docker 服务
    11. systemctl daemon-reload
    12. systemctl restart docker
    13. docker start registry

    使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

    1. version: '3.0'
    2. services:
    3. registry:
    4. image: registry
    5. volumes:
    6. - ./registry-data:/var/lib/registry
    7. ui:
    8. image: joxit/docker-registry-ui:static
    9. ports:
    10. - 8083:80
    11. environment:
    12. - REGISTRY_TITLE=cqq的私有仓库
    13. - REGISTRY_URL=http://registry:5000
    14. depends_on:
    15. - registry

     

     上传、拉取镜像

    1. # 1、标记镜像为私有仓库的镜像,推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀    
    2. docker tag nginx:latest 10.0.0.31:5000/nginx:1.0
    3. # 2、上传标记的镜像    
    4. docker push 10.0.0.31:5000/nginx:1.0
    5. #拉取镜像
    6. docker pull 私有仓库服务器ip:5000/nginx:1.0

  • 相关阅读:
    nodejs项目实例医生预约平台宠物医院预约挂号网
    面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗?
    Linux 回顾总结
    Shadowing Japanese 中上 Unit 1
    还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
    Java集合知识点速查(JDK8)
    JVM基础(4)- JMM:java内存模型与线程安全
    Pytorch量化感知训练
    ROS安装
    rabbit start 启动和 detached 启动区别
  • 原文地址:https://blog.csdn.net/roycer1/article/details/128017636