Docker入门

153 阅读6分钟

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)。 Docker的核心架构图.png

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
  1. 查看系统内核版本:uname -r
  2. 查看系统配置: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
  1. 下载需要的安装包:yum install -y yum-utils
  2. 设置阿里云镜像仓库:
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  1. 更新yum软件包索引:yum makecache fast
  2. 安装docker-ce相关的配置: yum install docker-ce docker-ce-cli containerd.io
  3. 启动docker:
systemctl start docker
# 查看当前版本号,是否启动成功
docker version 
docker -v 查看版本
# 设置开机自启动
systemctl enable docker
  1. 测试:docker run hello-world
  2. 查看下载的这个 hello-world 镜像:docker images
  3. 配置阿里云镜像加速器:cr.console.aliyun.com/cn-hangzhou…
    1. 你可以通过修改daemon配置文件 /etc/docker/daemon.json 来使用加速器
    2. Junhr的阿里云地址:y6yhp5iu.mirror.aliyuncs.com
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
  1. 检查加速器是否生效: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 做了什么 截图_20215721125751.png

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

[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
  • 删除多个: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.常用其他命令(重点)

容器基本操作.png

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:容器内路径 目的主机路径

  1. 从容器复制文件到操作系统:docker cp 容器唯一标识(id,name):容器内资源路径 操作文件路径/文件目录
    1. docker cp 5b4ca5ffb38b:usr/local/tomcat/RUNNING.txt ./RUNNING.txt
  2. 从操作系统复制文件到容器内部:docker cp 文件|目录名| 容器唯一标识(id,name):/容器内资源路径
    1. docker cp /root/test.war tomcat01:/usr/local/tomcat/webapps
  3. 如何部署一个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镜像分层原理

  1. 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  2. 镜像为什么这么大?原因:一个软件镜像不仅仅是软件包,它还包含软件包所需的操作系统依赖,软件自身依赖以及自身软件包组成。
  3. 为什么docker镜像采用分层镜像原理?(P11)
    1. 每一个镜像都是由 n 个镜像共同组成的。(UnionFS:联合文件系统)最大的好处就是资源共享,从而减小docker仓库整体体积。
    2. 比如:有多个镜像都是从相同的base镜像构建而来的,name宿主机只需在磁盘中保存一份base镜像。同时内存中 也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

8.Docker中网络通信机制&以及网桥的使用

  • (P12)
  1. docker 网络使用:一般在使用docker网桥(bridge)实现容器与容器通信时,都是站在一个应用角度进行容器通信的。
  2. 查看docker网桥配置:docker network ls
  3. 查看网桥相关的命令:docker network
  4. 创建自定义网桥:完整写法:docker create -d birdge ems(网桥) 简写:docker create ems(网桥名称)
  5. 启动容器时指定网桥:比如:docker run -d -p 8081:8080 --network ems --name tomcat01 tomcat:8.0-jre8
    1. 注意:使用 docker run 指定--network 网桥时网桥必须存在
  6. 删除网桥:docker network rm 网桥名称
  7. 查看网桥详细: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.案例演示

  1. 从 DockerHub 上下载 Tomcat 镜像到本地并成功运行。
  • docker run -it -p 8888:8080 tomcat 创建并启动 Tomcat 容器,并指定端口号;当我们访问虚拟机中的 8888 端口会关联到 Docker 的 8080 端口

虽然是 404页面,但是看下面的 Apache Tomcat,我们访问虚拟机的 8888 端口进入到了 Docker 的 8080 端口;Docker 最新的 Tomcat 将欢迎页放在了 webapps.dist 目录下了。

  1. docker exec -it 容器ID /bin/bash 进入 Tomcat 容器
  2. cp -r webapps.dist/* webapps/ 将欢迎页拷贝到 webapps 目录下 再次访问 Tomcat
  3. 也即当前的 Tomcat 运行实例是一个欢迎页的容器,以它为模板 commit 一个 Tomcat 新镜像 hong/tomcat docker commit -a="hong" -m="tomcat has welcome" b752012cba57 hong/tomcat:1.2
  4. 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文件的形式备份数据

截图_20210021090021.png

  • 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)

  1. RDB持久化:快照Redis服务器将某一时刻数据以快照文件的形式写入到磁盘。
  2. 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配置文件
  1. 第一种方式:下载对应版本找到配置文件,进行修改。P17-42:42。使用完整配置文件启动截图_20212022012024.png
  • 将修改好的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软件连接,发现可以正常连接。
  1. 第二种方式:创建指定文件名称直接书写修改属性即可。【推荐】自己新建一个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.htmlNginx默认的欢迎页面的位置为:/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,。 dockerFile解析过程.png

10-1.Dockerfile基本语法

dockerFile的保留命令.png

  • 基于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.容器间通信

11-2.docker中网桥类型

  • 查看网桥:docker network ls

12.docker-compose

现有docker-compose存在的问题.png

  • 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案例

  1. 创建一个项目:mkdir /root/ems
  2. 在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: #声明数据卷别名
  1. 启动docker-compose一组服务(指定这个命令必须在docker-compose.yml配置文件目录):docker-compose up -d(以后台的方式启动)
  2. 查看数据卷:docker volume ls,使用数据卷别名的方式创建的mysql服务,其数据卷的名字是:项目名_数据卷别名,比如:ems_mysqlData,进入数据卷查看详细信息:`docker inspect ems_mysqlData
  3. docker-compose服务:docker-compose down

12-3.在IDEA中编辑docker-compose模板文件

  • 先创立远程连接(RemoteHost),然后在root目录中创建一个项目文件夹:ems,在ems中创建docker-compose.yml文件。然后通过IDEA快速编写配置。

12-4.docker-compose.yml中的模板命令

12-5.docker-compose相关的命令

截图_20213222083258.png

13.Portainer可视化工具

  • 官方安装说明
  • 作用:能展示docker引擎上所运行的所有容器,对它们进行一个监控。 截图_20210222030248.png
[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 截图_20211322031310.png