Docker

快速构建、运行、管理应用的工具

环境安装

Linux环境安装

  • 利用VMWare搭建CentOS7虚拟机
  • 修改网络配置,使用固定IP地址
  • 利用VMWare镜像和克隆,创建多个虚拟机
  • windows系统使用xshell工具进行远程连接虚拟机
  • windows系统使用WinScp工具与虚拟机进行文件传输

虚拟机搭建和网络配置修改参考之前所写的博客:Linux安装与网络配置

安装docker

虚拟化容器技术。Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行 环境,容器之间互相隔离

image-20231018193923036

官方文档—安装指南

卸载系统旧版本的docker

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

设置仓库

Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.

1
2
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker

1
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动docker

1
sudo systemctl start docker  

验证docker是否安装成功

1
sudo docker run hello-world

设置docker开机自启动

1
sudo systemctl enable docker

配置docker镜像加速

阿里云,容器镜像加速服务

  1. 登录阿里云,进入控制台

    image-20231018194502910

  2. 进入产品与服务列表

    image-20231018194551471

  3. 选择容器镜像服务

    image-20231018194644155

  4. 选择镜像加速器

    image-20231018194719463

  5. 选择centos,可以查看对应的加速配置命令

    image-20231018194823560

  6. 配置命令

    修改daemon配置文件/etc/docker/daemon.json来使用加速器

    1
    2
    3
    4
    5
    6
    7
    8
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://bfswxim9.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

docker安装mysql

docker hub地址

安装mysql 5.7

下载mysql镜像

sudo docker pull mysql:版本号

比如下载mysql 5.7版本

sudo docker pull mysql:5.7

查看docker内部所有镜像

sudo docker images

image-20231018200105123

创建实例并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

#参数说明:
--name: 给容器命名
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/data:/var/lib/mysql/:将数据文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
-d 让容器在后台运行
mysql:5.7:镜像名

镜像命名规范

  • 镜像名称一般分两部分组成:[repository]:[tag]

    • 其中repository就是镜像名
    • tag是镜像的版本
  • 在没有指定tag时,默认是latest,代表最新版本的镜像

image-20231023194311421

docker ps查看运行的容器实例信息

image-20231018201140545

补充:docker容器文件挂载与端口映射

image-20231018201529294

  • docker run会启动一个对应的容器,每个容器都是一个完整的运行环境(对应一个完整的Linux环境)

  • docker exec -it 容器名 对应文件或者命令:进入对应容器,与对应容器进行交互

如下图所示:mysql:5.7 的 /bin/bash下的目录结构可以看出其相当于是一个完整的Linux环境

image-20231018201844533

  • exit可以直接退出对应容器
  • 文件挂载
    • 类似与快捷方式,讲Linux系统中的文件与容器中的文件关联起来,这样可以直接在Linux系统上可以看到mysql的配置文件、数据文件和日志文件
    • image-20231018202741744

修改mysql配置文件

vi /mydata/mysql/conf/my.cnf

写入如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

写入之后保存,重启mysql容器

docker restart 容器名:重启对应容器

连接mysql

方法一:通过容器命令行连接

docker exec -it mysql mysql -uroot -proot

image-20231018205320588

方法二:远程访问

如果失败,需要先设置远程用户访问权限

1
2
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges

windows远程访问

mysql -h ip地址 -P 端口号 -u 用户名 -p 密码

image-20231018205700141

方法三:利用可视化工具Navicat连接测试

image-20231018212807013

image-20231018212819188

docker安装redis

安装redis 6.2.13

新版本redis默认自动持久化

下载redis镜像

docker pull redis:6.2.13

创建实例并启动

1
2
3
4
5
6
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis:6.2.13 redis-server /etc/redis/redis.conf

连接redis

方式一:通过容器命令行连接

docker exec -it redis redis-cli

image-20231018211411410

方式二:通过其他主机远程访问

redis-cli -h ip地址

image-20231018211754523

补充—Redis Desktop Manager(Redis可视化工具安装)

安装教程和下载地址参考博客

连接示例

image-20231018212554795可以查看数据据库内容

image-20231018212623835

Docker快速入门

容器和镜像

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub

image-20231023192849389

Docker基础

常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档

Docker常见命令概览

image-20231023195219760

Doker常见命令列表

命令 说明 文档地址
docker pull 拉取镜像 docker pull
docker push 推送镜像到DockerRegistry docker push
docker images 查看本地镜像 docker images
docker rmi 删除本地镜像 docker rmi
docker run 创建并运行容器(不能重复创建) docker run
docker stop 停止指定容器 docker stop
docker start 启动指定容器 docker start
docker restart 重新启动容器 docker restart
docker rm 删除指定容器 docker rm
docker ps 查看容器 docker ps
docker logs 查看容器运行日志 docker logs
docker exec 进入容器 docker exec
docker save 保存镜像到本地压缩文件 docker save
docker load 加载本地压缩文件到镜像 docker load
docker inspect 查看容器详细信息 docker inspect

命令别名

可以给常用的Docker命令起别名,便于我们访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

然后,执行命令使别名生效

1
source /root/.bashrc

数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

一定程度上类似于快捷方式,将容器内的文件挂载在宿主机上,这样可以通过对宿主机上对应文件修改达到改变容器内文件的目的

image-20231023203149684

数据卷的相关命令

这些命令一般不会使用,容器文件挂载操作一般在容器创建时就已经完成

命令 说明 文档地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docker volume ls
docker volume rm 删除指定数据卷 docker volume rm
docker volume inspect 查看某个数据卷的详情 docker volume inspect
docker volume prune 清除数据卷 docker volume prune

image-20231023205944546

实例:利用Nginx容器部署静态资源

需求:

  • 创建Nginx容器,修改nginx容器内的html目录下的index.html文件内容

  • 将静态资源部署到nginx的html目录

操作

  • 在执行docker run命令时,使用-v 数据卷:容器内目录可以完成数据卷挂载

  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

创建容器并挂载

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

image-20231023210627910

查看数据卷及其位置

1
2
docker volume ls  #查看所有数据卷
docker volume inspect html #查看数据卷html的详细信息,包括在宿主机的位置

image-20231023210839704

image-20231023210925071

修改html目录下文件,即可实现nginx静态部署

直接访问ip地址/即可访问静态资源

查看某个容器是否被挂载,以及挂载的数据卷信息

docker inspect 容器名

image-20231023212353220

实例:本地目录的挂载

  • 在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载
  • 本地目录必须以“/”或 “./“ 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql : /var/lib/mysql会被识别为一个数据卷叫mysql
    • -v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

image-20231023212959096

image-20231023213143862

DockerFile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像

DockerFile常用指令

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

详细信息,可以参考官方文档

制作Jar包的运行镜像

我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构,也可以直接基于JDK为基础镜像,省略前面的步骤

image-20231023214453287

当编写好了Dockerfile,可以利用下面命令来构建镜像

docker build -t myImage:1.0 .

  • -t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest

  • .:是指定Dockerfile所在目录,如果就在当前目录,则指定为”.”

构建自定义镜像

image-20231023215948740

image-20231023220024629

启动并运行镜像

image-20231023220115685

查看容器运行日志

image-20231023220201265

浏览器访问ip地址:8080

网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上

image-20231023220925309

虽然各个容器之间网络联通,可以相互通信, 但是容器一旦重启,网络地址是动态分配的

所以需要自定义网络才可以通过容器名互相访问

Docker常见的网络操作命令如下

命令 说明 文档地址
docker network create 创建一个网络 docker network create
docker network ls 查看所有网络 docker network ls
docker network rm 删除指定网络 docker network rm
docker network prune 清除未使用的网络 docker network prune
docker network connect 使指定容器连接加入某网络 docker network connect
docker network disconnect 使指定容器连接离开某网络 docker network disconnect
docker network inspect 查看网络详细信息 docker network inspect

更多详细信息,查看官方文档

run 命令中可以通过--network 网络名让创建的容器加入对应的网络

项目部署

部署Java后端应用

编写对应的Dockerfile文件

1
2
3
4
5
6
7
8
9
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

项目打包

maven package

image-20231024094249542

image-20231024094332057

上传服务器

image-20231024094728816

构建镜像

image-20231024094853550

创建并启动容器

image-20231024095030218

查看容器日志

docker logs -f 容器名:持续更新显示容器日志

image-20231024095112971

访问项目

192.168.80.130:8080/search/list

image-20231024104121270

注意网络的配置

  • 自己创建一个网络
  • mysql容器加入该网络
  • 创建启动后端项目时,将后端项目加入mysql同一网络

部署前端

前端项目上传服务器

image-20231024105040433

image-20231024105105757

容器的创建和启动

  • nginx配置文件的挂载
  • nginx静态资源文件的挂载
  • nginx端口的映射

文件挂载参考docker hub官方文档

创建启动命令

1
2
3
4
5
6
7
docker run -d --name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /home/front/html:/usr/share/nginx/html \
-v /home/front/nginx.conf:/etc/nginx/nginx.conf \
--network demo \
nginx:latest

image-20231024105916690

访问项目

192.168.80.130:18080192.168.80.130:18081

注意点

前端、后端和mysql所在容器必须要处于同一网络中,才能进行通信

DockerCompose

Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

image-20231024111846289

image-20231024112120132

docker compose命令格式

1
docker compose [OPTIONS] [COMMAND]

image-20231024112524685