1.为什么是Docker?
- Docker&Docker-Compose实战(Total:32)!-2021-12-19
- 中文文档地址:docker_practice.gitee.io/zh-cn/
- Docker-从入门到实践
- 镜像Image:一个镜像就代表一个软件:mysql镜像、redis镜像…… (镜像只读,不能写)
- 容器Container:一个镜像运行一次就会生成一个容器,容器就是一个运行的软件服务。(容器可读可写)
- 仓库Repository:Docker仓库 用来存储所有软件的镜像位置。(为了使下载镜像的速度快:将默认的远程仓库位置改成阿里云镜像仓库)。本地仓库:用来存储在使用docker过程中的相关镜像(一般存储在:/var/lib/docker)。
1-1.镜像为什么这么大?
- P13:每一个容器都是一个独立的操作系统(精简的Linux操作系统+软件服务)==》镜像运行==》镜像(操作系统库+软件文件)。
- 镜像原理:11:00,采用的UnionFS:联合文件系统维护镜像。
2.Docker安装
2-1.使用yum安装
- docker的卸载
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
- 查看系统内核版本:
uname -r
- 查看系统配置:
cat etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
- 切换用户:
su root
- 下载需要的安装包:
yum install -y yum-utils
- 设置阿里云镜像仓库:
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引:
yum makecache fast
- 安装docker-ce相关的配置:
yum install docker-ce docker-ce-cli containerd.io
- 启动docker:
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
docker -v 查看版本
# 设置开机自启动
systemctl enable docker
- 测试:
docker run hello-world
- 查看下载的这个 hello-world 镜像:
docker images
- 配置阿里云镜像加速器:cr.console.aliyun.com/cn-hangzhou…
- 你可以通过修改daemon配置文件
/etc/docker/daemon.json
来使用加速器 - Junhr的阿里云地址:y6yhp5iu.mirror.aliyuncs.com
- 你可以通过修改daemon配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://y6yhp5iu.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 检查加速器是否生效:
docker info
(registry处的配置必须是阿里云的配置。)
2-2.bash安装(通用所有平台)
- 可以通过--mirror选项使用国内源进行安装。
# 执行下载docker引擎的脚本文件
$ curl -fsSL get.docker.com -o get-docker.sh
# 执行脚本通过脚本下载,设置阿里云镜像加速(sudo代表以管理员的方式执行,可已省略sudo)
$ sudo sh get-docker.sh --mirror Aliyun
# 将docker加入开机自启动的列表
$ sudo systemctl enable docker
# 启动docker服务
$ sudo systemctl start docker
# 创建docker用户组
$ sudo groupadd docker
# 将当前用户加入docker组(-aG表示修改,$USER表示当前用户)
$ sudo usermod -aG docker $USER
# 测试docker安装是否正确
$ docker run hello-world
# 查看docker信息:
$ docker info
# 查看docker引擎的版本
$ docker version
-------------------------
[root@192 ~]# curl -fsSL get.docker.com -o get-docker.sh
[root@192 ~]# ll
总用量 20
-rw-r--r--. 1 root root 18617 12月 21 04:22 get-docker.sh
[root@192 ~]# sh get-docker.sh --mirror Aliyun
[root@192 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@192 ~]# systemctl start docker
[root@192 ~]# sudo groupadd docker
groupadd:“docker”组已存在
[root@192 ~]# sudo usermod -aG docker $USER
[root@192 ~]# docker info
2-3.测试 Docker 是否安装正确
$ docker run hello-world
- run 做了什么
3.基础命令
docker version #查看docker的客户端和服务端版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令(可查看可选的参数)
docker COMMAND --help 比如:docker images --help
# 帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
4.镜像命令
4-1.查看本地主机的所有镜像:docker images
- 只显示mysql相关的镜像:
docker images mysql
[root@junhrCentos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数OPTIONS说明
-a/--all 列出本地所有的镜像(含中间映像层)
-q/--quiet 只显示镜像的id
--digests:显示镜像的摘要信息
--no-trunc:显示完整的镜像信息
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
4-2.搜索镜像:docker search
docker search 镜像名字
从 hub.docker.com 中查询镜像
[root@junhrCentos7 ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3819 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK]
percona Percona Server is a fork of the MySQL relati… 517 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 86
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 搜索收藏数大于3000的镜像
[root@junhrCentos7 ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK]
OPTIONS说明
- --no-trunc:显示完整的镜像描述
- --filter=start=30:列出收藏数不小于指定值的镜像。如:
docker search mysql --filter=STARS=3000
- 搜索时带上版本号:
docker search mysql:5.7.0
4-3.下载镜像:docker pull
docker pull 镜像名字:latest
默认拉取最新的镜像;docker pull 镜像名字[:TAG]
拉取指定版本的镜像,如果不写tag默认就是latest- 指定版本下载:
docker pull mysql:5.7
4-4.删除镜像:docker rmi
-
删除单个镜像:
docker image rm 镜像名(name:tag)
或docker image rm 镜像id
;或 简写:docker rmi -f 镜像ID
,比如删除:docker image rm tomcat:8.0
- 如果出现:Error response from daemon : conflict: unable to delete bf……:可使用
-f
:强制删除,如:docker image rm -f 镜像名(name:tag)|镜像id
- 如果出现:Error response from daemon : conflict: unable to delete bf……:可使用
-
删除多个:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
docker rmi -f 镜像id 镜像id 镜像id
,比如删除tomcat相关的所有镜像:docker image rm -f $(docker images tomcat -q)
-
删除全部:
docker rmi -f $(docker images -aq)
5.容器命令
- Docker 的容器包含的是运行环境,可以说是一个精简版的 Linux
- 有了镜像才能创建容器,这是根本前提 ( 下载一个CentOS镜像演示 ):
docker pull centos
5-1.新建容器并启动: docker run [OPTIONS] image [COMMAND] [ARG...]
1)P9-13:46,简单运行tomcat软件服务docker run tomcat:8.0|(镜像id)
后,关闭Linux防火墙,在浏览器中试图访问8080端口http://192.168.200.130:8080/
,依然无法访问,原因是docker的容器是操作系统的隔离(docker run tomcat只是在docker自己的系统内部开放了一个8080端口,而宿主机centos7上并没有8080端口。解决:将docker中的8080端口映射到宿主机上,让容器与宿主机建立联系
)。
OPTIONS 说明
--name="容器新名字"
: 为容器指定一个名字,比如:tomcat01,tomcat02,用来区分容器;- 如果没有指定,会自动默认生成一个名字。通过
docker ps
命令可以查看。
- 如果没有指定,会自动默认生成一个名字。通过
-d
:后台运行容器,并返回容器ID,也即启动守护式容器;如后台启动Tomcat服务:docker run -p 8081:8080 -d tomcat:8.0
-it
:使用交互方式运行,进入容器查看内容,如:==docker run -it centos /bin/bash
==-i
:以交互模式运行容器,通常与 -t 同时使用;-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用;- 如:==
docker exec -it dce7b87171bf /bin/bash
==
- ①
-P
:指定容器端口;如:docker run -p 8080:8080 tomcat:8.0-jre8
有以下四种格式:【-p 可以书写多个】-p ip:主机端口:容器端口
(ip:hostPort:containerPort) 配置主机端口映射到容器端口-p 主机端口:容器端口
(hostPort:containerPort) 【常用】-p 容器端口
(cntainerPort)- ip::containerPort
- ②
-P
随机指定端口(大写的P)
☆测试:启动并进入容器
- 以这种方式启动不需要关闭防火墙:
docker run -d -p(建立映射关系) 8080(宿主机端口):8080(容器内服务端口) --name tomcat01 tomcat:8.0
[root@junhrCentos7 ~]# docker run -it centos /bin/bash
[root@cd1b8932c537 /]# ls #查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
停止&重启&暂停&恢复&退出容器
docker stop|start|restart|pause|unpause 容器id|容器名称
exit
容器直接停止并退出Ctrl+P+Q
不停止容器退出
[root@cd1b8932c537 /]# exit #从容器中退回主机(后台方式运行则仅退出)
exit
[root@junhrCentos7 ~]# ls
bin dev home lib64 media opt proc run share sys usr boot etc lib root sbin srp tmp var
5-2.列出当前所有正在运行的容器:docker ps [OPTIONS]
OPTIONS 说明
- OPTIONS可选可不选
docker ps -a
:列出当前所有正在运行的容器 + 历史上运行过的容器-n=数字
:显示最近n个创建的容器。如:docker ps -a -n=1
-q
:静默模式,只显示容器编号。-l
:显示最近创建的容器。--no-trunc
:不截断输出。
杀死容器
- 强制停止当前容器:
docker kill 容器id\容器名name
删除容器
- 删除已经停止的容器:
docker rm 容器id|name
- 删除正在运行的容器(强制删除):
docker rm -f tomcat01
删除所有的容器:docker rm -f $(docker ps -qa)
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,
#如果想强制删除应该使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
5-3.常用其他命令(重点)
3-1)启动守护式容器(后台启动容器):docker run -d 容器名
# 使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
# 问题:使用docker ps -a 进行查看, 会发现centos容器已经退出
# 常见的坑: Docker容器使用后台运行,就必须要有一个前台进程,如果docker发现没有应用,就会自动停止
## 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如
service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
- 之前的启动都是后台,停止了容器之后,容器还是可以查得到。官方使用:==
docker run -it --rm tomcat:9.0
== 一般用来测试,用完就删除。
3-2)查看容器日志:docker logs -f -t --tail 3 容器ID
-f
:跟随最新的日志打印-t
:加入时间戳(Linux知识点:查看Linux系统时间:[root@192 ~]# date)--tail 数字
:显示最后多少条
# 自己编写一段脚本
"while true;do echo hello Junhr;sleep 3;done"
# 先运行容器
[root@junhrCentos7 ~]# docker run -d centos /bin/sh -c "while true;do echo hello Junhr;sleep 3;done"
# 再查看这个容器运行产生的日志
[root@junhrCentos7 ~]# docker logs -ft --tail 3 容器ID
3-3)查看容器内运行的进程:docker top 容器ID|name
3-4)查看镜像的元数据(查看容器内部细节):docker inspect 容器ID|name
3-5)进入正在运行的容器并以命令行交互
- 通常容器都是使用后台方式运行的,如果需要进入容器,修改一些配置,使用命令行
- 【常用】
docker exec -it 容器ID 命令
在指定容器中运行指定的命令(进入容器后开启一个新的终端,可以在里面操作)docker exec -it(交互模式) 容器ID|name bash
进入指定容器 ,并与容器内命令终端进行交互;- [root@localhost ~]# docker exec -it 5b3cxa6ffb38b bash
- root@5b3cxa6ffb38b:/usr/local/tomcat# ls
- LICENSE bin include logs temp webapps conf lib
- 退出容器:
exit
docker attach 容器ID
执行的终端,不会启动新的进程)
3-6)从容器内拷贝文件到宿主机上:docker cp 容器ID:容器内路径 目的主机路径
- 从容器复制文件到操作系统:docker cp 容器唯一标识(id,name):容器内资源路径 操作文件路径/文件目录
docker cp 5b4ca5ffb38b:usr/local/tomcat/RUNNING.txt ./RUNNING.txt
- 从操作系统复制文件到容器内部:docker cp 文件|目录名| 容器唯一标识(id,name):/容器内资源路径
docker cp /root/test.war tomcat01:/usr/local/tomcat/webapps
- 如何部署一个web项目(war包项目):P10-41:00,将war包上传到容器中。
- 拷贝是一个手动过程,未来我们使用
-v
卷的技术,可以实现自动同步。
6.容器数据卷机制
- 数据卷(Data Volume),用来实现容器中数据和宿主机中数据进行映射的(同步的)P11-12:20
6-1.使用绝对路径的方式设置数据卷
- 数据卷的使用必须在容器首次启动时设置,比如:
docker run -d -p 8081:8080 --name tomcat01 -v /root/apps(宿主机绝对路径):/usr/local/tomcat/webapps(容器绝对路径) tomcat:8.0
【注意】这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主。如果在设置数据卷时在容器内路径后面加上:ro
,代表日后容器内路径是只读的(readonly,即容器内路径的类容改变不会影响到宿主机。P11-35:00)
6-2.使用别名的方式设置数据卷
- 使用别名的方式保留容器内路径的原始类容,前提是别名对应路径里不能存在内容。
docker run -d -p 8082:8080 --name tomcat02 -v aaaa(别名):/usr/local/tomcat/webapps tomcat:8.0
,aaaa代表docker数据卷中别名,这个别名如果存在docker直接使用,aaaa不存在,则自动创建。进入容器查看容器内的类容是否继续存在:docker exec -it tomcat02 bash
,退出容器:exit
- 在宿主机上查看别名为aaaa的数据卷在哪?
find / -name aaaa
。发现docker根据别名创建的数据卷被放在:/var/lib/docker/volumes/
7.Docker镜像分层原理
- 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
- 镜像为什么这么大?原因:一个软件镜像不仅仅是软件包,它还包含软件包所需的操作系统依赖,软件自身依赖以及自身软件包组成。
- 为什么docker镜像采用分层镜像原理?(P11)
- 每一个镜像都是由 n 个镜像共同组成的。(UnionFS:联合文件系统)最大的好处就是资源共享,从而减小docker仓库整体体积。
- 比如:有多个镜像都是从相同的base镜像构建而来的,name宿主机只需在磁盘中保存一份base镜像。同时内存中 也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
8.Docker中网络通信机制&以及网桥的使用
- (P12)
- docker 网络使用:一般在使用docker网桥(bridge)实现容器与容器通信时,都是站在一个应用角度进行容器通信的。
- 查看docker网桥配置:
docker network ls
- 查看网桥相关的命令:
docker network
- 创建自定义网桥:完整写法:
docker create -d birdge ems(网桥)
简写:docker create ems(网桥名称)
- 启动容器时指定网桥:比如:
docker run -d -p 8081:8080 --network ems --name tomcat01 tomcat:8.0-jre8
- 注意:使用
docker run 指定--network 网桥时网桥必须存在
- 注意:使用
- 删除网桥:
docker network rm 网桥名称
- 查看网桥详细:
docker inspect ems
8-1.将容器打包成一个新的镜像
docker commit
提交容器副本使之成为一个新的镜像docker commit -m="提交的描述信息" -a="作者信息" 容器ID|name 要创建的目标镜像名:[标签名]
比如:docker commit -m "deploy HelloDocker project in webapps"(描述信息) -a "junhr"(作者信息) tomcat01 tomcat-HelloDocker(镜像名):8.0(版本信息)
8-2.案例演示
- 从 DockerHub 上下载 Tomcat 镜像到本地并成功运行。
docker run -it -p 8888:8080 tomcat
创建并启动 Tomcat 容器,并指定端口号;当我们访问虚拟机中的 8888 端口会关联到 Docker 的 8080 端口
虽然是 404页面,但是看下面的 Apache Tomcat,我们访问虚拟机的 8888 端口进入到了 Docker 的 8080 端口;Docker 最新的 Tomcat 将欢迎页放在了 webapps.dist 目录下了。
docker exec -it 容器ID /bin/bash
进入 Tomcat 容器cp -r webapps.dist/* webapps/
将欢迎页拷贝到 webapps 目录下 再次访问 Tomcat- 也即当前的 Tomcat 运行实例是一个欢迎页的容器,以它为模板 commit 一个 Tomcat 新镜像 hong/tomcat
docker commit -a="hong" -m="tomcat has welcome" b752012cba57 hong/tomcat:1.2
docker run -itp 8848:8080 hong/tomcat:1.2
创建新镜像的容器实例并访问这个新的 Tomcat容器。
8-3.打包镜像和载入镜像
- 备份镜像:docker save 镜像名:Tag -o (镜像名-tag).tar,比如:
docker save tomcat:8.0 -o /root/tomcat-8.0.tar
- 恢复镜像:docker load -i 名称.tar ,比如:
docker load -i tomcat-8.0.tar
9.Docker安装常用服务
9-1.docker的核心架构
练习安装tomcat:
- 下载再启动:
docker pull tomcat
- 启动运行:
docker run -d -p 3355:8080 --name tomcat01 tomcat
- 测试访问:在浏览器地址栏访问8080
- 进入容器:[root@junhrCentos7 home]#
docker exec -it tomcat01 /bin/bash
- 发现问题:1、Linux命令少了。2、没有webapps。阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除。保证最小的可运行环境。
- 思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,自动同步到内部就好了。
9-2.安装MySQL服务
利用数据卷的形式备份数据
- 下载:
docker pull mysql:5.6
- 启动mysql:开放端口映射(3306),指定root用户的密码,
-e
表示environment;--restart=always
总是运行(即docker重启后,之前运行的容器依然运行),比如:docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hrj --name mysql01 --restart=always mysql:5.6
- mysql数据库的数据存储在:
/var/lib/mysql
,使用数据卷永久的持久化数据到宿主机:docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=hrj -v /root/mysqlData:/var/lib/mysql --restart=always --name mysql02 mysql:5.6
利用SQL文件的形式备份数据
- P16-6:21,在使用mysql容器时数据卷虽然能备份数据,但
数据卷是将数据库底层文件系统进行的备份
,日后一旦更换Linux服务器,或者另一个容器选择的是其他版本的数据库,那么通过数据卷备份的数据将不能够使用,总得来说就是此种方式不利于数据的迁移。 - 解决办法是利用SQL文件的形式备份数据。①备份全部数据:比如
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
,②备份指定库中的数据:docker exec mysql容器id sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/库名-databases.sql
,③只备份指定库中的结构不要数据:docker exec mysql容器id sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/库名-databases.sql
9-3.安装Redis服务
- 下载redis:
docker pull redis:5.0.14
- 运行redis:
docker run -d -p 6379:6379 redis:5.0.14
,以交互的方式进入redis容器:docker exec -it redis的id bash
,进来之后在root@6283e049da0a:/data#
目录,通过redis的客户端连接到redis:redis-cli
,连接之后为:127.0.0.1:6379>
,说明redis-cli脚本配置了容器内的环境变量(P17-9:35)。
root@6283e049da0a:/data# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379>
- 测试看外部工具(RedisDesktopManager)能否连接到容器内的redis。
- 更完整的启动redis(指定名称--name,总是启动:--restart=always,后台启动:-d):
docker run -p 6379:6379 -d --name redis01 --restart=always redis:5.0.14
redis支持内存数据持久化(rdb&aof)
- RDB持久化:快照Redis服务器将某一时刻数据以快照文件的形式写入到磁盘。
- AOF持久化:redis服务器将所有redis客户端的写操作以命令方式记录到日志文件中。(更加安全)【P17-34:00,redis-server --appendonly yes】
docker run --name redis02 -d -p 6379:6379 --restart=always redis:5.0.14 redis-server --appendonly yes
【注意】只要开启了持久化,就会将持久化的文件生成到容器中的/data/
目录中。
[root@192 ~]# docker rm -f $(docker ps -qa)
[root@192 ~]# docker ps -a
[root@192 ~]# docker run --name redis01 -d -p 6379:6379 --restart=always redis:5.0.14 redis-server --appendonly yes
f035dda4536080cfc25c788b79bcba9704a366d57839538d9b7bc4c374bf5762
[root@192 ~]# docker exec -it f035dda bash
root@f035dda45360:/data# ls
appendonly.aof
root@f035dda45360:/data# cat appendonly.aof
root@f035dda45360:/data# redis-cli
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> set age 21
OK
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> exit
root@f035dda45360:/data# ls
appendonly.aof
root@f035dda45360:/data# cat appendonly.aof
*2 $6 SELECT $1 0 *3 $3 set $4 name $4 lisi *3 $3 set $3 age $2 21
root@f035dda45360:/data#
- 虽然已经开启了持久化,但是数据还是只保存在redis容器中。如果将容器删除了,数据也就丢失。
映射数据到外部宿主机
- 删除容器后,数据依然存在于宿主机上:
docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisData:/data redis:5.0.14 redis-server --appendonly yes
[root@192 ~]# docker rm -f 87c4e
87c4e
[root@192 ~]# docker ps -a
[root@192 ~]# ls
redisData tomcat-8.0.tar
[root@192 ~]# cd redisData/
[root@192 redisData]# ls
appendonly.aof
[root@192 redisData]# cat appendonly.aof
*2 $6 SELECT $1 0 *3 $3 SET $4 name $8 zhangsan
[root@192 redisData]#
如何自定义配置文件启动redis
- 如何获取redis配置文件
- 第一种方式:下载对应版本找到配置文件,进行修改。P17-42:42。使用完整配置文件启动。
- 将修改好的redis.conf文件上传到Linux宿主机指定目录:/root/redisConf/redis.conf。
- 数据卷挂在配置启动:
docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisConf:/data redis:5.0.14 redis-server /data/redis.conf
,上传的文件redis.conf中有一个bind 127.0.0.1表示默认这个服务只能本机启动(redis容器)P17-49:45。所以这里要修改(其实上传前就应该要修改。)修改为:bind 0.0.0.0
表示开启远程访问。
[root@192 ~]# ls
redis.conf redisData tomcat-8.0.tar
[root@192 ~]# mdkir redisConf
-bash: mdkir: 未找到命令
[root@192 ~]# mkdir redisConf
[root@192 ~]# mv redis.conf redisConf/
[root@192 ~]# ls redisConf/
redis.conf
[root@192 ~]# docker rm -f $(docker ps -aq)
bd2473e36071
[root@192 ~]# docker run --name redis01 -d -p 6379:6379 --restart=always -v /root/redisConf:/data redis:5.0.14 redis-server /data/redis.conf
55bc321f8e741acc046ad756ed552e14839f4a6040c55c66935e9c2c63c9065a
[root@192 ~]# docker exec -it 55bc bash
root@55bc321f8e74:/data# ls
appendonly.aof redis.conf
root@55bc321f8e74:/data# exit
exit
[root@192 ~]# cd redisConf/
[root@192 redisConf]# vi redis.conf
# 可以搜索:/bind
# 修改为:bind 0.0.0.0 表示开启远程访问
# 修改完后,重启容器
[root@192 redisConf]# docker restart 55b
# 此时再用redisDM软件连接,发现可以正常连接。
- 第二种方式:创建指定文件名称直接书写修改属性即可。【推荐】自己新建一个redis.conf文件,在里面写入:
appendonly yes 和 appendfilename "appendonly.aof 或者写成 aa.aof"
然后再上传。启动方式和第一种一样。
9-4.安装Nginx服务
- 下载Nginx镜像:
docker pull nginx:1.19.10
- 运行Nginx:
docker run --name nginx01 --restart=always -d -p 80(宿主机端口):80 nginx:1.19.10
,然后可以在浏览器访问:192.168.200.130:80,可看到Nginx的欢迎页面。 - 进入容器:
docker exec -it nginx01 bash
,可以搜索find / -name index.html
Nginx默认的欢迎页面的位置为:/usr/share/nginx/html/
,可以改变欢迎页面的类容(前提是切换到index.html文件的位置)如:echo "I Love Nginx!" > index.html
1)实现反向代理,负载均衡
- 开发中用到的Nginx反向代理功能,去实现后端服务器的负载均衡。搜索
find / -name nginx.conf
原始容器内的Nginx配置文件位置:/etc/nginx/nginx.conf
,加载指定的Nginx配置启动。启动之前先拷贝nginx.conf配置文件(不用像redis第一种方式一样去官网下载):docker cp 容器id:/etc/nginx/nginx.conf /root/nginxConfig
,修改配置文件P18-21:17:vi nginx.conf
让其支持负载均衡。
配置nginx.conf配置文件
a.加入如下配置: (upstream后面的名字随意取,在{}写Nginx需要管理的所有节点)
upstream nacos-servers {
server 192.168.200.130:8845;
server 192.168.200.130:8846;
server 192.168.200.130:8847;
}
b.为了再输入http://192.168.200.130:80时,不再希望Nginx主页处理,而是转发到nacos-server中的某个节点如8845处理。P63-10:26
location / {
proxy_pass http://nacos-servers/;
}
- 拷贝并配置完成后启动如:
docker run --name nginx01 -v /root/nginxConfig/nginx.conf:/etc/nginx/nginx.conf --restart=always -d -p 80:80 nginx:1.19.10
2)nginx实现服务器的功能
- nginx作为服务器,给请求以响应。P18-25:27.此时作为服务器就不能加载配置文件启动了。先进入容器后找到nginx的家目录:
find / -name index.html
。然后再启动:docker run --name nginx01 -v /root/html:/usr/share/nginx/html --restart=always -d -p 80:80 nginx:1.19.10
。在目录:/root/html
下创建一个index.html:touch index.html
然后:vi index.html在里面写上:<h1>I Love Nginx!</h1>
。在浏览器中访问:192.168.200.130:80
就可以看到修改后的欢迎页面。
9-5.安装ElasticSearch服务
10.Dockerfile
- 作用:Dockerfile用来帮助我们构建自己的镜像。我们日后希望基于自己公司不同项目定制不同镜像,方便部署维护。
- Dockerfile所在的目录称为上下文目录。Dockerfile构建镜像的原理:P21-23:51,。
10-1.Dockerfile基本语法
- 基于centos定制自己的镜像:①首先下载centos镜像:
docker pull centos:7
,②选择一个Dockerfile的目录:先创建一个存放Dockerfile目录的目录:mkdir dockerfile
,然后在里面创建:touch Dockerfile
,安装vim:yum install -y vim
,③用vim编辑Dockerfile:④构建Dockerfile(P22-13:20):docker build -t(代表后面指定镜像的名称) centos7:01(代表第一个版本).(后面跟一个Dockerfile的目录)
,运行时进入centos:docker run -it(运行时进入) centos7:01
。⑤如果构建的是像tomcat一类的镜像的话,还需要向外暴露端口号(如果没有显示指定则默认暴露的是tcp协议的端口):EXPOSE 8080/tcp,可以向外暴露多个端口
,暴露之后,才能通过宿主机的端口号映射容器的端口:docker run -p 8080:8080 tomcat01
[root@192 ~]# touch Dockerfile
[root@192 ~]# ls
Dockerfile redisConf redisData tomcat-8.0.tar
[root@192 ~]# mkdir dockerfile
[root@192 ~]# mv Dockerfile dockerfile/
[root@192 ~]# yum install -y vim
[root@192 ~]# cd dockerfile/
[root@192 dockerfile]# ls
Dockerfile
[root@192 dockerfile]# vim Dockerfile
# 希望自己构建的镜像里面带有vim功能:可以在里面添加:RUN yum install -y vim,让其自带wget功能:RUN yum install -y wget
FROM centos:7
RUN yum install -y vim
RUN yum install -y wget
# RUN ["yum","install","-y","wget","vim"]
EXPOSE 8080
WORKDIR /data
11.高级网络
11-1.容器间通信
- 容器之间通过网络进行相互通信。Docker高级网络配置
11-2.docker中网桥类型
- 查看网桥:
docker network ls
12.docker-compose
- docker-compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
12-1.安装与卸载
- Linux上在线安装,下载docker-compose脚本,并放入到/usr/local/bin文件中:
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
下载后赋予其执行权限:sudo chmod +x /usr/local/bin/docker-compose
- 测试是否安装成功:
$ docker-compose --version
- bash命令补全:
curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
- 卸载:(如果是二进制包方式安装的,删除二进制文件即可。)
rm -rf /usr/local/bin/docker-compose
[root@192 ~]# ll
总用量 382420
-rw-r--r--. 1 root root 24653824 12月 22 16:30 docker-compose-linux-x86_64
drwxr-xr-x. 2 root root 24 12月 22 15:21 dockerfile
drwxr-xr-x. 2 polkitd root 62 12月 22 01:48 redisConf
drwxr-xr-x. 2 polkitd root 28 12月 22 01:05 redisData
-rw-------. 1 root root 366943744 12月 21 16:25 tomcat-8.0.tar
[root@192 ~]# mv docker-compose-linux-x86_64 docker-compose
[root@192 ~]# mv docker-compose /usr/local/bin/
[root@192 ~]# chmod +x /usr/local/bin/docker-compose
[root@192 ~]# docker-compose -v
Docker Compose version v2.2.2
12-2.第一个docker-compose案例
- 创建一个项目:
mkdir /root/ems
- 在ems目录下创建一个docker-compose.yml模板文件(P29-30:00)
touch docker-compose.yml
# yaml 配置实例
# 代表使用docker-compose项目的版本号
#container_name相当于docker run --name参数(docker-compose中推荐使用默认名称
version: '3.8'
services:
tomcat:
container_name: tomcat01
image: tomcat:8.0
ports:
- "8080:8080"
# 如果要启动两个tomcat,只需要再次定义就行了
tomcat01:
image: tomcat:8.0
ports:
- "8081:8080"
# 启动redis服务
redis:
image: redis:5.0.14
ports:
- "6379:6379"
# 启动mysql服务
mysql:
image: mysql:5.6
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=hrj"
volumes: #代表给当前容器和宿主机指定数据卷,类似于docker run -v
#- /root/mysqlData1:/var/lib/mysql
# 注意:1.使用绝对路径时要求必须先创建才能使用。
# 2.利用数据卷别名的方式创建,但是这种方式要提前声明别名
- mysqlData:/var/lib/mysql
volumes
mysqlData: #声明数据卷别名
- 启动docker-compose一组服务(指定这个命令必须在docker-compose.yml配置文件目录):
docker-compose up -d(以后台的方式启动)
- 查看数据卷:
docker volume ls
,使用数据卷别名的方式创建的mysql服务,其数据卷的名字是:项目名_数据卷别名
,比如:ems_mysqlData
,进入数据卷查看详细信息:`docker inspect ems_mysqlData - docker-compose服务:
docker-compose down
12-3.在IDEA中编辑docker-compose模板文件
- 先创立远程连接(RemoteHost),然后在root目录中创建一个项目文件夹:ems,在ems中创建docker-compose.yml文件。然后通过IDEA快速编写配置。
12-4.docker-compose.yml中的模板命令
- docker-compose模板文件
- P30-22:00,。
12-5.docker-compose相关的命令
13.Portainer可视化工具
- 官方安装说明
- 作用:能展示docker引擎上所运行的所有容器,对它们进行一个监控。
[root@192 ~]# docker pull portainer/portainer
[root@192 ~]# docker volume create portainer_data
portainer_data
[root@192 ~]# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data portainer/portainer
- 启动完成之后,可以访问端口:
192.168.200.130:9000
,创建用户名:admin,和密码:hrjxxx 。登录后:P32-11:00,选择本地(Local)的docker