介绍

Docker 是一个开源的容器化平台,它可以让开发者打包应用程序及其依赖环境到一个可移植的容器中,然后在任何安装了 Docker 的机器上运行。容器类似于虚拟机,但更轻量级,因为它们共享操作系统内核而不是每个容器一个独立的操作系统。

简单来说就是可以快速配置环境以及部署项目。

官方文档:Guides | Docker Docs

视频:黑马程序员 —— Docker

文档:黑马程序员 —— Docker

Docker Hub 容器镜像库

在Ubuntu上安装Docker

1.更新包索引并安装必要的包

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg

2.添加 Docker 的官方 GPG 密钥

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

3.设置 Docker 存储库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4.更新包索引并安装 Docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5.启动 Docker 服务并验证安装,看到 "Hello from Docker!" 的信息,说明 Docker 安装成功。

sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world

6.配置阿里云镜像加速器,直接复制粘贴运行即可

部署MySQL

镜像可以理解为绿色便携版的应用安装包(即下即用),而容器可以理解为应用的多开,容器间是隔离的不会相互影响。比如微信这个应用和同时多开几个微信,多开的微信互不影响。

无需考虑安装包、环境、配置的关系,只需使用下面代码,docker便会一键部署。

docker run -d   --name mysql   -p 3306:3306   -e TZ=Asia/Shanghai   -e MYSQL_ROOT_PASSWORD=123   mysql

使用docker ps查看正在运行的容器,包括容器的 ID、镜像名称、创建时间、状态、端口映射和名称等信息。可以看到mysql数据库已经安装成功。

使用idea测试数据库连接,可以成功连接。

更改命令参数可以部署第二个MySQL数据库

docker run -d   --name mysql2   -p 3307:3306   -e TZ=Asia/Shanghai   -e MYSQL_ROOT_PASSWORD=123   mysql

常见命令

案例——创建Nginx容器

1.DockerHub搜索Nginx镜像,直接用docker pull nginx命令下载最新版镜像。

2.使用docker images查看所有镜像可以看到拉取的nginx镜像。

3.创建nginx容器并使用docker ps命令查看。

docker run -d --name nginx -p 80:80 nginx

4.使用docker stop nginx命令暂停容器并使用docker ps -a命令查看(加了-a会显示暂停的容器)。

5.使用docker start nginx命令启动容器,注意不是docker run(这个是创建容器),并使用docker ps命令查看。

6.使用docker exec -it nginx bash进入容器内部,并使用伪终端和命令行进行交互。容器内部有模拟的文件系统。使用exit命令可以退出容器。

7.暂停并删除mysql2容器。

数据卷挂载

1.删除原先的nginx容器后重新创建,这次创建数据卷,再使用指令进行查看。

docker rm -f nginx
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

2.查看虚拟机的目录,发现成功映射。

本地目录挂载

与前面挂载不同点:可以自定义映射的虚拟机路径,而不是固定的映射路径下。

自定义镜像

1.将demo文件夹上传到虚拟机root目录下,此处使用的是Xftp。

2.demo文件夹包含打包的jar包和Dockerfile文件。

3.进入demo目录下创建docker镜像,注意不要漏了空格和.

cd demo
docker build -t docker-demo .

4.使用docker images可以看到创建的docker-demo镜像。

5.用该镜像创建容器,然后查看其运行状态和日志。

docker run -d --name dd -p 8080:8080 docker-demo
docker ps
docker logs -f dd

6.成功访问网页:虚拟机ip地址+:8080/hello/count

容器网络互联

创建网络命名为hmall ,查看所有网络,将mysql容器加入到网络并起别名db。

docker network create hmall
docker network ls
docker network connect hmall mysql --alias db

部署前后端项目

部署后端Java应用

1.对mysql数据库执行sql文件。

2.加载完maven依赖后,打包hmall项目。

3.将这两个文件拖到虚拟机root/demo2目录下。

4.进入demo2目录创建镜像,然后创建容器加入到hmall网络中。(注意前面容器网络互联中已经将mysql容器加入到hmall网络,因此二者可以互联)

cd demo2
docker build -t hmall .
docker run -d --name hm -p 8080:8080 --network hmall hmall

5.接下来访问网页,若出现数据说明部署成功,网址举例:虚拟机ip地址:8080/search/list?pageNo=1&pageSize=5

部署前端

1.将nginx文件夹上传到虚拟机root目录。

2.由于nginx.conf文件使用的是hmall,因此输入docker rename hm hmall将容器名改为hmall。

3.创建nginx容器,配置端口和路径映射,并加入到网络hmall以便能和后端项目互联。

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmall \
  nginx

4.查看网页 虚拟机ip地址:18080

Docker Compose

1.将如下内容的docker-compose.yml文件上传到虚拟机root目录。

version: "3.8"  # 指定Docker Compose文件的版本

services:  # 定义多个服务
  mysql:
    image: mysql  # 使用官方MySQL镜像
    container_name: mysql  # 容器名称为mysql
    ports:
      - "3306:3306"  # 将主机的3306端口映射到容器的3306端口
    environment:
      TZ: Asia/Shanghai  # 设置时区为亚洲/上海
      MYSQL_ROOT_PASSWORD: 123  # 设置MySQL的root用户密码为123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"  # 挂载本地的mysql配置文件夹到容器中的配置目录
      - "./mysql/data:/var/lib/mysql"  # 挂载本地的数据文件夹到容器中的MySQL数据目录
      - "./mysql/init:/docker-entrypoint-initdb.d"  # 挂载初始化脚本目录到容器中的初始化脚本目录
    networks:
      - hm-net  # 将服务连接到自定义网络hm-net

  hmall:
    build: 
      context: .  # 指定构建上下文为当前目录
      dockerfile: Dockerfile  # 使用当前目录中的Dockerfile文件构建镜像
    container_name: hmall  # 容器名称为hmall
    ports:
      - "8080:8080"  # 将主机的8080端口映射到容器的8080端口
    networks:
      - hm-net  # 将服务连接到自定义网络hm-net
    depends_on:
      - mysql  # 依赖于mysql服务,确保mysql服务先启动

  nginx:
    image: nginx  # 使用官方Nginx镜像
    container_name: nginx  # 容器名称为nginx
    ports:
      - "18080:18080"  # 将主机的18080端口映射到容器的18080端口
      - "18081:18081"  # 将主机的18081端口映射到容器的18081端口
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"  # 挂载本地的Nginx配置文件到容器中的配置目录
      - "./nginx/html:/usr/share/nginx/html"  # 挂载本地的HTML文件夹到容器中的Nginx静态文件目录
    depends_on:
      - hmall  # 依赖于hmall服务,确保hmall服务先启动
    networks:
      - hm-net  # 将服务连接到自定义网络hm-net

networks:
  hm-net:
    name: hmall  # 定义一个自定义网络hmall

2.删除所有容器和镜像以及自定义网络。(数据卷volume别删,不然要重新配数据库)

3.使用docker compose up -d命令进行部署,发现报错找不到Dockfiles文件。经分析是因为将hmall项目放在root/demo2目录下的原因。

4.修改docker-compose.yml文件重新上传,再次执行docker compose up -d命令成功部署,也可以成功刷新网页。

(by 归忆)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐