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版本分类
Docker版本分为大版本和小版本
- 大版本:Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。
- 小版本:从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。
Docker的安装
Linux下安装Docker
Linux下安装Docker
- 安装yun-utils:
yum install -y yum-utils - 添加Docker下载仓库:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 安装Docker:
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - 启动Docker服务:
systemctl start docker - 验证是否安装成功:
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的卸载
- 卸载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
- 删除镜像容器等存储的目录
# 删除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.exe:hub.docker.com/editions/co…
运行Docker Desktop Installer.exe 文件
安装完成后点击 Close and restart 重启电脑
配置阿里云镜像加速
获取阿里云镜像加速地址:account.aliyun.com/login/login…
复制加速地址,并修改到registry-mirrors中
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false
}
Docker测试安装成功
docker version
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容器相关指令
容器创建并启动
# 语法
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 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项目
- 将Java项目打包JAR后上传到服务器
- 编写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
- 构建镜像
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部署项目
- 定义Dockerfile
- 定义compose.yaml
- 将Java项目打包
- 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 中的所有服务容器、网络、镜像、数据卷。