Docker

如果一件事足够重要

即使成功率不高

你还是应该去做

一、Docker介绍

核心:docker是一种容器技术,把写好的代码和要运行的环境一起打包,解决软件跨环境迁移的问题。

二、安装Docker

官网

安装命令

bash 复制代码
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manage --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、安装docker
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v

三、Docker架构

  • 镜像(image):Docker镜像,就相当于是一个root文件系统。就像是一个一个打包好的软件包。

  • 容器(container):镜像和容器的关系就像是java里的类和对象的关系。镜像是静态的定义,容器是运行的实体。容器可以被创建、启动、停止、删除、暂停。

  • 仓库(repository):仓库可以看成一个代码控制中心,用来保存各种镜像文件,你需要就从仓库里去获取。

四、配置镜像加速器

直接在控制台输入下列代码,配置阿里云镜像加速器

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

五、Docker命令

Docker服务相关命令

bash 复制代码
# 启动docker命令
systemctl start docker

# 停止docker命令
systemctl stop docker

# 查看docker服务状态
systemctl status docker

# 重启docker服务
systemctl restart docker

# 设置开机启动docker服务
systemctl enable docker

Docker镜像相关命令

bash 复制代码
# 查看本地所有镜像
docker images

# 从网络中查找需要的镜像
docker search 镜像名称

# 从镜像仓库拉取镜像到本地
docker pull 镜像名称:TAG

# 删除镜像
docker rmi 镜像名称

其中TAG的版本可以从docker hub找

传送门

Docker容器相关命令

bash 复制代码
# 查看正在运行的容器
docker ps 

# 查看所有容器
docker ps -a

# 创建并启动容器
docker run 参数

参数说明:
- -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器,退出容器后,容器自动关闭
- -t:为容器重新分配一个伪输入终端。
- -d:以守护(后台)模式运行容器。
- --name:为创建的容器命名

# 进入容器
docker exec 参数 # 退出容器,容器不会关闭

# 停止容器
docker stop 容器名称

# 启动容器
docker start 容器名称

# 删除容器
docker rm 容器名称

# 查看容器信息
docker inspect 容器名称

六、Docker容器数据卷

数据卷的概念及作用

数据卷的概念:

  • 数据卷是宿主机中的一个目录或文件

  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步

  • 一个数据卷可以被多个容器同时挂载

  • 一个容器也可以被挂在多个数据卷

数据卷的作用

  • 容器数据持久化

  • 外部机器和容器间接通信

  • 容器之间数据交换

配置数据卷

bash 复制代码
# 创建启动容器时,使用 -v参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)

注意事项
1. 目录必须是绝对路径
2. 如果目录不存在,则会自动创建
3. 可以挂在多个数据卷 

七、Dockerfile

Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成

  • 最底层是bootfs,并使用宿主机的bootfs

  • 第二层是root文件系统rootfs,称为base image

  • 然后再往上可以叠加其它的镜像文件

  • 一个镜像可以放在另一个镜像上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像

  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

思考题

  1. Docker镜像的本质是什么?

是一个分层文件系统

  1. Docker中一个Centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?

Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其它镜像层

  1. Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70MB呢?

由于Docker中镜像是分层的,tomcat虽然只有70多MB,但它需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小有500MB

容器转为镜像

第一种方式
bash 复制代码
# 将改变过的容器打成一个镜像
docker commit 容器id 镜像名称:版本号

# 将整个镜像打成tar包,可传输
docker save -o 压缩文件名称 镜像名称:版本号

# 到了另外的机子,将这个tar包加载成镜像
docker load -i 压缩文件名称
第二种方式

使用Dockerfile构建

  • Dockerfile是一个文本文件

  • 包含了一条条的指令

  • 每一条指令构建一层,基于基础镜像,最终构建处一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境

  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了

Dockerfile打包springboot项目

需求

定义dockerfile,发布springboot项目

实现步骤

  1. 定义父镜像:FROM java:8

  2. 定义作者信息:MAINTAINER xxx<xxx@xxx.cn>

  3. 将打包好的springboot的jar包添加到容器中:ADD xxx.jar

  4. 定义容器启动执行的命令:CMD java -jar xxx.jar

  5. 通过dockerfile构建镜像:docker build -dockerfile 文件路径 -t 镜像名称:版本

示例:

bash 复制代码
# touch /home/springboot_dockerfile
FROM JAVA:8
MAINTAINER li<li@li.com>
ADD springboot.jar app.jar
CMD java -jar app.jar

# 转为镜像
docker build -f dockerfile /home/springboot_dockerfile app:1.0


# 启动,注意,如果soringboot项目有端口映射要主要映射出端口
docker run -id -p 8080:8080 app
Dockerfile自定义centos

需求

自定义centos镜像,要求:

  1. 默认登录路径为/usr

  2. 可以使用vim

实现步骤

bash 复制代码
# touch /home/my_centos7_dockerfile 
FROM centos:7 
MAINTAINER li<li@li.com> 
RUN yum install -y vim
WORKDIR /usr 
CMD /bin/bash  

# 转为镜像 
docker build -f dockerfile /home/my_centos7_dockerfile my_centos:1.0   
# 启动
docker run -it --name=mycnetos7 my_centos:1.0  

八、Dcoker compose

概述

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:

  1. 利用 Dockerfile定义运行环境镜像

  2. 使用 docker-compose.yml 定义组成应用的各服务

  3. 运行 docker-compose up 启动应用

Docker compose安装使用

安装docker compose

bash 复制代码
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

卸载docker compose

bash 复制代码
rm /usr/local/bin/docker-compose

使用docker compose 编排nginx+springboot项目

bash 复制代码
# 1. 创建项目目录 
mkdir -p /home/dockerCompose

# 2. 创建Nginx配置文件, touch nginx.conf
events {}  
http {   
    server {     
        listen 80;      

        location / {       
            proxy_pass http://springboot:8080;       
            proxy_set_header Host $host;       
            proxy_set_header X-Real-IP $remote_addr;     
        }   
    }
}

# 3. 创建Dockerfile,touch myapp_dockerfile
FROM openjdk:8-jdk-alpine  
COPY target/myapp.jar /app/myapp.jar  
WORKDIR /app  
CMD ["java", "-jar", "myapp.jar"]


4. 创建docker-compose.yml文件
version: '3'  
services:   
    nginx:     
        image: nginx     
    ports:       
        - 80:80     
    volumes:       
        - ./nginx.conf:/etc/nginx/nginx.conf:ro    

    springboot:     
        build:       
            context: .       
            dockerfile: myapp_dockerfile
        ports:       
            - 8080:8080     
        volumes:       
            - ./target:/app

5. 构建和启动项目
docker-compose up --build
相关推荐
荆州克莱2 小时前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
m0_741768856 小时前
使用docker的小例子
运维·docker·容器
最新小梦9 小时前
Docker日志管理
运维·docker·容器
nbsaas-boot10 小时前
微服务之间的安全通信
安全·微服务·架构
千禧年@10 小时前
微服务以及注册中心
java·运维·微服务
ZHOU西口10 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
Xua305510 小时前
浅谈Spring Cloud:认识微服务
spring·spring cloud·微服务
lgbisha11 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云
记得开心一点嘛11 小时前
在Linux系统上使用Docker部署javaweb项目
linux·运维·docker
yukai0800813 小时前
Python 全栈系列271 微服务踩坑记
python·微服务·php