Docker

293 阅读20分钟

Docker 介绍

Docker:Docker 是一个开源的应用容器 Container 引擎, 其可以让开发者将应用及应用运行的 环境打包到一个轻量级、可移植的镜像中,然后发布到任何流行的 Linux、Windows 机器上。

Docker 官网:www.docker.com/

Docker 官方镜像中心:hub.docker.com

Docker核心对象

  • Docker Daemon:Docker Daemon,即 Dockerd,Docker 守护进程,其监听着 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
  • 镜像 Image:Docker 镜像是用于创建 Docker 容器的模板。就像面向对象编程中的类。
  • 容器 Container:Docker 容器是镜像运行时的实体。就像面向对象编程中类的实例。一个类可以创建出 N多个实例,那么一个镜像同样也可以创建出 N 多个容器。每个处于运行状态的容器中都包含着一个或多个相关的应用,且它的运行不会干扰到其它容器。因为它们之间是相互隔离的。
  • 仓库 Repository:Docker 镜像仓库用来保存相关的一组镜像,这组镜像具有相同的镜像名称,都与镜像仓库名称相同。仓库根据其中的镜像是否可以被公开共享,可以分为公开库与私有库。
  • 标签 Tag:通过<repository>:<tag>即可唯一定位一个镜像。即镜像标签其实就是镜像仓库中用于区 分各个镜像的一种标识,同一仓库中的镜像具有不同的标签。
  • 镜像中心 Registry:Docker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库,Docker 用户可以直接从这些仓库中 pull 需要的镜像,也可以将自己制作的镜像 push 到 Docker 镜像 中心相应的仓库中。

Docker引擎架构

Docker 的引擎架构

  • Docker Client:Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。
  • Dockerd:Dockerd,即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信。
  • Containerd:即 Container Daemon,该项目的主要功能是管理容器的生命周期。不过其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。
  • Runc:Runc,Run Container,是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 DockerDaemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。Runc只有创建容器的作用,其本质是一个独立的容器运行时 CLI 工具。其在 fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。
  • Shim:Shim(垫片)是实现“Daemonless Container”不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。

docker引擎架构图.png

Docker版本分类

Docker版本分为大版本和小版本

  • 大版本:Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。
  • 小版本:从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。

Docker的安装

Linux下安装Docker

Linux下安装Docker

  1. 安装yun-utils:yum install -y yum-utils
  2. 添加Docker下载仓库:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. 安装Docker:yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  4. 启动Docker服务:systemctl start docker
  5. 验证是否安装成功:docker version

Docker服务相关指令

# Docker的启动
systemctl start docker
# Docker的重启
systemctl restart docker
# Docker的停止
systemctl stop docker
# Docker的开启开机自启动
sysetmctl enable docker
# Docker的关闭开机自启动
systemctl disable docker
# Docker的状态
systemctl status docker

Docker配置阿里云加速

# 新建一个目录
sudo mkdir -p /etc/docker 
# 创建文件,并配置文件
tee /etc/docker/daemon.json <<-'EOF'  
{  
  "registry-mirrors": ["https://61ojel27.mirror.aliyuncs.com"]  
}  
EOF
# 重新加载deamon.json文件
sudo systemctl daemon-reload
# 重启Docker服务
systemctl restart docker

Docker的卸载

  1. 卸载Docker引擎:
yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-selinux \
      docker-engine-selinux \
      docker-engine \
      docker-ce
  1. 删除镜像容器等存储的目录
# 删除docker镜像存储的目录
rm -rf /var/lib/docker
# 删除docker容器存储的目录
rm -rf /var/lib/containerd

Windows下安装Docker

升级WSL

方式1:通过wsl命令,管理员运行CMD执行命令

// 升级wsl
wsl --update

// 关闭wsl
wsl --shutdown

方式2:通过netsh命令

// 重置Winsock
netsh winsock reset

// 关闭wsl
wsl --shutdown

方式3:安装 wsl_update_x64 文件

wsl_update_x64.msi下载地址:learn.microsoft.com/en-us/windo…

安装Docker

下载 Docker Desktop Installer.exehub.docker.com/editions/co…

运行Docker Desktop Installer.exe 文件

Docker-Windows下载.png

安装完成后点击 Close and restart 重启电脑

Docker-Windows安装成功.png

配置阿里云镜像加速

获取阿里云镜像加速地址:account.aliyun.com/login/login…

获取阿里云镜像加速地址-16983148064051.png

复制加速地址,并修改到registry-mirrors中

{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false
}

Doker配置阿里云加速配置.png

Docker测试安装成功
docker version

检查Dokcer是否安装成功.png

Docker镜像

Docker镜像:镜像是一种轻量级、可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等。几乎所有应用,直接打包为 Docker 镜像后就可以运行。

Docker镜像仓库的分类

Docker镜像仓库分类:

  • Docker Official Image:Docker 官方镜像仓库。该类仓库中的镜像由 Docker 官方构建发布,代码质量较高且安 全,有较完善的文档。该类仓库中的镜像会及时更新。一般常用的系统、工具软件、中间件都有相应的官方镜像仓库。例如,Zookeeper、Redis、Nginx 等。
  • Verified Publisher:已验证发布者仓库。该类仓库中的镜像由非 Docker 官方的第三方发布。但该第三方是 由 Docker 公司审核认证过的,一般为大型企业、团体或组织。审核通过后,Docker 公司会向其颁发“VERIFIED PUBLISHER”标识。这种仓库中镜像的质量有保证的。
  • Sponsored OSS:由 Docker 公司赞助开发的镜像仓库。该类仓库中的镜像也由非 Docker 官方的第三方发 布,但该镜像的开发是由 Docker 公司赞助的。该类型的第三方一般为个人、团队或组织。这种仓库中镜像的质量也是有保证的。
  • 无认证仓库:没有以上任何标识的仓库。这种仓库中镜像的质量良莠不齐,质量上无法保证,在使用时需谨慎。
  • 第三方镜像中心:镜像中心默认使用的都是 Docker 官方的 Docker Hub。不过,镜像中心是可配置的,可以使用指定的第三方镜像中心。对于第三方镜像中心中的仓库名称<repository>由三部分构
    成:<domain-name>/<username>/<software-name>。其中的< domain-name >指的是第三方镜像中心的域名或 IP。

Docker镜像分层

镜像分层:Docker 镜像由一些松耦合的只读镜像层组成,Docker Daemon 负责堆叠这些镜像层,并将它们关联为一个统一的整体,即对外表现出的是一个独立的对象。

镜像分层后可以在不同镜像间实现资源共享,即不同镜像对相同下层镜像的复用

镜像分层的组成

  • 镜像文件系统:对镜像占有的磁盘空间进行管理的文件系统,拥有该镜像所有镜像层的数据内容
  • 镜像json文件:用于描述镜像的相关属性的集合,通过 docker inspect [镜像]就可以直观看到

镜像文件系统:一个 docker 镜像的文件系统 FS 由多层只读的镜像层组成,每层都完成了特定的功能

  • 基础镜像层:所有镜像的最下层都具有一个可以看得到的基础镜像层 Base Image,基础镜像层的文件系统称为根文件系统 rootfs。而 rootfs 则是建立在 Linux 系统中“看不到的”引导文件系统bootfs 之上。
  • 扩展镜像层:在基础镜像层之上的镜像层称为扩展镜像层。顾名思义,其是对基础镜像层功能的扩展。在 Dockerfile 中,每条指令都是用于完成某项特定功能的,而每条指令都会生成一个扩展镜像层。
  • 容器层:一旦镜像运行了起来就形成了容器,而容器就是一个运行中的 Linux 系统,其也是具有文件系统的。容器的这个文件系统是在 docker 镜像最外层之上增加了一个可读写的容器层,对文件的任何更改都只存在于容器层。

Docker镜像相关指令

拉取镜像

# 语法
docker pull imageName:tag

# 举例
docker pull redis:7.0.14

# 参数说明
-a:拉取指定镜像的所有标签
-q:仅显示镜像标识符

查看已下载的镜像

# 语法
docker images

# 参数说明
--no-trunc:显示完整的ImageId
--digests:查看镜像digests信息
-q:仅显示ImageId
-d:

删除镜像

# 语法
docker rmi imageName:tag
# 删除none无用镜像
docker image prune

# 举例
docker rmi redis:7.0.14

# 参数说明
-f:强制删除镜像

导出镜像

# 语法
docker save imageName:tag -o pathName/fileName

# 举例说明
docker save redis:7.0.14 -o /usr/redis.tar

# 参数说明
-o:指定导出后的镜像路径和文件名

导入镜像

# 语法
docker load -i fileName

# 举例
docker load -i /usr/redis.tar

# 参数说明
-i:指定要加载的.tar文件的路径和文件名
-q:只输出错误信息,不显示操作过程

Docker容器

Docker容器介绍

容器存在的意义是为了运行容器中的应用,对外提供服务,所以启动容器的目的就是启动运行该容器中的应用。容器中的应用运行完毕后,容器就会自动终止。所以如果不想让容器启动后立即终止运行,则需要使容器应用不能立即结束。通常采用的方式有两种:与用户交互状态、等待状态。

docker容器运行过程

docker容器的运行过程.png

Docker容器相关指令

容器创建并启动

# 语法
docker run imageName:tag

# 举例
docker run redis:7.0.14

# 参数说明
--name:指定容器名称
-p:指定端口映射,格式为 宿主机端口:容器端口
-P:指定随机端口映射
-d:后台运行容器
-it:交互模式运行容器

容器重启

# 语法
docker restart containerId

# 举例
docker restart 93a90bae5356

容器停止

# 容器非强制停止
docker stop containerId
# 容器强制停止
docker kill containerId
# 非强制停止所有容器
docker stop $(docker ps -pa)
# 强制停止所有容器
docker kill $(docker ps -pa)
# 容器暂时停止
docker pause containerId
# 容器解除暂时停止
docker unpause containerId

设置容器自动启动

docker update containerId --restart=always

进入容器

# 语法
docker exec containerId

# 举例说明
docker exec -it containerId bash

# 参数说明
-it:指定容器以交互模式运行,并且为容器分配一个伪客户端
bash:进入容器后执行的命令,bash是一个linux终端交互命令

查看容器

# 语法
docker ps

# 参数说明
-a:显示启动和停止的容器
-q:显示启动中容器的ID
-l:显示最后创建的容器
-s:显示容器大小

查看容器启动日志

# 语法
docker logs containerId

# 举例
docker logs 2746b50c2762

# 参数说明
-n=3:显示最后3行日志
-t:显示详细日志时间戳
-f:动态显示运行中容器的日志

容器删除

# 语法
dokcer rm containerId

# 举例
docker rm 2746b50c2762


# 参数说明
-f:强制删除容器
# 删除所有容器
docker rm -f $(docker ps -aq)

容器提交

容器提交:将容器共享给大家,别人可以将这个镜像拉取下来,生成对应的容器,从而使用同一个环境。

# 语法
docker commit containerId

# 举例
docker commit 2746b50c2762

# 参数说明
-a:指定作者姓名
-m:指定提交信息

容器导出

# 语法
docker export containerId

# 举例
docker export 2746b50c2762

# 参数说明
-o:指定导出容器的文件名

容器导入

# 语法
docker import fileName imageName:tag

# 举例
docker import redis.tar redis:7.0.14

容器文件复制

容器文件复制:实现宿主机和容器之间的文件复制

# 将宿主机中文件复制到容器中
docker cp path containerId:path
# 将容器中文件复制到宿主机
docker cp containerId:path path

# 举例说明
docker cp /tmp/my.ini 2746b50c2762:/etc/mysql/my.cnf

容器数据卷

数据卷:是一个虚拟目录,指向宿主机文件系统中的某个目录。

# 挂载数据卷
docker run -v volumeName:containerPath
# 挂载宿主机的文件
docker run -v fileName:containerFileName
# 挂载宿主机的目录
docker run -v path:containerPath

# 举例
dokcer run -v html:/root/html nginx

# 数据卷操作
# 创建数据卷
docker volume volumeName
# 显示数据卷的信息
docker volume inspect volumeName
# 列举已存在的数据卷
docker volume ls
# 删除未使用的数据卷
docker volume prune
# 删除指定数据卷
docker volume rm volumeName

Dockerfile

DockerFile:用于构建Docker镜像的脚本文件,由一系列指令构成。通过docker build命令构建镜像时,Dockerfile中的指令会由上到下依次执行,每条指令都将构建出一个镜像,这就是镜像的分层。因此,指令越多,层次就越多,创建的镜像就越多,效率就越低。所以在定义 Dockerfile 时,能在一个指令完成的动作就不要分为两条。

Docker镜像结构.png

构建镜像指令

构建镜像的指令

# 语法
docker build PATH

# 举例,.表示通过当前目录下的Dockerfile构建镜像
docker build -t hello .

# 参数说明
-t:指定镜像名和标签
-f:指定要使用的Dockerfile路径

修改镜像标签

修改镜像标签实际上是复制一个存在镜像,镜像名和标签名可以自定义,但是镜像ID不会修改。

# 语法
docker tag oldImageName:oldTag newImageName:newTag

Dockerfile命令

FROM

FROM:用于指定基础镜像,且必须是第一条指令。若省略了 tag,则默认为 latest。

scratch 镜像是一个空镜像,是所有镜像的 Base Image。scratch 镜像只能在 Dockerfile 中被继承,不能通过 pull 命令拉取,不能 run,也没有 tag。并且它也不会生成镜像中的文件系统层。在 Docker 中,scratch 是一个保留字,用户不能作为自己的镜像名称使用。

# 语法
FROM image:tag

ADD / COPY

ADD / COPY:将当前宿主机中指定文件 src 赋值到容器中的指定目录 dest 中。

src 可以是宿主机中的绝对路径,也可以是相对路径。但相对路径是相对于 docker build 命令所指定的路径的。src 指定的文件可以是一个压缩文件,压缩文件复制到容器后会自动解压为目录;src 也可以是一个 URL,此时的 ADD 指令相当于 wget 命令。

src 最好不要是目录,其会将该目录中所有内容复制到容器的指定目录中。dest 是一个绝对路径,其最后面的路径必须要加上斜杠,否则系统会将最后的目录名称当做是文件名的。

COPY 与 ADD 指令相同,只不过 src 不能是 URL。若 src 为压缩文件,复制到容器后不会自动解压。

# 语法
ADD <src> <dest>

LABEL

LABEL 指令中可以以键值对的方式包含任意镜像的元数据信息。通过 docker inspect 可查看到 LABEL 与 MAINTAINER 的内容。

# 语法
LABEL <key>=<value> <key>=<value>

ENV

ENV用于指定环境变量,这些环境变量,后续可以被 RUN 指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。

# 语法
ENV <key> <value>

WORKDIR

WORKDIR:容器打开后默认进入的目录,一般在后续的 RUN、CMD、ENTRYPOINT、ADD 等指令中会引用该目录。可以设置多个 WORKDIR 指令。后续 WORKDIR 指令若用的是相对路径,则会基于之前 WORKDIR 指令指定的路径。在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

# 语法
WORKDIR path

RUN

RUN:用于在镜像构建过程中执行指定的命令

# 语法,command就是要执行的shell命令
RUN <command>

EXPOSE

EXPOSE:用于指定容器运行时将监听的网络端口,但并不会实际暴露端口。

EXPOSE <port>,<port>...

ARG

ARG:定义一个变量,该变量将会使用于镜像构建运行时

ARG <varname>=<varvalue>

ONBUILD

ONBUILD:用于指定当前镜像的子镜像进行构建时执行的指令

ONBUILD [instruction]

VOLUME

VOLUME:定义容器创建时可以挂载的数据卷

VOLUME ["dir1", "dir2"]

Dockerfile实战

生成hello-world镜像

生成可执行文件hello

# 安装GCC
yum install -y gcc gcc-c++
# 下载C的静态库
yum install -y glibc-static
# 创建hello.c,并编写C语言代码
#include<stdio.h>
int main() {
    printf("hello world docker\n");
    return 0;
}
# 使用GCC编译hello.c,同级目录下会生成可执行文件hello
gcc --static -o hello hello.c

创建Dockerfile,同级目录下创建文件Dockerfile

FROM scratch
ADD hello /
CMD ["/hello"]

构建镜像

# 构建镜像
docker build -t hello-my-world .
# 查看所有镜像
docker images

生成CentOS镜像

创建Dockerfile

FROM centos:7
MAINTAINER zhangsan zs@163.com
LABEL version="1.0" description="this is a custom centos image"

ENV WORKPATH /usr/local
WORKDIR $WORKPATH

RUN yum -y install vim net-tools wget
CMD /bin/bash

构建镜像

docker build -t customCentOS:1.0 .

Dockerfile部署Java项目

Dockerfile部署Java项目

  1. 将Java项目打包JAR后上传到服务器
  2. 编写Dockerfile
# 基于openjdk:8u102镜像
FROM openjdk:8u102
# 将宿主机的/tmp/docker-demo.jar复制到镜像中,并起名为docker-demo.jar
COPY /tmp/docker-demo.jar docker-demo.jar
# 配置jdk环境变量
ENTRYPOINT ["java", "-jar", "docker-demo.jar"]
# 定义暴露端口
EXPOSE 9000
  1. 构建镜像
docker build -t docker-demo:1.0 .

4.创建容器

docker run --name docker-demo -dp 9000:9000 docker-demo:1.0

Docker常用服务安装

MySQL

MySQL官网安装

# 拉取MySQL镜像
docker pull mysql:5.7

# 创建并运行MySQL容器
docker run --name mysql \
-dp 3306:3306
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

MySQL单机版安装

# 拉取MySQL镜像
docker pull mysql:8.0

# 创建并运行容器
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-v /develop/docker/mysql/mysql8/log:/var/log/mysql \
-v /develop/docker/mysql/mysql8/data:/var/lib/mysql \
-v /develop/docker/mysql/mysql8/conf:/etc/mysql/conf.d \
-dp 3306:3306 mysql:8.0

修改字符编码,在/develop/docker/mysql/mysql8/conf目录下新建my.cnf文件

[client]
default_character_set=utf8

[mysql]
default_character_set=utf8

[mysqld]
character_set_server=utf8

重启容器

docker restart 66a7fc5b17d9

# 查看MySQL字符编码
show variables like 'character%';

MySQL集群安装

配置master

# 拉取MySQL镜像
docker pull mysql:5.7
# 创建并启动MySQL容器
docker run --name mysql_master \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql_master/data:/var/lib/mysql \
-v /root/mysql_master/log:/var/log/mysql \
-v /root/mysql_master/conf:/etc/mysql/conf.d \
-dp 3307:3306 \
mysql:5.7
# 在/root/mysql_master/conf目录下新建my.conf文件并编写以下配置

[client]
default_character_set=utf8

[mysql]
default_character_set=utf8

[mysqld]
character_set_server=utf8
server_id=01
binlog-ignore-db=mysql
log-bin=master-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
# 重启MySQL容器
docker restart mysql_master
# 进入MySQL,为mysql_master创建slave用户
create user 'slave'@'%' identified by '123456';
# 为slave用户授权
grant replication slave, replication client on *.* to 'slave'@'%';

配置salve

# 创建并启动容器
docker run --name mysql_slave \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql_slave/data:/var/lib/mysql \
-v /root/mysql_slave/log:/var/log/mysql \
-v /root/mysql_slave/conf:/etc/mysql/conf.d \
-dp 3308:3306 \
mysql:5.7
# 在/root/mysql_slave/conf目录下新建my.conf文件,并编写以下配置
[client]
default_character_set=utf8

[mysql]
default_character_set=utf8

[mysqld]
character_set_server=utf8

server_id=02
binlog-ignore-db=mysql
log-bin=slave-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=relay-log-bin
log_slave_updates=1
read_only=1
# 重启mysql_slave容器
docker restart mysql_slave

配置主从复制

# 进入mysql_master,查看master状态
show master status;

# 进入mysql_slave,指定master
# master_host:master的主机IP地址
# master_user:master创建的用户名称
# master_password:master创建的用户对应的密码
# master_port:master对应的端口号
# master_log_file:master的binlog的文件,通过上面mater状态中的File查看
# master_log_pos:master的binlog当前同步位置,通过上面master状态中的Position查看
# master_connect_retry:设置主从同步每隔30秒同步一次
# master_retry_count:设置主从同步连续失败三次之后不再同步
change master to master_host='localhost',master_user='slave',master_password='123456',master_port=3307,master_log_file='master-log-bin.000001',master_log_pos=154,master_connect_retry=30,master_retry_count=3;

# 进入mysql_slave,开启主从同步
start slave;

# 进入mysql_slave,查看是否开启主从同步
show slave status \G

MySQL-Windows安装

# 拉去MySQL镜像
docker pull mysql:8.0

# 启动MySQL并设置密码
docker run --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0

Redis

Redis单机版安装

配置redis.conf,将redis.conf放置在/root/redis目录下,并修改以下配置

# 87行,解除IP绑定,注释以下代码
bind 127.0.0.1 -::1

# 111行,关闭保护模式允许其他主机访问,修改为no
protected-mode no

# 309行,关闭守护模式,修改为no
daemonize no

# 504行,指定持久化目录
dir /data

拉取镜像,并创建启动容器

# 拉取镜像
docker pull redis:7.0

# 创建容器并启动镜像
docker run --name redis \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
-dp 6379:6379 \
redis:7.0 \
redis-server /etc/redis/redis.conf

Redis集群安装

slave配置,在三台服务器上准备redis.conf,并且修改配置

# 87行,解除IP绑定,注释以下代码
bind 127.0.0.1 -::1

# 111行,关闭保护模式允许其他主机访问,修改为no
protected-mode no

# 309行,关闭守护模式,修改为no
daemonize no

# 504行,指定持久化目录
dir /data

# 最后配置,编写当前redis-slave对外暴露的IP和端口
# slave-announce-ip:宿主机的IP地址
# slave-announce-port:docker redis对外暴露的端口
slave-announce-ip localhost
slave-announce-port 6379
# 启动slave
# --slaveof后面指定master的IP地址和端口号
docker run --name redis \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
-dp 6379:6379 \
redis:7.0 \
redis-server /etc/redis/redis.conf --slaveof localhost 6379

master配置

# 配置redis.conf
# 87行,解除IP绑定,注释以下代码
bind 127.0.0.1 -::1

# 111行,关闭保护模式允许其他主机访问,修改为no
protected-mode no

# 309行,关闭守护模式,修改为no
daemonize no

# 504行,指定持久化目录
dir /data
# 拉取镜像
docker pull redis:7.0

# 创建容器并启动镜像
docker run --name redis \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
-dp 6379:6379 \
redis:7.0 \
redis-server /etc/redis/redis.conf

查看主从关系

docker exec -it redis redis-cli info replication

Nacos

# 拉去Nacos镜像
docker pull nacos/nacos-server:v2.3.2

# 启动Nacos
docker run --env MODE=standalone --name nacos2.3 --restart=always  -d -p 8848:8848 nacos/nacos-server:v2.
3.2

# 查看Nacos启动情况
docker logs -f 容器id

启动成功之后访问:http://127.0.0.1:8848/nacos

SqlServer

# 拉取镜像
docker pull mcr.microsoft.com/mssql/server:2019-latest

# 启动sqlserver容器
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Password" -p 1433:1433 --name sqlserver_container -d mcr.microsoft.com/mssql/server:2019-latest

# 命令解释:
# 1. -e "ACCEPT_EULA=Y":接受 SQL Server 的 EULA(最终用户许可协议)
# 2. -e "SA_PASSWORD=Password":设置 `sa` 用户的密码。注意要设置一个足够强的密码,包含大写字母、小写字母、数字和特殊字符,且长度至少为 8 个字符。
# 3. -p 1433:1433:将容器的 1433 端口映射到宿主机的 1433 端口,这是 SQL Server 的默认端口。
# 4. --name sqlserver_container:为你的容器命名为 sqlserver_container。
# 5. -d:后台运行容器。

Docker Compose

Docker Compose是用于定义和运行多容器Docker应用的工具。它使用YAML文件来配置应用的服务、网络、卷等资源,并通过简单的命令集合来管理这些应用的生命周期。

Docker Compose的安装

Linux通过命令安装Docker Compose

# 下载 Docker Compose
# /usr/local/bin/docker-compose:为docker compose的安装路径
# v2.12.2:为docker compose的版本
curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 为Docker Compose添加执行权限
chmod +x /usr/local/bin/docker-compose

# 测试Docker Compose是否安装成功
docker-compose version

Docker Compose部署项目

  1. 定义Dockerfile
  2. 定义compose.yaml
  3. 将Java项目打包
  4. docker-compose up启动一整套服务

编写Dockerfile文件

/usr/local/docker/demoapp/app目录下编写web项目的Dockerfile文件

FROM openjdk:8u222-jre
WORKDIR /usr/local/apphouse
ADD demo-app-0.0.1-SNAPSHOT.jar .
EXPOSE 8080
CMD ["java", "-jar", "demo-app-0.0.1-SNAPSHOT.jar"]

/usr/local/docker/demoapp/redis目录下编写Redis服务的Dockerfile文件

FROM redis:5.0.14
MAINTAINER chendapeng.cn
COPY redis.conf /usr/local/etc/redis/redis.conf
EXPOSE 6379
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

编写compose.yaml文件

version: '3'
services:
  redis:
    build: ./redis/
    restart: always
  demoapp:
    build: ./app/
    # 定义redis的名称,可以在项目中使用redis访问这个IP地址
    depends_on:
      - redis
    ports:
      - "8080:8080"
    restart: always

启动服务

# 进入/usr/local/docker/demoapp
docker-compose up

Compose文件

Docker Compose 使用 YAML 文件来定义服务。官方推荐的默认文件名为 compose.yml,但同时也支持 docker-compose.yml。

compose 文件中包含 6 个顶级属性:version、services、networks、volumes、configs与secrets,及很多的它们下面所包含的属性。

networks

networks 用于定义和配置容器之间网络连接的属性,允许在多个容器之间创建和管理自定义网络,以实现容器之间的通信和协作。

  • name:指定网络名称。
  • driver:指定网络驱动,缺省驱动为 Bridge。
  • attachable:指定该网络中中的服务是否能够与其他独立容器通信,默认为false。
networks:
    app_bridge:
        name: appBGnet # 这才是网络名称
        driver: bridge

volumes

volumes:用于定义和创建应用中所使用到的所有 volume

services

services:用于定义一个应用中所包含的服务

  • build:用于指定一个 Dockerfile 的路径。而该 Dockerfile 则是用于创建当前服务镜像的。
  • image:用户指定当前服务所需要使用的镜像,这个镜像可以是本地镜像,也可以是远程镜像仓库中的镜像(会自动 pull)。
  • container_name:性用于设置容器名称,但并不是必须的。如果没有设置该属性,容器名称则会采用“合成方式”。而合成时需要用到 services 下的第一级属性。
  • ports:一个列表。前面为暴露出的端口号,后面为容器中应用的端口号。
  • command:用于覆盖 Dockerfile 中的 CMD 指令内容,即启动该服务容器后立即运行的命令。
  • depends_on:一个列表。用于指定当前服务的启动所依赖的应用名称。
  • deploy:用于指定当前服务容器的部署设置。
  • networks:用于指定当前服务容器要连接到的网络。
  • volumes:用于指定当前服务容器所使用到的所有 volume。

Docker Compose常用指令

Docker Compose通过docker-compose系列命令查看和控制compose中的所有服务容器。

  • docker-compose pull:拉取 compose 中服务依赖的全部镜像或指定镜像。通过在命令后添加服务名称来指定。
  • docker-compose config:检查 compose 文件是否正确。可添加选项-q,表示只有存在问题时才有输出。
  • docker-compose up:启动 compose 中的所有容器。-d 选项表示后台启动。
  • docker-compose logs:查看 comopse 中所有服务或指定服务的运行日志。通过在命令后添加服务名称来指定。
  • docker-compose ps:列出 compose 中当前正在运行的所有服务或指定服务。通过在命令后添加服务名称来指定。
  • docker-compose images:列出 compose 中所有服务或指定服务对应的镜像。通过在命令后添加服务名称来指定。
  • docker-compose port:列出指定服务容器的指定端口所映射的宿主机端口。
  • docker-compose run:在指定服务上执行一条命令。
  • docker-compose exec:进入指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose pause:暂停 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose unpause:恢复 compose 中处于暂停状态的所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose stop:停止 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose restart:重启 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose start:启动 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose kill:通过发送 SIGKILL 信号停止指定服务的容器。
  • docker-compose rm:删除 compose 中的、处于停止状态的所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。
  • docker-compose down:停止并删除 compose 中的所有服务容器、网络、镜像、数据卷。