# Docker-虚拟化容器技术

Docker是开源的应用容器引擎,Docker改变了虚拟化的方式!

三大概念

  • 镜像:就像安装包一样的东西 (精简的linux+软件文件)
  • 容器:Docker通过安装镜像生成的一个环境,就像应用多开一样,开启的应用环境一样的东西
  • 仓库:应用市场一样的东西,远程仓库,本地仓库 -> /var/lib/docker

# 一、Docker安装和基础命令

# 1.Docker安装

  1. bash安装(所有得Linux平台)推荐

    curl -fsSL get.docker.com -o get-docker.sh # 拉取docker官方脚本
    sh get-docker.sh --mirror Aliyun # 执行脚本,使用阿里云镜像
    systemctl enable docker # 把docker服务加入开机自启
    systemctl start docker # 启动docker服务 restart 重启 status 状态 stop停止
    
    # 【可选】推荐将当前用户加入docker组
    groupadd docker
    usermod -aG docker $USER
    # 【可选】配置阿里云加速
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://09w3lr09.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  2. docker在Ubuntu或者deepin里都可以采用一条命令安装

    # 安装
    apt install docker.io
    # 启动docker服务
    systemctl start docker
    # 查看是否成功
    docker version
    
    1
    2
    3
    4
    5
    6
  3. CentOS安装

    # 解决Failed to download metadata for repo ‘AppStream’ 
    # Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
    # 如果上述三个文件中含有 mirrorlist 字段,将这些字段进行注释,并将 baseurl 修改为国内的软件源
    # 阿里云
    # baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
    # 腾讯云
    # baseurl=https://mirrors.tencentyun.com/centos/$releasever/BaseOS/$basearch/os/
    vi /etc/yum.repos.d/CentOS-Base.repo
    vi /etc/yum.repos.d/CentOS-AppStream.repo
    vi /etc/yum.repos.d/CentOS-Extras.repo
    
    安装Docker centos8安装docker
    官方文档:https://docs.docker.com/engine/install/centos/
    bash: yum-config-manager: 未找到命令
    yum -y install yum-utils
    # 1. 查看系统版本 CentOS Linux release 8.2.2004 (Core)
    cat /etc/redhat-release
    # 2. 添加镜像源(这里是阿里的镜像源)
    yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 3. 安装依赖
    yum -y install  yum-utils device-mapper-persistent-data lvm2
    # 4. 安装docker-ce
    dnf -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
    dnf -y  install docker-ce docker-ce-cli --nobest
    # 5. 查看docker版本
    docker --version
    Docker安装完执行dockers ps报错如下。Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?解决办法
    systemctl daemon-reload
    systemctl restart docker.service
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

# 2.Docker启动停止

  1. 启动 Docker

    systemctl start docker
    
    1
  2. 停止 Docker

    systemctl stop docker
    
    1
  3. 重启 Docker

    systemctl restart docker
    
    1
  4. 开机启动

    systemctl enable docker
    
    1
  5. Docker状态

     systemctl status docker
    
    1

# 3.Docker基础命令

1.信息和帮助

docker version     # 版本信息
docker info        # 系统信息
docker 命令 --help  # 帮助命令
1
2
3

2.镜像命令image

  1. 镜像基础命令

    docker images                            # 查看主机上的镜像
    docker search nginx                      # 搜索镜像 和Docker Hub搜索一样
    docker pull nginx                        # 下载镜像
    docker rmi nginx                         # 删除镜像 -f 强制删除,容器也会删除 
    docker rmi -f $(docker images tomcat -q) # 删除所有得Tomcat镜像
    
    1
    2
    3
    4
    5
  2. 镜像打包

    docker commit -m "描述信息" -a "作者信息" id|name 镜像名:tag    # 将正在运行容器打包成镜像
    docker save tomcat:8.0 -o /root/tomcat-8.0.tar              # 备份镜像
    docker load -i /root/tomcat-8.0.tar                         # 恢复镜像
    
    1
    2
    3

3.容器命令

  1. 运行容器

    docker run --name 容器名 -p 主机端口:容器端口  \
    -v 主机目录:容器目录:ro \
    -d ImageId或者镜像名:TAG
    
    1
    2
    3

    -p 8080:8080 映射端口,将宿主机端口映射到容器端口

    -d 后台运行

    --name tomcat01 指定容器名称为tomcat01

    -v 宿主机目录:容器目录

    数据卷 Volume

    • 只能在容器首次启动时候设置
    • 会将容器内原始数据清空,以宿主机为主内容为主
    • 所有数据相关的一般都需要持久化到宿主机。切记
    -v /root/apps:/usr/local/tomcat/webapps     # 把宿主机/root/apps映射到tomcat容器里的/usr/local/tomcat/webapps
    -v /root/apps:/usr/local/tomcat/webapps:ro  # 只能加在容器里 [ro] 只读read only [rw] 读写模式
    -v aa:/usr/local/tomcat/webapps 		    # aa数据卷别名,aa不存在自动创建;这种方式会保留容器内的内容
    											# aa默认在宿主机的/var/lib/docker/volumes/下
    
    1
    2
    3
    4
  2. 查看容器

    docker ps -a -q   # -a 查看所有容器(包括未运行的) -q 只查看容器的ID
    docker ps         # 查看正在运行的容器
    
    1
    2
  3. 停止,重启,暂停容器

    docker stop     id|name
    docker kill     id|name  # 强制停止容器
    docker restart  id|name
    docker pause    id|name  # 暂停容器
    docker unpause  id|name  # 恢复暂停容器
    
    1
    2
    3
    4
    5
  4. 移除容器

    docker rm id|name 
    docker rm -f $(docker ps -aq) # 删除所有容器 -f 强制删除(可以删除正在运行的容器)
    
    1
    2
  5. 查看日志

    docker logs    id|name
    docker logs -f id|name  # 查看实时日志 -t 显示时间
    
    1
    2
  6. 进入容器内部

    docker exec -it id|name bash  # 进入正在运行的容器并且(-it)开启交互模式终端 bash是终端,也可以只写 /bin/bash
    exit                          # 退出容器
    ctrl +P +Q                    # 容器不停止
    
    1
    2
    3
  7. 退出容器内和宿主机间拷贝复制文件

    docker cp [宿主机文件路径] [id|name:容器目录或文件]    # 宿主机拷贝到容器中  宿主机 -> 容器
    docker cp [id|name:容器目录或文件] [宿主机目录或文件]  # 容器中拷贝到宿主机  容器 -> 宿主机
    
    1
    2
  8. 查看容器中进程信息

    docker top id|name         # 查看容器中进程信息
    docker inspect id|name     # 获取容器元信息
    
    1
    2
  9. 创建虚拟网段,同一网段的容器就可以互相通信

    默认情况下,Docker创建容器时把所有容器都连接在docker0网桥上,默认在docker0网桥上的所有容器间都可以使用容器内IP通信

    要想使用容器id或者容器名通信,必须自定义网桥 一般一个项目新建一个网桥

    • 启动容器的时候,指定网络 docker run -d --network ufs xxx
    • 容器启动后,在加入网络 docker network connect ufs tomcat01 把tomcat01加入ufs网络中
    docker network create -d bridge my-bridge    # 创建网段,一般名称选择项目名称
    docker network ls							 # 查看列表
    docker network inspect my-bridge             # 查看网段内容器信息
    docker network rm my-bridge                  # 删除
    docker network prune                 		 # 删除没有使用的网桥
    
    1
    2
    3
    4
    5
  10. 清除docker环境中服务、镜像、容器、挂载卷、网络

  • 查询docker全部数据

    docker node ls
    docker network ls
    docker volume ls
    docker images -a
    docker stack ls(docker service ls)
    docker ps -a
    
    1
    2
    3
    4
    5
    6
  • 删除所有容器

    docker rm -f $(docker ps -a -q)
    
    1
  • 删除与正在运行的容器无关的所有资源(关闭的容器、无用的数据卷和网络)

    docker system prune -a
    
    1

# 二、Dockerfile

Dockerfile是镜像的描述文件。通过Dockerfile可以构建一个镜像。

# 1.指令说明

每条保留字必须大写,后面至少跟一个参数,指令从上到下顺序执行,#表示注释 每条指令都会创建新的镜像层,并且提交。

保留字(大写) 作用
FROM 当前镜像基于哪个镜像 第一个指令必须是FROM
MAINTAINER 镜像的作者和邮箱地址,非必需了
RUN 构建镜像时需要运行的指令
EXPOST 容器对外暴露的端口号,仅仅是声明一下给用户看一下,不写也可以
WORKDIR 创建容器后,终端默认登录进来的工作目录
ENV 构建镜像过程中设置的环境变量
ADD 宿主机目录下的文件拷贝进镜像,并且会自动处理URL和解压tar包
COPY 拷贝文件和目录到镜像中,和ADD类似
VOLUME 设置数据卷,也属于描述类型的给使用者看一下而已
CMD 指定容器启动时要运行的命令,存在多个时只要最后一个生效,多用于可以传参的
ENTRYPOINT 指定容器启动时要运行的命令,多用于固定的指令

# 2.示例

FROM openjdk:8-jre
COPY *.jar /app.jar
CMD ["--server.port=8848"]
EXPOSE 8848
ENTRYPOINT ["java", "-jar", "/app.jar"]
1
2
3
4
5

docker build -t image-name:1.0 基于Dockerfile打包镜像

# 三、Docker-Compose

随着微服务等项目的发展,一个项目依赖太多的容器,每个容器之间的关系以及n多个容器编排就比较困难,于是docker-compose应运而生,可以极大的方便我们去做容器的编排

docker-compose让我们可以站在项目的角度去管理一组容器

# 1.Docker-Compose安装

#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose   
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# github慢死了
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
1
2
3
4
5
6

或者下载下来后,放到 /usr/local/bin/docker-compose 改下执行权限即可

# 2.docker-compose.yml

示例:Cloud 以及各个组件。参考了若依的 (opens new window)

项目 Project 一组关联的容器组成的一个完整业务单元

服务 Service 一个项目中的某一个容器

常用命令说明

模板命令 说明
version docker-compose项目版本 (opens new window)
build 根据Dockerfile构建镜像,并且启动
container_name 指定容器名称,可以使用默认的,可以指定
depends_on 解决容器启动的先后问题,当前服务不会等待被依赖的服务完全启动之后才启动
environment "MYSQL_ROOT_PASSWORD=123456" 环境配置信息
env_file .env 环境配置文件 docker run -e
expose 指定构建镜像过程中暴露的端口号
image mysql:latest 指定服务使用的镜像 docker run image
networks 指定网桥,需要先声明 docker run --network
ports 宿主机和容器端口映射 docker run -p
volumes 数据卷映射 /root/mysql/data:/var/lib/mysql docker run -v
restart docker run --restart=always

使用步骤

  1. 新建一个项目比如 ufs

  2. 新建配置文件 docker-compose.yml

    version: "3.0" # docker-compose项目版本
    
    services:
      apps:
        build:
          context: ./
          dockerfile: Dockerfile
        ports:
          - "9001:9001"
        depends_on:
          - mysql
          - redis
          - es
          - mq
      redis:
        image: redis:latest
        ports:
          - "6380:6379"
      mysql:
        image: mysql:latest
        ports:
          - "3307:3306"
        environment:
          - "MYSQL_ROOT_PASSWORD=123456"  # mysql设置环境参数
        volumes:
          - /root/mysql/data:/var/lib/mysql # 配置映射路径
      es:
        image: elasticsearch:7.12.0
        ports:
          - "9200:9200"
          - "9300:9300"
        restart: always
        volumes:
          - /root/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
          - /root/elasticsearch/data:/usr/share/elasticsearch/data
          - /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins
      mq:
        image: rabbitmq:management
        ports:
          - "5672:5672"
          - "15672:15672"
        environment:
          - "RABBITMQ_DEFAULT_USER=admin"
          - "RABBITMQ_DEFAULT_PASSWORD=123456"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
  3. docker-compose命令

    docker-compose up                	 		# 对整个项目里所有服务启动
    docker-compose up -d mysql	redis			 # 对项目里的mysql,redis服务启动 -d 后台启动
    docker-compose down 服务Id   					# 关闭某个服务,同时会移除网络
    docker-compose exec 服务Id bash  				# 同docker exec 
    docker-compose ps			  		 	 	 # 同docker ps 
    docker-compose restart 服务Id	-t 10			# 同docker ps -t 延时10s启动
    docker-compose rm -f 服务Id					# 同docker rm -f  【-v】 删除数据卷
    docker-compose top 服务Id						# 查看top
    docker-compose logs -f 服务Id				    # docker logs -f xxx
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

-f 指定使用的compose模板文件,默认为当前目录下的docker-compose.yaml文件,可以多次指定

# 四、Docker可视化工具

第三方公司提供的开源Portainer项目,用来对docker引擎中运行的所有容器可视化展示

docker run -p 8000:8000 -p 9000:9000 \
    --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /root/portainer/data:/data \
    -d portainer/portainer
1
2
3
4
5
6

ztFTiD.png

# Docker 安装 Nginx

# Docker 安装部署 SpringBoot

# Docker 安装 Tomcat

# Docker 安装 MySQL

# Docker 安装 SQL Server

# Docker 安装 PGSQL

# Docker 安装 MongoDB

# Docker 安装 Jenkins

# Docker 安装 Redis

# Docker 安装 ES和Kibana

# Docker 安装 RabbitMQ

# Docker 安装 Neo4j

# Docker 安装 Nacos

# Docker 安装 ClickHouse

# Docker 安装 minio

# Docker 安装 Apollo

# Docker 安装 ELK系统